From e2162f8baea027f0730d4e5041943b8adab914c1 Mon Sep 17 00:00:00 2001 From: Dominik Muhs Date: Fri, 12 Feb 2021 14:05:05 +0100 Subject: [PATCH 01/41] Add basic projects support --- .github/workflows/main.yml | 49 ++++++++ Makefile | 2 +- mythx_cli/analysis/list.py | 2 +- mythx_cli/analysis/report.py | 7 +- mythx_cli/analysis/status.py | 2 +- mythx_cli/analyze/command.py | 10 +- mythx_cli/cli.py | 20 ++++ mythx_cli/formatter/base.py | 2 +- mythx_cli/formatter/json.py | 33 +++-- mythx_cli/formatter/simple_stdout.py | 40 +++++-- mythx_cli/formatter/tabular.py | 73 +++++++---- mythx_cli/formatter/util.py | 20 ++-- mythx_cli/group/close.py | 4 +- mythx_cli/group/list.py | 2 +- mythx_cli/group/open.py | 4 +- mythx_cli/project/__init__.py | 1 + mythx_cli/project/delete.py | 1 + mythx_cli/project/details.py | 1 + mythx_cli/project/list.py | 52 ++++++++ mythx_cli/project/open.py | 1 + mythx_cli/render/command.py | 10 +- mythx_cli/render/util.py | 8 +- mythx_cli/util.py | 140 ++++++++++++++++++++-- requirements.txt | 2 +- requirements_dev.txt | 18 +-- tests/common.py | 8 +- tests/conftest.py | 3 + tests/test_analyze_solidity.py | 4 +- tests/test_analyze_truffle.py | 8 +- tests/test_list.py | 8 +- tests/test_renderer.py | 7 +- tests/test_report.py | 26 ++-- tests/test_report_filter.py | 9 +- tests/test_status.py | 8 +- tests/test_version.py | 4 +- tests/testdata/analysis-list-simple.txt | 10 +- tests/testdata/analysis-list-table.txt | 22 ++-- tests/testdata/analysis-status-simple.txt | 2 +- tests/testdata/analysis-status-table.txt | 64 +++++----- tests/testdata/group-list-response.json | 8 +- tests/testdata/group-list-simple.txt | 10 +- tests/testdata/group-list-table.txt | 10 +- tests/testdata/group-status-response.json | 2 +- tests/testdata/group-status-simple.txt | 2 +- tests/testdata/group-status-table.txt | 2 +- tests/testdata/version-table.txt | 8 +- tox.ini | 8 +- 47 files changed, 520 insertions(+), 217 deletions(-) create mode 100644 .github/workflows/main.yml create mode 100644 mythx_cli/project/__init__.py create mode 100644 mythx_cli/project/delete.py create mode 100644 mythx_cli/project/details.py create mode 100644 mythx_cli/project/list.py create mode 100644 mythx_cli/project/open.py diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 0000000..8e14639 --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,49 @@ +name: MythX CLI + +on: [push, pull_request] + +jobs: + test: + runs-on: ubuntu-latest + strategy: + matrix: + python-version: [3.6, 3.7, 3.8, pypy3] + + steps: + - uses: actions/checkout@v2 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + - name: Install Python dependencies + uses: py-actions/py-dependency-install@v2 + with: + path: "requirements_dev.txt" + - name: Setup tox for GH actions + run: pip install tox-gh-actions + - name: Test with tox + run: make test + - name: Upload to Coveralls + run: coveralls + env: + COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }} + + deploy: + if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags') + needs: test + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up Python + uses: actions/setup-python@v2 + with: + python-version: "3.7" + - name: Install Python dependencies + uses: py-actions/py-dependency-install@v2 + with: + path: "requirements_dev.txt" + - name: Build and publish + env: + TWINE_USERNAME: ${{ secrets.PYPI_USERNAME }} + TWINE_PASSWORD: ${{ secrets.PYPI_PASSWORD }} + run: make release diff --git a/Makefile b/Makefile index e70e618..f9d75b9 100644 --- a/Makefile +++ b/Makefile @@ -58,7 +58,7 @@ lint: ## check style with flake8 flake8 mythx_cli tests test: ## run tests quickly with the default Python - py.test -vv + pytest --cov-report html --cov-report term --cov mythx_cli tests/ test-all: ## run tests on every Python version with tox tox diff --git a/mythx_cli/analysis/list.py b/mythx_cli/analysis/list.py index c81352e..6921af7 100644 --- a/mythx_cli/analysis/list.py +++ b/mythx_cli/analysis/list.py @@ -44,5 +44,5 @@ def analysis_list(ctx, number: int) -> None: # trim result to desired result number LOGGER.debug(f"Got {len(result.analyses)} analyses, trimming to {number}") - result = AnalysisListResponse(analyses=result[:number], total=resp.total) + result = AnalysisListResponse(analyses=result.analyses[:number], total=resp.total) write_or_print(FORMAT_RESOLVER[ctx["fmt"]].format_analysis_list(result)) diff --git a/mythx_cli/analysis/report.py b/mythx_cli/analysis/report.py index 4a7241f..6ab574a 100644 --- a/mythx_cli/analysis/report.py +++ b/mythx_cli/analysis/report.py @@ -4,6 +4,7 @@ import click from mythx_models.response import AnalysisInputResponse, DetectedIssuesResponse +from pythx import Client from mythx_cli.formatter import FORMAT_RESOLVER, util from mythx_cli.formatter.base import BaseFormatter @@ -54,9 +55,10 @@ def analysis_report( """ issues_list: List[ - Tuple[DetectedIssuesResponse, Optional[AnalysisInputResponse]] + Tuple[str, DetectedIssuesResponse, Optional[AnalysisInputResponse]] ] = [] formatter: BaseFormatter = FORMAT_RESOLVER[ctx["fmt"]] + ctx["client"]: Client for uuid in uuids: LOGGER.debug(f"{uuid}: Fetching report") resp = ctx["client"].report(uuid) @@ -74,8 +76,7 @@ def analysis_report( swc_blacklist=swc_blacklist, swc_whitelist=swc_whitelist, ) - resp.uuid = uuid - issues_list.append((resp, inp)) + issues_list.append((uuid, resp, inp)) LOGGER.debug( f"{uuid}: Printing report for {len(issues_list)} issue items with sort key \"{ctx['table_sort_key']}\"" diff --git a/mythx_cli/analysis/status.py b/mythx_cli/analysis/status.py index 8a1fc6d..168f91e 100644 --- a/mythx_cli/analysis/status.py +++ b/mythx_cli/analysis/status.py @@ -22,6 +22,6 @@ def analysis_status(ctx, uuids: List[str]) -> None: """ for uuid in uuids: LOGGER.debug(f"{uuid}: Fetching status") - resp = ctx["client"].status(uuid) + resp = ctx["client"].analysis_status(uuid) LOGGER.debug(f"{uuid}: Printing status information") write_or_print(FORMAT_RESOLVER[ctx["fmt"]].format_analysis_status(resp)) diff --git a/mythx_cli/analyze/command.py b/mythx_cli/analyze/command.py index cfa019b..5098949 100644 --- a/mythx_cli/analyze/command.py +++ b/mythx_cli/analyze/command.py @@ -206,8 +206,8 @@ def analyze( if create_group: resp: GroupCreationResponse = ctx["client"].create_group(group_name=group_name) - group_id = resp.group.identifier - group_name = resp.group.name or "" + group_id = resp.identifier + group_name = resp.name or "" if group_id: # associate all following analyses to the passed or newly created group @@ -308,7 +308,7 @@ def analyze( return issues_list: List[ - Tuple[DetectedIssuesResponse, Optional[AnalysisInputResponse]] + Tuple[str, DetectedIssuesResponse, Optional[AnalysisInputResponse]] ] = [] formatter: BaseFormatter = FORMAT_RESOLVER[ctx["fmt"]] for uuid in uuids: @@ -331,8 +331,8 @@ def analyze( swc_whitelist=swc_whitelist, ) # extend response with job UUID to keep formatter logic isolated - resp.uuid = uuid - issues_list.append((resp, inp)) + # resp.uuid = uuid + issues_list.append((uuid, resp, inp)) LOGGER.debug( f"Printing report for {len(issues_list)} issue items with sort key \"{ctx['table_sort_key']}\"" diff --git a/mythx_cli/cli.py b/mythx_cli/cli.py index ae9cde4..304e779 100644 --- a/mythx_cli/cli.py +++ b/mythx_cli/cli.py @@ -18,6 +18,7 @@ from mythx_cli.group.list import group_list from mythx_cli.group.open import group_open from mythx_cli.group.status import group_status +from mythx_cli.project.list import project_list from mythx_cli.render.command import render from mythx_cli.util import update_context from mythx_cli.version.command import version @@ -205,6 +206,25 @@ def cli( cli.add_command(version) +@cli.group() +def project() -> None: + """Create, modify, and view analysis projects. + + \f + + This subcommand holds all project-related actions, such as creating, + listing, and managing projects, as well as fetching the status of one + or more groups inside a project. + """ + pass + + +from mythx_cli.project import project_list + +LOGGER.debug("Registering project commands") +project.add_command(project_list) + + @cli.group() def group() -> None: """Create, modify, and view analysis groups. diff --git a/mythx_cli/formatter/base.py b/mythx_cli/formatter/base.py index a54f668..e653c14 100644 --- a/mythx_cli/formatter/base.py +++ b/mythx_cli/formatter/base.py @@ -34,7 +34,7 @@ def format_analysis_status(resp: AnalysisStatusResponse) -> str: @abc.abstractmethod def format_detected_issues( issues_list: List[ - Tuple[DetectedIssuesResponse, Optional[AnalysisInputResponse]] + Tuple[str, DetectedIssuesResponse, Optional[AnalysisInputResponse]] ], **kwargs, ) -> str: diff --git a/mythx_cli/formatter/json.py b/mythx_cli/formatter/json.py index 2b64b71..950497a 100644 --- a/mythx_cli/formatter/json.py +++ b/mythx_cli/formatter/json.py @@ -10,6 +10,7 @@ DetectedIssuesResponse, GroupListResponse, GroupStatusResponse, + ProjectListResponse, VersionResponse, ) @@ -29,43 +30,49 @@ class JSONFormatter(BaseFormatter): def format_group_status(resp: GroupStatusResponse) -> str: """Format a group status response as compressed JSON.""" - return resp.to_json() + return resp.json(by_alias=True) + + @staticmethod + def format_project_list(resp: ProjectListResponse): + """Format a project list response as pretty-printed JSON.""" + + return resp.json(by_alias=True) @staticmethod def format_group_list(resp: GroupListResponse) -> str: """Format a group list response as compressed JSON.""" - return resp.to_json() + return resp.json(by_alias=True) @staticmethod def format_analysis_list(resp: AnalysisListResponse) -> str: """Format an analysis list response as compressed JSON.""" - return resp.to_json() + return resp.json(by_alias=True) @staticmethod def format_analysis_status(resp: AnalysisStatusResponse) -> str: """Format an analysis status response as compressed JSON.""" - return resp.to_json() + return resp.json(by_alias=True) @staticmethod def format_detected_issues( issues_list: List[ - Tuple[DetectedIssuesResponse, Optional[AnalysisInputResponse]] + Tuple[str, DetectedIssuesResponse, Optional[AnalysisInputResponse]] ], **kwargs, ) -> str: """Format an issue report response as compressed JSON.""" - output = [resp.to_dict(as_list=True) for resp, _ in issues_list] + output = [resp.dict(by_alias=True) for _, resp, _ in issues_list] return json.dumps(output) @staticmethod def format_version(resp: VersionResponse) -> str: """Format a version response as compressed JSON.""" - return resp.to_json() + return resp.json(by_alias=True) class PrettyJSONFormatter(BaseFormatter): @@ -85,9 +92,15 @@ def _print_as_json(obj, report_mode=False) -> str: json_args = {"indent": 2, "sort_keys": True} if report_mode: return json.dumps( - [resp.to_dict(as_list=True) for resp, _ in obj], **json_args + [resp.dict(by_alias=True) for _, resp, _ in obj], **json_args ) - return json.dumps(obj.to_dict(), **json_args) + return json.dumps(obj.dict(by_alias=True), **json_args) + + @staticmethod + def format_project_list(resp: ProjectListResponse): + """Format a project list response as pretty-printed JSON.""" + + return PrettyJSONFormatter._print_as_json(resp) @staticmethod def format_group_status(resp: GroupStatusResponse) -> str: @@ -116,7 +129,7 @@ def format_analysis_status(obj: AnalysisStatusResponse) -> str: @staticmethod def format_detected_issues( issues_list: List[ - Tuple[DetectedIssuesResponse, Optional[AnalysisInputResponse]] + Tuple[str, DetectedIssuesResponse, Optional[AnalysisInputResponse]] ], **kwargs, ) -> str: diff --git a/mythx_cli/formatter/simple_stdout.py b/mythx_cli/formatter/simple_stdout.py index ac6c058..aced448 100644 --- a/mythx_cli/formatter/simple_stdout.py +++ b/mythx_cli/formatter/simple_stdout.py @@ -10,6 +10,7 @@ DetectedIssuesResponse, GroupListResponse, GroupStatusResponse, + ProjectListResponse, VersionResponse, ) @@ -33,7 +34,7 @@ def format_analysis_list(resp: AnalysisListResponse) -> str: """Format an analysis list response to a simple text representation.""" res = [] - for analysis in resp: + for analysis in resp.analyses: res.append("UUID: {}".format(analysis.uuid)) res.append("Submitted at: {}".format(analysis.submitted_at)) res.append("Status: {}".format(analysis.status)) @@ -46,10 +47,10 @@ def format_group_status(resp: GroupStatusResponse) -> str: """Format a group status response to a simple text representation.""" res = [ - "ID: {}".format(resp.group.identifier), - "Name: {}".format(resp.group.name or ""), - "Created on: {}".format(resp.group.created_at), - "Status: {}".format(resp.group.status), + "ID: {}".format(resp.identifier), + "Name: {}".format(resp.name or ""), + "Created on: {}".format(resp.created_at), + "Status: {}".format(resp.status), "", ] return "\n".join(res) @@ -60,7 +61,7 @@ def format_group_list(resp: GroupListResponse) -> str: representation.""" res = [] - for group in resp: + for group in resp.groups: res.append("ID: {}".format(group.identifier)) res.append("Name: {}".format(group.name or "")) res.append("Created on: {}".format(group.created_at)) @@ -69,6 +70,21 @@ def format_group_list(resp: GroupListResponse) -> str: return "\n".join(res) + @staticmethod + def format_project_list(resp: ProjectListResponse) -> str: + """Format an analysis group response to a simple text + representation.""" + + res = [] + for project in resp.projects: + res.append("ID: {}".format(project.id)) + res.append("Name: {}".format(project.name or "")) + res.append("Created on: {}".format(project.created)) + res.append("Modified: {}".format(project.modified)) + res.append("") + + return "\n".join(res) + @staticmethod def format_analysis_status(resp: AnalysisStatusResponse) -> str: """Format an analysis status response to a simple text @@ -85,7 +101,7 @@ def format_analysis_status(resp: AnalysisStatusResponse) -> str: @staticmethod def format_detected_issues( issues_list: List[ - Tuple[DetectedIssuesResponse, Optional[AnalysisInputResponse]] + Tuple[str, DetectedIssuesResponse, Optional[AnalysisInputResponse]] ], **kwargs, ) -> str: @@ -113,10 +129,10 @@ def format_version(resp: VersionResponse) -> str: return "\n".join( [ - "API: {}".format(resp.api_version), - "Harvey: {}".format(resp.harvey_version), - "Maru: {}".format(resp.maru_version), - "Mythril: {}".format(resp.mythril_version), - "Hashed: {}".format(resp.hashed_version), + "API: {}".format(resp.api), + "Harvey: {}".format(resp.harvey), + "Maru: {}".format(resp.maru), + "Mythril: {}".format(resp.mythril), + "Hashed: {}".format(resp.hash), ] ) diff --git a/mythx_cli/formatter/tabular.py b/mythx_cli/formatter/tabular.py index 98c93f5..4b79e46 100644 --- a/mythx_cli/formatter/tabular.py +++ b/mythx_cli/formatter/tabular.py @@ -12,13 +12,14 @@ DetectedIssuesResponse, GroupListResponse, GroupStatusResponse, + ProjectListResponse, VersionResponse, ) from tabulate import tabulate from mythx_cli.formatter.base import BaseFormatter from mythx_cli.formatter.util import generate_dashboard_link -from mythx_cli.util import index_by_filename +from mythx_cli.util import SourceMap, index_by_filename class TabularFormatter(BaseFormatter): @@ -43,6 +44,16 @@ def format_analysis_list(resp: AnalysisListResponse) -> str: ] return tabulate(data, tablefmt="fancy_grid") + @staticmethod + def format_project_list(resp: ProjectListResponse) -> str: + """Format an analysis group response to a tabular representation.""" + + data = [ + (project.id, project.name, project.group_count, project.modified) + for project in resp.projects + ] + return tabulate(data, tablefmt="fancy_grid") + @staticmethod def format_group_list(resp: GroupListResponse) -> str: """Format an analysis group response to a tabular representation.""" @@ -52,7 +63,7 @@ def format_group_list(resp: GroupListResponse) -> str: group.identifier, group.status, ",".join([basename(x) for x in group.main_source_files]), - group.created_at.strftime("%Y-%m-%d %H:%M:%S%z"), + group.created_at, ) for group in resp.groups ] @@ -64,42 +75,37 @@ def format_group_status(resp: GroupStatusResponse) -> str: data = ( ( - ("ID", resp.group.identifier), - ("Name", resp.group.name or ""), - ( - "Creation Date", - resp.group.created_at.strftime("%Y-%m-%d %H:%M:%S%z"), - ), - ("Created By", resp.group.created_by), - ("Progress", "{}/100".format(resp.group.progress)), + ("ID", resp.identifier), + ("Name", resp.name or ""), + ("Creation Date", resp.created_at), + ("Created By", resp.created_by), + ("Progress", "{}/100".format(resp.progress)), ) + tuple( - zip_longest( - ("Main Sources",), resp.group.main_source_files, fillvalue="" - ) + zip_longest(("Main Sources",), resp.main_source_files, fillvalue="") ) + ( - ("Status", resp.group.status.title()), - ("Queued Analyses", resp.group.analysis_statistics.queued or 0), - ("Running Analyses", resp.group.analysis_statistics.running or 0), - ("Failed Analyses", resp.group.analysis_statistics.failed or 0), - ("Finished Analyses", resp.group.analysis_statistics.finished or 0), - ("Total Analyses", resp.group.analysis_statistics.total or 0), + ("Status", resp.status.title()), + ("Queued Analyses", resp.analysis_statistics.queued or 0), + ("Running Analyses", resp.analysis_statistics.running or 0), + ("Failed Analyses", resp.analysis_statistics.failed or 0), + ("Finished Analyses", resp.analysis_statistics.finished or 0), + ("Total Analyses", resp.analysis_statistics.total or 0), ( "High Severity Vulnerabilities", - resp.group.vulnerability_statistics.high or 0, + resp.vulnerability_statistics.high or 0, ), ( "Medium Severity Vulnerabilities", - resp.group.vulnerability_statistics.medium or 0, + resp.vulnerability_statistics.medium or 0, ), ( "Low Severity Vulnerabilities", - resp.group.vulnerability_statistics.low or 0, + resp.vulnerability_statistics.low or 0, ), ( "Unknown Severity Vulnerabilities", - resp.group.vulnerability_statistics.none or 0, + resp.vulnerability_statistics.none or 0, ), ) ) @@ -109,13 +115,28 @@ def format_group_status(resp: GroupStatusResponse) -> str: def format_analysis_status(resp: AnalysisStatusResponse) -> str: """Format an analysis status response to a tabular representation.""" - data = ((k, v) for k, v in resp.analysis.to_dict().items()) + data = ( + ("UUID", resp.uuid), + ("API Version", resp.api_version), + ("Mythril Version", resp.mythril_version), + ("Harvey Version", resp.harvey_version), + ("Maru Version", resp.maru_version), + ("Queue Time", resp.queue_time), + ("Run Time", resp.run_time), + ("Status", resp.status), + ("Submitted At", resp.submitted_at), + ("Submitted By", resp.submitted_by), + ("Tool Name", resp.client_tool_name), + ("Group ID", resp.group_id), + ("Group Name", resp.group_name), + ("Analysis Mode", resp.analysis_mode), + ) return tabulate(data, tablefmt="fancy_grid") @staticmethod def format_detected_issues( issues_list: List[ - Tuple[DetectedIssuesResponse, Optional[AnalysisInputResponse]] + Tuple[str, DetectedIssuesResponse, Optional[AnalysisInputResponse]] ], **kwargs, ) -> str: @@ -167,5 +188,5 @@ def format_detected_issues( def format_version(resp: VersionResponse) -> str: """Format a version response to a tabular representation.""" - data = ((k.title(), v) for k, v in resp.to_dict().items()) + data = ((k.title(), v) for k, v in resp.dict(by_alias=True).items()) return tabulate(data, tablefmt="fancy_grid") diff --git a/mythx_cli/formatter/util.py b/mythx_cli/formatter/util.py index 2d3396a..6b697ec 100644 --- a/mythx_cli/formatter/util.py +++ b/mythx_cli/formatter/util.py @@ -3,15 +3,9 @@ from typing import List, Union import click -from mythx_models.response import DetectedIssuesResponse, Severity +from mythx_models.response import DetectedIssuesResponse, Issue, Severity -SEVERITY_ORDER = ( - Severity.UNKNOWN, - Severity.NONE, - Severity.LOW, - Severity.MEDIUM, - Severity.HIGH, -) +SEVERITY_ORDER = ("unknown", "none", "low", "medium", "high") def get_source_location_by_offset(source: str, offset: int) -> int: @@ -99,17 +93,17 @@ def filter_report( :param swc_whitelist: A comma-separated list of SWC IDs to include :return: The filtered issue report """ - - min_severity = Severity(min_severity.title()) if min_severity else Severity.UNKNOWN + min_severity = min_severity.lower() if min_severity else SEVERITY_ORDER[0] swc_blacklist = normalize_swc_list(swc_blacklist) swc_whitelist = normalize_swc_list(swc_whitelist) new_issues = [] for report in resp.issue_reports: for issue in report.issues: - is_severe = SEVERITY_ORDER.index(issue.severity) >= SEVERITY_ORDER.index( - min_severity - ) + issue: Issue + is_severe = SEVERITY_ORDER.index( + issue.severity.lower() + ) >= SEVERITY_ORDER.index(min_severity.lower()) not_blacklisted = issue.swc_id not in swc_blacklist is_whitelisted = issue.swc_id in swc_whitelist if swc_whitelist else True diff --git a/mythx_cli/group/close.py b/mythx_cli/group/close.py index b15f10d..5ebf7ed 100644 --- a/mythx_cli/group/close.py +++ b/mythx_cli/group/close.py @@ -25,7 +25,5 @@ def group_close(ctx, identifiers: List[str]) -> None: LOGGER.debug(f"Closing group for ID {identifier}") resp: GroupCreationResponse = ctx["client"].seal_group(group_id=identifier) write_or_print( - "Closed group with ID {} and name '{}'".format( - resp.group.identifier, resp.group.name - ) + "Closed group with ID {} and name '{}'".format(resp.identifier, resp.name) ) diff --git a/mythx_cli/group/list.py b/mythx_cli/group/list.py index 24a6465..4834323 100644 --- a/mythx_cli/group/list.py +++ b/mythx_cli/group/list.py @@ -46,5 +46,5 @@ def group_list(ctx, number: int) -> None: # trim result to desired result number LOGGER.debug(f"Got {len(result.groups)} analyses, trimming to {number}") - result = GroupListResponse(groups=result[:number], total=resp.total) + result = GroupListResponse(groups=result.groups[:number], total=resp.total) write_or_print(FORMAT_RESOLVER[ctx["fmt"]].format_group_list(result)) diff --git a/mythx_cli/group/open.py b/mythx_cli/group/open.py index 87cccd5..f049f57 100644 --- a/mythx_cli/group/open.py +++ b/mythx_cli/group/open.py @@ -23,7 +23,5 @@ def group_open(ctx, name: str) -> None: LOGGER.debug(f"Opening group with name {name}") resp: GroupCreationResponse = ctx["client"].create_group(group_name=name) write_or_print( - "Opened group with ID {} and name '{}'".format( - resp.group.identifier, resp.group.name - ) + "Opened group with ID {} and name '{}'".format(resp.identifier, resp.name) ) diff --git a/mythx_cli/project/__init__.py b/mythx_cli/project/__init__.py new file mode 100644 index 0000000..6731dd5 --- /dev/null +++ b/mythx_cli/project/__init__.py @@ -0,0 +1 @@ +from .list import project_list diff --git a/mythx_cli/project/delete.py b/mythx_cli/project/delete.py new file mode 100644 index 0000000..27e8210 --- /dev/null +++ b/mythx_cli/project/delete.py @@ -0,0 +1 @@ +# https://api.mythx.io/v1/openapi#operation/deleteProject diff --git a/mythx_cli/project/details.py b/mythx_cli/project/details.py new file mode 100644 index 0000000..e0c13e4 --- /dev/null +++ b/mythx_cli/project/details.py @@ -0,0 +1 @@ +# https://api.mythx.io/v1/openapi#operation/updateProject diff --git a/mythx_cli/project/list.py b/mythx_cli/project/list.py new file mode 100644 index 0000000..cb8b737 --- /dev/null +++ b/mythx_cli/project/list.py @@ -0,0 +1,52 @@ +# https://api.mythx.io/v1/openapi#operation/listProjects + +import logging + +import click +from mythx_models.response import ProjectListResponse +from pythx import Client + +from mythx_cli.formatter import FORMAT_RESOLVER +from mythx_cli.util import write_or_print + +LOGGER = logging.getLogger("mythx-cli") + + +@click.command("list") +@click.option( + "--number", + default=5, + type=click.IntRange(min=1, max=100), # ~ 5 requests à 20 entries + show_default=True, + help="The number of most recent projects to display", +) +@click.pass_obj +def project_list(ctx, number: int) -> None: + """Get a list of analysis projects. + + \f + + :param ctx: Click context holding group-level parameters + :param number: The number of analysis projects to display + :return: + """ + + client: Client = ctx["client"] + result = ProjectListResponse(projects=[], total=0) + offset = 0 + while True: + LOGGER.debug(f"Fetching projects with offset {offset}") + resp = client.project_list(offset=offset) + if not resp.projects: + LOGGER.debug("Received empty project list response") + break + offset += len(resp.projects) + result.projects.extend(resp.projects) + if len(result.projects) >= number: + LOGGER.debug(f"Received {len(result.projects)} projects") + break + + # trim result to desired result number + LOGGER.debug(f"Got {len(result.projects)} analyses, trimming to {number}") + result = ProjectListResponse(projects=result.projects[:number], total=resp.total) + write_or_print(FORMAT_RESOLVER[ctx["fmt"]].format_project_list(result)) diff --git a/mythx_cli/project/open.py b/mythx_cli/project/open.py new file mode 100644 index 0000000..5bc106b --- /dev/null +++ b/mythx_cli/project/open.py @@ -0,0 +1 @@ +# https://api.mythx.io/v1/openapi#operation/createProject diff --git a/mythx_cli/render/command.py b/mythx_cli/render/command.py index 516904b..48059f0 100644 --- a/mythx_cli/render/command.py +++ b/mythx_cli/render/command.py @@ -107,7 +107,7 @@ def render( template = env.get_template(template_name) issues_list: List[ - Tuple[DetectedIssuesResponse, Optional[AnalysisInputResponse]] + Tuple[str, DetectedIssuesResponse, Optional[AnalysisInputResponse]] ] = [] if len(target) == 24: LOGGER.debug(f"Identified group target {target}") @@ -124,25 +124,25 @@ def render( click.echo( "Fetching report for analysis {}".format(analysis.uuid), err=True ) - _, resp, inp = get_analysis_info( + uuid, _, resp, inp = get_analysis_info( client=client, uuid=analysis.uuid, min_severity=min_severity, swc_blacklist=swc_blacklist, swc_whitelist=swc_whitelist, ) - issues_list.append((resp, inp)) + issues_list.append((uuid, resp, inp)) elif len(target) == 36: LOGGER.debug(f"Identified analysis target {target}") click.echo("Fetching report for analysis {}".format(target), err=True) - _, resp, inp = get_analysis_info( + uuid, _, resp, inp = get_analysis_info( client=client, uuid=target, min_severity=min_severity, swc_blacklist=swc_blacklist, swc_whitelist=swc_whitelist, ) - issues_list.append((resp, inp)) + issues_list.append((uuid, resp, inp)) else: LOGGER.debug(f"Could not identify target with length {len(target)}") raise click.UsageError( diff --git a/mythx_cli/render/util.py b/mythx_cli/render/util.py index 95db5b7..7d58f58 100644 --- a/mythx_cli/render/util.py +++ b/mythx_cli/render/util.py @@ -18,7 +18,7 @@ def get_analysis_info( min_severity: Optional[str], swc_blacklist: Optional[List[str]], swc_whitelist: Optional[List[str]], -) -> Tuple[AnalysisStatusResponse, DetectedIssuesResponse, AnalysisInputResponse]: +) -> Tuple[str, AnalysisStatusResponse, DetectedIssuesResponse, AnalysisInputResponse]: """Fetch information related to the specified analysis job UUID. Given a UUID, this function will query the MythX API for the @@ -32,7 +32,7 @@ def get_analysis_info( LOGGER.debug(f"{uuid}: Fetching input") inp: Optional[AnalysisInputResponse] = client.request_by_uuid(uuid) LOGGER.debug(f"{uuid}: Fetching status") - status: AnalysisStatusResponse = client.status(uuid) + status: AnalysisStatusResponse = client.analysis_status(uuid) LOGGER.debug(f"{uuid}: Applying SWC filters") util.filter_report( @@ -41,7 +41,5 @@ def get_analysis_info( swc_blacklist=swc_blacklist, swc_whitelist=swc_whitelist, ) - # extend response with job UUID to keep formatter logic isolated - resp.uuid = uuid - return status, resp, inp + return uuid, status, resp, inp diff --git a/mythx_cli/util.py b/mythx_cli/util.py index ba4e8ec..fae6b90 100644 --- a/mythx_cli/util.py +++ b/mythx_cli/util.py @@ -10,8 +10,134 @@ LOGGER = logging.getLogger("mythx-cli") +class SourceMapLocation: + def __init__( + self, offset: int = 0, length: int = 0, file_id: int = -1, jump_type: str = "-" + ): + self.o = int(offset) + self.l = int(length) + self.f = int(file_id) + self.j = jump_type + + @property + def offset(self) -> int: + return self.o + + @offset.setter + def offset(self, value: int) -> None: + value = int(value) + if value <= 0: + raise ValueError("Expected positive offset but received {}".format(value)) + self.o = int(value) + + @property + def length(self) -> int: + return self.l + + @length.setter + def length(self, value: int) -> None: + value = int(value) + if value <= 0: + raise ValueError("Expected positive length but received {}".format(value)) + self.l = int(value) + + @property + def file_id(self) -> int: + return self.f + + @file_id.setter + def file_id(self, value: int) -> None: + value = int(value) + if value < -1: + raise ValueError( + "Expected positive file ID or -1 but received {}".format(value) + ) + self.f = int(value) + + @property + def jump_type(self) -> str: + return self.j + + @jump_type.setter + def jump_type(self, value: str) -> None: + if value not in ("i", "o", "-"): + raise ValueError( + "Invalid jump type {}, must be one of i, o, -".format(value) + ) + self.j = value + + def to_full_component_string(self) -> str: + return "{}:{}:{}:{}".format(self.o, self.l, self.f, self.j) + + def to_short_component_string(self) -> str: + return "{}:{}:{}".format(self.o, self.l, self.f) + + def __repr__(self) -> str: + return "".format(self.to_full_component_string()) + + def __eq__(self, other: "SourceMapLocation") -> bool: + return all( + (self.o == other.o, self.l == other.l, self.f == other.f, self.j == other.j) + ) + + +class SourceMap: + def __init__(self, source_map: str): + self.components = self._decompress(source_map) + + @staticmethod + def sourcemap_reducer( + accumulator: Tuple[int, int, int, str], component: str + ) -> List[str]: + parts = component.split(":") + full = [] + for i in range(4): + part_exists = i < len(parts) and parts[i] + part = parts[i] if part_exists else accumulator[i] + full.append(part) + return full + + @staticmethod + def _decompress(source_map: str) -> List[SourceMapLocation]: + components = source_map.split(";") + accumulator = (-1, -1, -2, "-") + result = [] + + for val in components: + curr = SourceMap.sourcemap_reducer(accumulator, val) + accumulator = curr + result.append(curr) + + return [SourceMapLocation(*c) for c in result] + + def _compress(self) -> str: + compressed = [] + accumulator = (-1, -1, -2, "") + for val in self.components: + compr = [] + for i, v in enumerate((val.offset, val.length, val.file_id, val.jump_type)): + if accumulator[i] == v: + compr.append("") + else: + compr.append(str(v)) + accumulator = (val.offset, val.length, val.file_id, val.jump_type) + compressed.append(":".join(compr).rstrip(":")) + return ";".join(compressed) + + def to_compressed_sourcemap(self) -> str: + return self._compress() + + def to_decompressed_sourcemap(self) -> str: + return ";".join(map(lambda x: x.to_short_component_string(), self.components)) + + def __eq__(self, other: "SourceMap") -> bool: + return self.components == other.components + + def index_by_filename( - issues_list: List[Tuple[DetectedIssuesResponse, Optional[AnalysisInputResponse]]] + issues_list: List[ + Tuple[str, DetectedIssuesResponse, Optional[AnalysisInputResponse]] + ] ): """Index the given report/input responses by filename. @@ -28,7 +154,7 @@ def index_by_filename( """ report_context = defaultdict(list) - for resp, inp in issues_list: + for uuid, resp, inp in issues_list: # initialize context with source line objects for filename, file_data in inp.sources.items(): source = file_data.get("source") @@ -45,15 +171,15 @@ def index_by_filename( for report in resp.issue_reports: for issue in report.issues: issue_entry = { - "uuid": resp.uuid, + "uuid": uuid, "swcID": issue.swc_id, "swcTitle": issue.swc_title, "description": { - "head": issue.description_short, - "tail": issue.description_long, + "head": issue.description.head, + "tail": issue.description.tail, }, "severity": issue.severity, - "testCases": issue.extra_data.get("testCases", []), + "testCases": issue.extra.get("testCases", []), } if issue.swc_id == "" or issue.swc_title == "" or not issue.locations: @@ -66,7 +192,7 @@ def index_by_filename( # skip non-text locations when we have one attached to the issue continue - for c in loc.source_map.components: + for c in SourceMap(loc.source_map).components: source_list = loc.source_list or report.source_list if not (source_list and 0 <= c.file_id < len(source_list)): # skip issues whose srcmap file ID if out of range of the source list diff --git a/requirements.txt b/requirements.txt index 54201f4..c1a4af7 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,6 @@ Click==7.1.2 py-solc-x==1.1.0 -pythx==1.6.1 +pythx==1.6.2 tabulate==0.8.7 Jinja2==2.11.3 htmlmin==0.1.12 diff --git a/requirements_dev.txt b/requirements_dev.txt index b57d084..1bf64b1 100644 --- a/requirements_dev.txt +++ b/requirements_dev.txt @@ -1,18 +1,18 @@ -r requirements.txt bumpversion==0.6.0 -coverage==5.3 -coveralls==2.2.0 -tox==3.20.1 +coverage==5.4 +coveralls==3.0.0 +tox==3.21.4 -sphinx==3.3.1 -sphinx_rtd_theme==0.5.0 -watchdog==0.10.4 -twine==3.2.0 +sphinx==3.4.3 +sphinx_rtd_theme==0.5.1 +watchdog==1.0.2 +twine==3.3.0 black==19.3b0 isort==5.6.4 -pytest==6.1.2 +pytest==6.2.2 pytest-runner==5.2 -pytest-cov==2.10.1 +pytest-cov==2.11.1 pytest-subprocess==1.0.0 diff --git a/tests/common.py b/tests/common.py index 82aff4e..bd9bf9e 100644 --- a/tests/common.py +++ b/tests/common.py @@ -25,7 +25,11 @@ def get_test_case(path: str, obj=None, raw=False): if obj is None: return dict_data - return obj.from_dict(dict_data) + + if obj is DetectedIssuesResponse and type(dict_data) is list: + return obj(issue_reports=dict_data) + else: + return obj(**dict_data) AST = get_test_case("testdata/test-ast.json") @@ -53,7 +57,7 @@ def mock_context( ) as analysis_list_patch, patch( "pythx.Client.group_list" ) as group_list_patch, patch( - "pythx.Client.status" + "pythx.Client.analysis_status" ) as status_patch, patch( "pythx.Client.group_status" ) as group_status_patch, patch( diff --git a/tests/conftest.py b/tests/conftest.py index 0a63c8f..aa46b5b 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,5 +1,8 @@ +import logging import os def pytest_generate_tests(metafunc): os.environ["MYTHX_API_KEY"] = "test" + for name in logging.root.manager.loggerDict: + logging.getLogger(name).setLevel(logging.DEBUG) diff --git a/tests/test_analyze_solidity.py b/tests/test_analyze_solidity.py index 83fcd6f..87f3194 100644 --- a/tests/test_analyze_solidity.py +++ b/tests/test_analyze_solidity.py @@ -39,7 +39,7 @@ def get_high_severity_report(): issues_resp = deepcopy(ISSUES_RESPONSE) - issues_resp.issue_reports[0].issues[0].severity = Severity.HIGH + issues_resp.issue_reports[0].issues[0].severity = "high" return issues_resp @@ -157,7 +157,7 @@ def test_default_recursive_blacklist(tmp_path): ( pytest.param( ["analyze", "--async"], - SUBMISSION_RESPONSE.analysis.uuid, + SUBMISSION_RESPONSE.uuid, True, 0, id="analyze async", diff --git a/tests/test_analyze_truffle.py b/tests/test_analyze_truffle.py index e86f64a..3b50a67 100644 --- a/tests/test_analyze_truffle.py +++ b/tests/test_analyze_truffle.py @@ -53,7 +53,7 @@ def setup_truffle_project(base_path, compiled=True, switch_dir=False): def get_high_severity_report(): issues_resp = deepcopy(ISSUES_RESPONSE) - issues_resp.issue_reports[0].issues[0].severity = Severity.HIGH + issues_resp.issue_reports[0].issues[0].severity = "high" return issues_resp @@ -145,11 +145,7 @@ def test_param_yaml_override(tmp_path): "params,value,contained,retval", ( pytest.param( - ["analyze", "--async"], - SUBMISSION_RESPONSE.analysis.uuid, - True, - 0, - id="async", + ["analyze", "--async"], SUBMISSION_RESPONSE.uuid, True, 0, id="async" ), pytest.param(["analyze"], ISSUES_TABLE, True, 0, id="issue table"), pytest.param( diff --git a/tests/test_list.py b/tests/test_list.py index 9fe7ea3..5efc564 100644 --- a/tests/test_list.py +++ b/tests/test_list.py @@ -40,7 +40,7 @@ def test_list_json(): with mock_context(): result = runner.invoke(cli, ["--format", "json", "analysis", "list"]) - assert json.loads(result.output) == ANALYSIS_LIST.to_dict() + assert json.loads(result.output) == ANALYSIS_LIST.dict(by_alias=True) assert result.exit_code == 0 @@ -49,7 +49,7 @@ def test_group_list_json(): with mock_context(): result = runner.invoke(cli, ["--format", "json", "group", "list"]) - assert json.loads(result.output) == GROUP_LIST.to_dict() + assert json.loads(result.output) == GROUP_LIST.dict(by_alias=True) assert result.exit_code == 0 @@ -58,7 +58,7 @@ def test_list_json_pretty(): with mock_context(): result = runner.invoke(cli, ["--format", "json-pretty", "analysis", "list"]) - assert json.loads(result.output) == ANALYSIS_LIST.to_dict() + assert json.loads(result.output) == ANALYSIS_LIST.dict(by_alias=True) assert result.exit_code == 0 @@ -67,7 +67,7 @@ def test_group_list_json_pretty(): with mock_context(): result = runner.invoke(cli, ["--format", "json-pretty", "group", "list"]) - assert json.loads(result.output) == GROUP_LIST.to_dict() + assert json.loads(result.output) == GROUP_LIST.dict(by_alias=True) assert result.exit_code == 0 diff --git a/tests/test_renderer.py b/tests/test_renderer.py index 2dbc114..8114973 100644 --- a/tests/test_renderer.py +++ b/tests/test_renderer.py @@ -28,9 +28,10 @@ def assert_content(data, ident, is_template): for source in map(lambda x: x["source"], INPUT_RESPONSE.sources.values()): for line in source.split("\n"): assert escape(line.strip()) in data - for issue in ISSUES_RESPONSE: - assert issue.swc_id in data - assert issue.swc_title in data + for report in ISSUES_RESPONSE.issue_reports: + for issue in report.issues: + assert issue.swc_id in data + assert issue.swc_title in data else: assert data.strip() != "" diff --git a/tests/test_report.py b/tests/test_report.py index 0fcf6fe..1714288 100644 --- a/tests/test_report.py +++ b/tests/test_report.py @@ -108,7 +108,9 @@ def test_report_json(): ], ) - assert json.loads(result.output)[0] == json.loads(ISSUES_RESPONSE.to_json()) + assert json.loads(result.output)[0] == json.loads( + ISSUES_RESPONSE.json(by_alias=True) + ) assert result.exit_code == 0 @@ -129,7 +131,8 @@ def test_report_json_blacklist(): ) assert all( - x["swcID"] != "SWC-110" for x in json.loads(result.output)[0][0]["issues"] + x["swcID"] != "SWC-110" + for x in json.loads(result.output)[0]["issue_reports"][0]["issues"] ) assert result.exit_code == 0 @@ -151,7 +154,8 @@ def test_report_json_whitelist(): ) assert all( - x["swcID"] == "SWC-110" for x in json.loads(result.output)[0][0]["issues"] + x["swcID"] == "SWC-110" + for x in json.loads(result.output)[0]["issue_reports"][0]["issues"] ) assert result.exit_code == 0 @@ -173,7 +177,8 @@ def test_report_json_filter(): ) assert all( - x["swcID"] != "SWC-110" for x in json.loads(result.output)[0][0]["issues"] + x["swcID"] != "SWC-110" + for x in json.loads(result.output)[0]["issue_reports"][0]["issues"] ) assert result.exit_code == 0 @@ -192,7 +197,9 @@ def test_report_json_pretty(): ], ) - assert json.loads(result.output)[0] == json.loads(ISSUES_RESPONSE.to_json()) + assert json.loads(result.output)[0] == json.loads( + ISSUES_RESPONSE.json(by_alias=True) + ) assert result.exit_code == 0 @@ -213,7 +220,8 @@ def test_report_json_pretty_blacklist(): ) assert all( - x["swcID"] != "SWC-110" for x in json.loads(result.output)[0][0]["issues"] + x["swcID"] != "SWC-110" + for x in json.loads(result.output)[0]["issue_reports"][0]["issues"] ) assert result.exit_code == 0 @@ -235,7 +243,8 @@ def test_report_json_pretty_whitelist(): ) assert all( - x["swcID"] == "SWC-110" for x in json.loads(result.output)[0][0]["issues"] + x["swcID"] == "SWC-110" + for x in json.loads(result.output)[0]["issue_reports"][0]["issues"] ) assert result.exit_code == 0 @@ -257,7 +266,8 @@ def test_report_json_pretty_filter(): ) assert all( - x["swcID"] != "SWC-110" for x in json.loads(result.output)[0][0]["issues"] + x["swcID"] != "SWC-110" + for x in json.loads(result.output)[0]["issue_reports"][0]["issues"] ) assert result.exit_code == 0 diff --git a/tests/test_report_filter.py b/tests/test_report_filter.py index aa588b1..4438ca3 100644 --- a/tests/test_report_filter.py +++ b/tests/test_report_filter.py @@ -88,7 +88,12 @@ def test_report_filter_blacklist(blacklist, whitelist, severity, contained): resp, swc_blacklist=blacklist, swc_whitelist=whitelist, min_severity=severity ) + swc_ids = [] + for report in resp.issue_reports: + for issue in report.issues: + swc_ids.append(issue.swc_id) + if contained: - assert "SWC-110" in resp + assert "SWC-110" in swc_ids else: - assert "SWC-110" not in resp + assert "SWC-110" not in swc_ids diff --git a/tests/test_status.py b/tests/test_status.py index 2d3aff3..8c45ecf 100644 --- a/tests/test_status.py +++ b/tests/test_status.py @@ -51,7 +51,7 @@ def test_status_json(): ], ) - assert json.loads(result.output) == ANALYSIS_STATUS.to_dict() + assert json.loads(result.output) == ANALYSIS_STATUS.dict(by_alias=True) assert result.exit_code == 0 @@ -62,7 +62,7 @@ def test_group_status_json(): cli, ["--format", "json", "group", "status", "5dd40ca50d861d001101e888"] ) - assert json.loads(result.output) == GROUP_STATUS.to_dict() + assert json.loads(result.output) == GROUP_STATUS.dict(by_alias=True) assert result.exit_code == 0 @@ -80,7 +80,7 @@ def test_status_json_pretty(): ], ) - assert json.loads(result.output) == ANALYSIS_STATUS.to_dict() + assert json.loads(result.output) == ANALYSIS_STATUS.dict(by_alias=True) assert result.exit_code == 0 @@ -92,7 +92,7 @@ def test_group_status_json_pretty(): ["--format", "json-pretty", "group", "status", "5dd40ca50d861d001101e888"], ) - assert json.loads(result.output) == GROUP_STATUS.to_dict() + assert json.loads(result.output) == GROUP_STATUS.dict(by_alias=True) assert result.exit_code == 0 diff --git a/tests/test_version.py b/tests/test_version.py index cfa6963..9b1787f 100644 --- a/tests/test_version.py +++ b/tests/test_version.py @@ -36,7 +36,7 @@ def test_version_json(): with mock_context(): result = runner.invoke(cli, ["--format", "json", "version", "--api"]) - assert json.loads(result.output) == VERSION_RESPONSE.to_dict() + assert json.loads(result.output) == VERSION_RESPONSE.dict(by_alias=True) assert result.exit_code == 0 @@ -45,7 +45,7 @@ def test_version_json_pretty(): with mock_context(): result = runner.invoke(cli, ["--format", "json-pretty", "version", "--api"]) - assert json.loads(result.output) == VERSION_RESPONSE.to_dict() + assert json.loads(result.output) == VERSION_RESPONSE.dict(by_alias=True) assert result.exit_code == 0 diff --git a/tests/testdata/analysis-list-simple.txt b/tests/testdata/analysis-list-simple.txt index 68e199f..72a7434 100644 --- a/tests/testdata/analysis-list-simple.txt +++ b/tests/testdata/analysis-list-simple.txt @@ -1,20 +1,20 @@ UUID: ed6b2347-68b7-4ef3-b85c-4340ae404867 -Submitted at: 2019-09-10 17:15:11.267000+00:00 +Submitted at: 2019-09-10T17:15:11.267Z Status: Finished UUID: e6566fc9-ebc1-4d04-ae5d-6f3b1873290a -Submitted at: 2019-09-10 17:15:10.645000+00:00 +Submitted at: 2019-09-10T17:15:10.645Z Status: Finished UUID: b87f0174-ef09-4fac-9d3c-97c3fdf01782 -Submitted at: 2019-09-10 17:15:09.836000+00:00 +Submitted at: 2019-09-10T17:15:09.836Z Status: Finished UUID: 2056caf6-25d7-4ce8-a633-d10a8746d5dd -Submitted at: 2019-09-10 17:12:42.341000+00:00 +Submitted at: 2019-09-10T17:12:42.341Z Status: Finished UUID: 63eb5611-ba4b-46e8-9e40-f735a0b86fd9 -Submitted at: 2019-09-10 17:12:41.645000+00:00 +Submitted at: 2019-09-10T17:12:41.645Z Status: Finished diff --git a/tests/testdata/analysis-list-table.txt b/tests/testdata/analysis-list-table.txt index bb0a64b..0f051cf 100644 --- a/tests/testdata/analysis-list-table.txt +++ b/tests/testdata/analysis-list-table.txt @@ -1,11 +1,11 @@ -╒══════════════════════════════════════╤══════════╤═══════╤══════════════════════════════════╕ -│ ed6b2347-68b7-4ef3-b85c-4340ae404867 │ Finished │ pythx │ 2019-09-10 17:15:11.267000+00:00 │ -├──────────────────────────────────────┼──────────┼───────┼──────────────────────────────────┤ -│ e6566fc9-ebc1-4d04-ae5d-6f3b1873290a │ Finished │ pythx │ 2019-09-10 17:15:10.645000+00:00 │ -├──────────────────────────────────────┼──────────┼───────┼──────────────────────────────────┤ -│ b87f0174-ef09-4fac-9d3c-97c3fdf01782 │ Finished │ pythx │ 2019-09-10 17:15:09.836000+00:00 │ -├──────────────────────────────────────┼──────────┼───────┼──────────────────────────────────┤ -│ 2056caf6-25d7-4ce8-a633-d10a8746d5dd │ Finished │ pythx │ 2019-09-10 17:12:42.341000+00:00 │ -├──────────────────────────────────────┼──────────┼───────┼──────────────────────────────────┤ -│ 63eb5611-ba4b-46e8-9e40-f735a0b86fd9 │ Finished │ pythx │ 2019-09-10 17:12:41.645000+00:00 │ -╘══════════════════════════════════════╧══════════╧═══════╧══════════════════════════════════╛ +╒══════════════════════════════════════╤══════════╤═══════╤══════════════════════════╕ +│ ed6b2347-68b7-4ef3-b85c-4340ae404867 │ Finished │ pythx │ 2019-09-10T17:15:11.267Z │ +├──────────────────────────────────────┼──────────┼───────┼──────────────────────────┤ +│ e6566fc9-ebc1-4d04-ae5d-6f3b1873290a │ Finished │ pythx │ 2019-09-10T17:15:10.645Z │ +├──────────────────────────────────────┼──────────┼───────┼──────────────────────────┤ +│ b87f0174-ef09-4fac-9d3c-97c3fdf01782 │ Finished │ pythx │ 2019-09-10T17:15:09.836Z │ +├──────────────────────────────────────┼──────────┼───────┼──────────────────────────┤ +│ 2056caf6-25d7-4ce8-a633-d10a8746d5dd │ Finished │ pythx │ 2019-09-10T17:12:42.341Z │ +├──────────────────────────────────────┼──────────┼───────┼──────────────────────────┤ +│ 63eb5611-ba4b-46e8-9e40-f735a0b86fd9 │ Finished │ pythx │ 2019-09-10T17:12:41.645Z │ +╘══════════════════════════════════════╧══════════╧═══════╧══════════════════════════╛ diff --git a/tests/testdata/analysis-status-simple.txt b/tests/testdata/analysis-status-simple.txt index 01aa140..1302450 100644 --- a/tests/testdata/analysis-status-simple.txt +++ b/tests/testdata/analysis-status-simple.txt @@ -1,4 +1,4 @@ UUID: ab9092f7-54d0-480f-9b63-1bb1508280e2 -Submitted at: 2019-09-05 20:34:27.606000+00:00 +Submitted at: 2019-09-05T20:34:27.606Z Status: Finished diff --git a/tests/testdata/analysis-status-table.txt b/tests/testdata/analysis-status-table.txt index cecd6c8..3af9ae9 100644 --- a/tests/testdata/analysis-status-table.txt +++ b/tests/testdata/analysis-status-table.txt @@ -1,35 +1,29 @@ -╒════════════════════╤═══════════════════════════════════════════════╕ -│ uuid │ ab9092f7-54d0-480f-9b63-1bb1508280e2 │ -├────────────────────┼───────────────────────────────────────────────┤ -│ apiVersion │ v1.4.33-1-g1a235db │ -├────────────────────┼───────────────────────────────────────────────┤ -│ mythrilVersion │ 0.21.14 │ -├────────────────────┼───────────────────────────────────────────────┤ -│ harveyVersion │ 0.0.34 │ -├────────────────────┼───────────────────────────────────────────────┤ -│ maruVersion │ 0.5.4 │ -├────────────────────┼───────────────────────────────────────────────┤ -│ queueTime │ 507 │ -├────────────────────┼───────────────────────────────────────────────┤ -│ runTime │ 30307 │ -├────────────────────┼───────────────────────────────────────────────┤ -│ status │ Finished │ -├────────────────────┼───────────────────────────────────────────────┤ -│ submittedAt │ 2019-09-05T20:34:27.606Z │ -├────────────────────┼───────────────────────────────────────────────┤ -│ submittedBy │ 5d6fca7fef1fc700129b6efa │ -├────────────────────┼───────────────────────────────────────────────┤ -│ mainSource │ test.sol │ -├────────────────────┼───────────────────────────────────────────────┤ -│ numSources │ 0 │ -├────────────────────┼───────────────────────────────────────────────┤ -│ numVulnerabilities │ {'high': 0, 'medium': 0, 'low': 0, 'none': 0} │ -├────────────────────┼───────────────────────────────────────────────┤ -│ clientToolName │ pythx │ -├────────────────────┼───────────────────────────────────────────────┤ -│ analysisMode │ full │ -├────────────────────┼───────────────────────────────────────────────┤ -│ groupName │ test-group │ -├────────────────────┼───────────────────────────────────────────────┤ -│ groupId │ 5dc410095e78890011fba1a4 │ -╘════════════════════╧═══════════════════════════════════════════════╛ +╒═════════════════╤══════════════════════════════════════╕ +│ UUID │ ab9092f7-54d0-480f-9b63-1bb1508280e2 │ +├─────────────────┼──────────────────────────────────────┤ +│ API Version │ v1.4.33-1-g1a235db │ +├─────────────────┼──────────────────────────────────────┤ +│ Mythril Version │ 0.21.14 │ +├─────────────────┼──────────────────────────────────────┤ +│ Harvey Version │ 0.0.34 │ +├─────────────────┼──────────────────────────────────────┤ +│ Maru Version │ 0.5.4 │ +├─────────────────┼──────────────────────────────────────┤ +│ Queue Time │ 507 │ +├─────────────────┼──────────────────────────────────────┤ +│ Run Time │ 30307 │ +├─────────────────┼──────────────────────────────────────┤ +│ Status │ Finished │ +├─────────────────┼──────────────────────────────────────┤ +│ Submitted At │ 2019-09-05T20:34:27.606Z │ +├─────────────────┼──────────────────────────────────────┤ +│ Submitted By │ 5d6fca7fef1fc700129b6efa │ +├─────────────────┼──────────────────────────────────────┤ +│ Tool Name │ pythx │ +├─────────────────┼──────────────────────────────────────┤ +│ Group ID │ 5dc410095e78890011fba1a4 │ +├─────────────────┼──────────────────────────────────────┤ +│ Group Name │ test-group │ +├─────────────────┼──────────────────────────────────────┤ +│ Analysis Mode │ full │ +╘═════════════════╧══════════════════════════════════════╛ diff --git a/tests/testdata/group-list-response.json b/tests/testdata/group-list-response.json index 9043b54..c04e30a 100644 --- a/tests/testdata/group-list-response.json +++ b/tests/testdata/group-list-response.json @@ -32,7 +32,7 @@ "name": "test", "createdAt": "2019-11-19T15:39:17.714Z", "createdBy": "5cefb9a4f50eaf001757f57d", - "completedAt": null, + "completedAt": "2019-11-19T15:39:17.714Z", "progress": 100, "mainSourceFiles": [], "status": "sealed", @@ -55,7 +55,7 @@ "name": "", "createdAt": "2019-11-19T15:23:35.258Z", "createdBy": "5cefb9a4f50eaf001757f57d", - "completedAt": null, + "completedAt": "2019-11-19T15:39:17.714Z", "progress": 100, "mainSourceFiles": [], "status": "sealed", @@ -78,7 +78,7 @@ "name": "", "createdAt": "2019-11-19T15:23:02.506Z", "createdBy": "5cefb9a4f50eaf001757f57d", - "completedAt": null, + "completedAt": "2019-11-19T15:39:17.714Z", "progress": 100, "mainSourceFiles": [], "status": "sealed", @@ -101,7 +101,7 @@ "name": "", "createdAt": "2019-11-19T15:22:57.831Z", "createdBy": "5cefb9a4f50eaf001757f57d", - "completedAt": null, + "completedAt": "2019-11-19T15:39:17.714Z", "progress": 100, "mainSourceFiles": [], "status": "sealed", diff --git a/tests/testdata/group-list-simple.txt b/tests/testdata/group-list-simple.txt index 401ca85..0714f61 100644 --- a/tests/testdata/group-list-simple.txt +++ b/tests/testdata/group-list-simple.txt @@ -1,25 +1,25 @@ ID: 5dd415a72ef82f0012f2e3a0 Name: -Created on: 2019-11-19 16:17:43.426000+00:00 +Created on: 2019-11-19T16:17:43.426Z Status: opened ID: 5dd40ca50d861d001101e888 Name: test -Created on: 2019-11-19 15:39:17.714000+00:00 +Created on: 2019-11-19T15:39:17.714Z Status: sealed ID: 5dd408f7b1380a0011e8a166 Name: -Created on: 2019-11-19 15:23:35.258000+00:00 +Created on: 2019-11-19T15:23:35.258Z Status: sealed ID: 5dd408d6519bf1001254baf2 Name: -Created on: 2019-11-19 15:23:02.506000+00:00 +Created on: 2019-11-19T15:23:02.506Z Status: sealed ID: 5dd408d1b1380a0011e8a163 Name: -Created on: 2019-11-19 15:22:57.831000+00:00 +Created on: 2019-11-19T15:22:57.831Z Status: sealed diff --git a/tests/testdata/group-list-table.txt b/tests/testdata/group-list-table.txt index be6573f..1c62240 100644 --- a/tests/testdata/group-list-table.txt +++ b/tests/testdata/group-list-table.txt @@ -1,11 +1,11 @@ ╒══════════════════════════╤════════╤══════════════════════════════════════════════════════════╤══════════════════════════╕ -│ 5dd415a72ef82f0012f2e3a0 │ opened │ BECToken.sol,remythx-mbt385.sol,functiontypes-swc127.sol │ 2019-11-19 16:17:43+0000 │ +│ 5dd415a72ef82f0012f2e3a0 │ opened │ BECToken.sol,remythx-mbt385.sol,functiontypes-swc127.sol │ 2019-11-19T16:17:43.426Z │ ├──────────────────────────┼────────┼──────────────────────────────────────────────────────────┼──────────────────────────┤ -│ 5dd40ca50d861d001101e888 │ sealed │ │ 2019-11-19 15:39:17+0000 │ +│ 5dd40ca50d861d001101e888 │ sealed │ │ 2019-11-19T15:39:17.714Z │ ├──────────────────────────┼────────┼──────────────────────────────────────────────────────────┼──────────────────────────┤ -│ 5dd408f7b1380a0011e8a166 │ sealed │ │ 2019-11-19 15:23:35+0000 │ +│ 5dd408f7b1380a0011e8a166 │ sealed │ │ 2019-11-19T15:23:35.258Z │ ├──────────────────────────┼────────┼──────────────────────────────────────────────────────────┼──────────────────────────┤ -│ 5dd408d6519bf1001254baf2 │ sealed │ │ 2019-11-19 15:23:02+0000 │ +│ 5dd408d6519bf1001254baf2 │ sealed │ │ 2019-11-19T15:23:02.506Z │ ├──────────────────────────┼────────┼──────────────────────────────────────────────────────────┼──────────────────────────┤ -│ 5dd408d1b1380a0011e8a163 │ sealed │ │ 2019-11-19 15:22:57+0000 │ +│ 5dd408d1b1380a0011e8a163 │ sealed │ │ 2019-11-19T15:22:57.831Z │ ╘══════════════════════════╧════════╧══════════════════════════════════════════════════════════╧══════════════════════════╛ diff --git a/tests/testdata/group-status-response.json b/tests/testdata/group-status-response.json index 2fb87b0..8d2fd17 100644 --- a/tests/testdata/group-status-response.json +++ b/tests/testdata/group-status-response.json @@ -3,7 +3,7 @@ "name": "test", "createdAt": "2019-11-19T15:39:17.714Z", "createdBy": "5cefb9a4f50eaf001757f57d", - "completedAt": null, + "completedAt": "2019-09-05T20:34:27.606Z", "progress": 100, "mainSourceFiles": [], "status": "sealed", diff --git a/tests/testdata/group-status-simple.txt b/tests/testdata/group-status-simple.txt index 29540ee..8cea791 100644 --- a/tests/testdata/group-status-simple.txt +++ b/tests/testdata/group-status-simple.txt @@ -1,5 +1,5 @@ ID: 5dd40ca50d861d001101e888 Name: test -Created on: 2019-11-19 15:39:17.714000+00:00 +Created on: 2019-11-19T15:39:17.714Z Status: sealed diff --git a/tests/testdata/group-status-table.txt b/tests/testdata/group-status-table.txt index c42cbaa..fcfd34e 100644 --- a/tests/testdata/group-status-table.txt +++ b/tests/testdata/group-status-table.txt @@ -3,7 +3,7 @@ ├──────────────────────────────────┼──────────────────────────┤ │ Name │ test │ ├──────────────────────────────────┼──────────────────────────┤ -│ Creation Date │ 2019-11-19 15:39:17+0000 │ +│ Creation Date │ 2019-11-19T15:39:17.714Z │ ├──────────────────────────────────┼──────────────────────────┤ │ Created By │ 5cefb9a4f50eaf001757f57d │ ├──────────────────────────────────┼──────────────────────────┤ diff --git a/tests/testdata/version-table.txt b/tests/testdata/version-table.txt index 2146c6f..56e42c7 100644 --- a/tests/testdata/version-table.txt +++ b/tests/testdata/version-table.txt @@ -1,11 +1,11 @@ ╒═════════╤══════════════════════════════════╕ │ Api │ v1.4.34.4 │ ├─────────┼──────────────────────────────────┤ -│ Maru │ 0.5.3 │ -├─────────┼──────────────────────────────────┤ -│ Mythril │ 0.21.14 │ +│ Hash │ 6e0035da873e809e90eab4665e3d19d6 │ ├─────────┼──────────────────────────────────┤ │ Harvey │ 0.0.33 │ ├─────────┼──────────────────────────────────┤ -│ Hash │ 6e0035da873e809e90eab4665e3d19d6 │ +│ Maru │ 0.5.3 │ +├─────────┼──────────────────────────────────┤ +│ Mythril │ 0.21.14 │ ╘═════════╧══════════════════════════════════╛ diff --git a/tox.ini b/tox.ini index d9b5174..8ba6a27 100644 --- a/tox.ini +++ b/tox.ini @@ -1,12 +1,12 @@ [tox] envlist = py36, py37, py38, pypy3, lint, doctest -[travis] +[gh-actions] python = - pypy3: pypy3 - 3.8: p38 - 3.7: py37 3.6: py36 + 3.7: py37 + 3.8: py38, lint, doctest + pypy3: pypy3 [testenv:lint] basepython = python From dfb5a41adf4a3f00542951fb40916e881fe49009 Mon Sep 17 00:00:00 2001 From: Dominik Muhs Date: Fri, 12 Feb 2021 14:27:55 +0100 Subject: [PATCH 02/41] Bump pythx version --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index c1a4af7..8e42963 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,6 @@ Click==7.1.2 py-solc-x==1.1.0 -pythx==1.6.2 +pythx==1.7.1 tabulate==0.8.7 Jinja2==2.11.3 htmlmin==0.1.12 From 4138a25fd5b486769f7b9a634df47b190522c914 Mon Sep 17 00:00:00 2001 From: Dominik Muhs Date: Mon, 22 Feb 2021 16:35:05 +0100 Subject: [PATCH 03/41] Add fuzz subcommand scaffold --- docs/mythx_cli.fuzz.rst | 29 ++++++++++++++++++++++++ docs/mythx_cli.project.rst | 45 ++++++++++++++++++++++++++++++++++++++ docs/mythx_cli.rst | 2 ++ mythx_cli/cli.py | 20 +++++++++++++++++ mythx_cli/fuzz/__init__.py | 0 mythx_cli/fuzz/run.py | 10 +++++++++ mythx_cli/fuzz/setup.py | 10 +++++++++ tests/test_fuzz.py | 13 +++++++++++ 8 files changed, 129 insertions(+) create mode 100644 docs/mythx_cli.fuzz.rst create mode 100644 docs/mythx_cli.project.rst create mode 100644 mythx_cli/fuzz/__init__.py create mode 100644 mythx_cli/fuzz/run.py create mode 100644 mythx_cli/fuzz/setup.py create mode 100644 tests/test_fuzz.py diff --git a/docs/mythx_cli.fuzz.rst b/docs/mythx_cli.fuzz.rst new file mode 100644 index 0000000..500d7fc --- /dev/null +++ b/docs/mythx_cli.fuzz.rst @@ -0,0 +1,29 @@ +mythx\_cli.fuzz package +======================= + +Submodules +---------- + +mythx\_cli.fuzz.run module +-------------------------- + +.. automodule:: mythx_cli.fuzz.run + :members: + :undoc-members: + :show-inheritance: + +mythx\_cli.fuzz.setup module +---------------------------- + +.. automodule:: mythx_cli.fuzz.setup + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: mythx_cli.fuzz + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/mythx_cli.project.rst b/docs/mythx_cli.project.rst new file mode 100644 index 0000000..aef30b5 --- /dev/null +++ b/docs/mythx_cli.project.rst @@ -0,0 +1,45 @@ +mythx\_cli.project package +========================== + +Submodules +---------- + +mythx\_cli.project.delete module +-------------------------------- + +.. automodule:: mythx_cli.project.delete + :members: + :undoc-members: + :show-inheritance: + +mythx\_cli.project.details module +--------------------------------- + +.. automodule:: mythx_cli.project.details + :members: + :undoc-members: + :show-inheritance: + +mythx\_cli.project.list module +------------------------------ + +.. automodule:: mythx_cli.project.list + :members: + :undoc-members: + :show-inheritance: + +mythx\_cli.project.open module +------------------------------ + +.. automodule:: mythx_cli.project.open + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: mythx_cli.project + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/mythx_cli.rst b/docs/mythx_cli.rst index 03f3295..8cbc28c 100644 --- a/docs/mythx_cli.rst +++ b/docs/mythx_cli.rst @@ -10,7 +10,9 @@ Subpackages mythx_cli.analysis mythx_cli.analyze mythx_cli.formatter + mythx_cli.fuzz mythx_cli.group + mythx_cli.project mythx_cli.render mythx_cli.version diff --git a/mythx_cli/cli.py b/mythx_cli/cli.py index 304e779..38ad958 100644 --- a/mythx_cli/cli.py +++ b/mythx_cli/cli.py @@ -14,6 +14,8 @@ from mythx_cli.analysis.status import analysis_status from mythx_cli.analyze.command import analyze from mythx_cli.formatter import FORMAT_RESOLVER +from mythx_cli.fuzz.run import fuzz_run +from mythx_cli.fuzz.setup import fuzz_setup from mythx_cli.group.close import group_close from mythx_cli.group.list import group_list from mythx_cli.group.open import group_open @@ -264,5 +266,23 @@ def analysis() -> None: analysis.add_command(analysis_report) +@cli.group() +def fuzz() -> None: + """Interact with the MythX FaaS solution. + + \f + + This subcommand holds all fuzz-related actions, such as initializing + new fuzzing campaigns, preparing projects for FaaS submission, and + launching new campaigns. + """ + pass + + +LOGGER.debug("Registering fuzz commands") +fuzz.add_command(fuzz_setup) +fuzz.add_command(fuzz_run) + + if __name__ == "__main__": sys.exit(cli()) # pragma: no cover diff --git a/mythx_cli/fuzz/__init__.py b/mythx_cli/fuzz/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/mythx_cli/fuzz/run.py b/mythx_cli/fuzz/run.py new file mode 100644 index 0000000..3f3d4af --- /dev/null +++ b/mythx_cli/fuzz/run.py @@ -0,0 +1,10 @@ +import logging + +import click + +LOGGER = logging.getLogger("mythx-cli") + + +@click.command("run") +def fuzz_run(): + click.echo("Hello, run!") diff --git a/mythx_cli/fuzz/setup.py b/mythx_cli/fuzz/setup.py new file mode 100644 index 0000000..179af78 --- /dev/null +++ b/mythx_cli/fuzz/setup.py @@ -0,0 +1,10 @@ +import logging + +import click + +LOGGER = logging.getLogger("mythx-cli") + + +@click.command("setup") +def fuzz_setup(): + click.echo("Hello, setup!") diff --git a/tests/test_fuzz.py b/tests/test_fuzz.py new file mode 100644 index 0000000..5f7af77 --- /dev/null +++ b/tests/test_fuzz.py @@ -0,0 +1,13 @@ +import pytest +from click.testing import CliRunner + +from mythx_cli.cli import cli + + +@pytest.mark.parametrize("keyword", ("run", "setup")) +def test_fuzz_subcommands_present(keyword): + runner = CliRunner() + + result = runner.invoke(cli, ["fuzz", "--help"]) + + assert keyword in result.output From a79d72825c4476a8dc2e9ba88a60cbc4a00377c3 Mon Sep 17 00:00:00 2001 From: Dominik Muhs Date: Mon, 22 Feb 2021 16:43:40 +0100 Subject: [PATCH 04/41] Add arm subcommand scaffold --- docs/mythx_cli.fuzz.rst | 8 ++++++++ mythx_cli/cli.py | 2 ++ mythx_cli/fuzz/arm.py | 10 ++++++++++ tests/test_fuzz.py | 2 +- 4 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 mythx_cli/fuzz/arm.py diff --git a/docs/mythx_cli.fuzz.rst b/docs/mythx_cli.fuzz.rst index 500d7fc..e44b1c0 100644 --- a/docs/mythx_cli.fuzz.rst +++ b/docs/mythx_cli.fuzz.rst @@ -20,6 +20,14 @@ mythx\_cli.fuzz.setup module :undoc-members: :show-inheritance: +mythx\_cli.fuzz.arm module +---------------------------- + +.. automodule:: mythx_cli.fuzz.arm + :members: + :undoc-members: + :show-inheritance: + Module contents --------------- diff --git a/mythx_cli/cli.py b/mythx_cli/cli.py index 38ad958..5048b14 100644 --- a/mythx_cli/cli.py +++ b/mythx_cli/cli.py @@ -16,6 +16,7 @@ from mythx_cli.formatter import FORMAT_RESOLVER from mythx_cli.fuzz.run import fuzz_run from mythx_cli.fuzz.setup import fuzz_setup +from mythx_cli.fuzz.arm import fuzz_arm from mythx_cli.group.close import group_close from mythx_cli.group.list import group_list from mythx_cli.group.open import group_open @@ -282,6 +283,7 @@ def fuzz() -> None: LOGGER.debug("Registering fuzz commands") fuzz.add_command(fuzz_setup) fuzz.add_command(fuzz_run) +fuzz.add_command(fuzz_arm) if __name__ == "__main__": diff --git a/mythx_cli/fuzz/arm.py b/mythx_cli/fuzz/arm.py new file mode 100644 index 0000000..7056843 --- /dev/null +++ b/mythx_cli/fuzz/arm.py @@ -0,0 +1,10 @@ +import logging + +import click + +LOGGER = logging.getLogger("mythx-cli") + + +@click.command("arm") +def fuzz_arm(): + click.echo("Hello, arm!") diff --git a/tests/test_fuzz.py b/tests/test_fuzz.py index 5f7af77..18ea042 100644 --- a/tests/test_fuzz.py +++ b/tests/test_fuzz.py @@ -4,7 +4,7 @@ from mythx_cli.cli import cli -@pytest.mark.parametrize("keyword", ("run", "setup")) +@pytest.mark.parametrize("keyword", ("run", "setup", "arm")) def test_fuzz_subcommands_present(keyword): runner = CliRunner() From ca879cf0eab2f293bcca8645c0027b75c1b707da Mon Sep 17 00:00:00 2001 From: Dominik Muhs Date: Thu, 25 Feb 2021 13:56:41 +0100 Subject: [PATCH 05/41] Add arm and disarm commands --- mythx_cli/analyze/scribble.py | 54 ++++++++++++++++++++++++++++ mythx_cli/cli.py | 8 +++-- mythx_cli/fuzz/arm.py | 62 ++++++++++++++++++++++++++++++-- mythx_cli/fuzz/disarm.py | 68 +++++++++++++++++++++++++++++++++++ 4 files changed, 187 insertions(+), 5 deletions(-) create mode 100644 mythx_cli/fuzz/disarm.py diff --git a/mythx_cli/analyze/scribble.py b/mythx_cli/analyze/scribble.py index 6dc7ad4..cc3c44c 100644 --- a/mythx_cli/analyze/scribble.py +++ b/mythx_cli/analyze/scribble.py @@ -93,3 +93,57 @@ def instrument_solc_file( ) self._handle_scribble_error(process) return json.loads(process.stdout.decode()) + + @staticmethod + def instrument_solc_in_place( + file_list: List[str], + scribble_path: str, + remappings: List[str] = None, + solc_version: str = None, + ) -> None: + """Instrument a collection of Solidity files in place. + + :param file_list: List of paths to Solidity files to instrument + :param scribble_path: The path to the scribble executable + :param remappings: List of import remappings to pass to solc + :param solc_version: The solc compiler version to use + """ + + command = [scribble_path, "--arm", "--output-mode=files"] + if remappings: + command.append(f"--path-remapping={';'.join(remappings)}") + if solc_version: + command.append(f"--compiler-version={solc_version}") + command.extend(file_list) + + process = subprocess.run( + command, stdout=subprocess.PIPE, stderr=subprocess.PIPE + ) + ScribbleMixin._handle_scribble_error(process) + + @staticmethod + def disarm_solc_in_place( + file_list: List[str], + scribble_path: str, + remappings: List[str] = None, + solc_version: str = None, + ) -> None: + """Un-instrument a collection of Solidity files in place. + + :param file_list: List of paths to Solidity files to instrument + :param scribble_path: The path to the scribble executable + :param remappings: List of import remappings to pass to solc + :param solc_version: The solc compiler version to use + """ + + command = [scribble_path, "--disarm"] + if remappings: + command.append(f"--path-remapping={';'.join(remappings)}") + if solc_version: + command.append(f"--compiler-version={solc_version}") + command.extend(file_list) + + process = subprocess.run( + command, stdout=subprocess.PIPE, stderr=subprocess.PIPE + ) + ScribbleMixin._handle_scribble_error(process) diff --git a/mythx_cli/cli.py b/mythx_cli/cli.py index 5048b14..b2614fa 100644 --- a/mythx_cli/cli.py +++ b/mythx_cli/cli.py @@ -14,14 +14,14 @@ from mythx_cli.analysis.status import analysis_status from mythx_cli.analyze.command import analyze from mythx_cli.formatter import FORMAT_RESOLVER +from mythx_cli.fuzz.arm import fuzz_arm +from mythx_cli.fuzz.disarm import fuzz_disarm from mythx_cli.fuzz.run import fuzz_run from mythx_cli.fuzz.setup import fuzz_setup -from mythx_cli.fuzz.arm import fuzz_arm from mythx_cli.group.close import group_close from mythx_cli.group.list import group_list from mythx_cli.group.open import group_open from mythx_cli.group.status import group_status -from mythx_cli.project.list import project_list from mythx_cli.render.command import render from mythx_cli.util import update_context from mythx_cli.version.command import version @@ -193,7 +193,8 @@ def cli( ctx.obj["client"] = Client( username=username, password=password, middlewares=[toolname_mw] ) - else: + elif sys.argv[1] not in ("fuzz",): + # fuzz subcommand is exempt from API auth raise click.UsageError( ( "The trial user has been deprecated. You can still use the MythX CLI for free " @@ -284,6 +285,7 @@ def fuzz() -> None: fuzz.add_command(fuzz_setup) fuzz.add_command(fuzz_run) fuzz.add_command(fuzz_arm) +fuzz.add_command(fuzz_disarm) if __name__ == "__main__": diff --git a/mythx_cli/fuzz/arm.py b/mythx_cli/fuzz/arm.py index 7056843..ee7d770 100644 --- a/mythx_cli/fuzz/arm.py +++ b/mythx_cli/fuzz/arm.py @@ -1,10 +1,68 @@ import logging +from typing import Tuple import click +from mythx_cli.analyze.scribble import ScribbleMixin + LOGGER = logging.getLogger("mythx-cli") @click.command("arm") -def fuzz_arm(): - click.echo("Hello, arm!") +@click.argument("targets", default=None, nargs=-1, required=False) +@click.option( + "--scribble-path", + type=click.Path(exists=True), + default=None, + help="Path to a custom scribble executable (beta)", +) +@click.option( + "--remap-import", + type=click.STRING, + multiple=True, + help="Add a solc compilation import remapping", + default=None, +) +@click.option( + "--solc-version", + type=click.STRING, + help="The solc version to use for compilation", + default=None, +) +@click.pass_obj +def fuzz_arm( + ctx, targets, scribble_path: str, remap_import: Tuple[str], solc_version: str +) -> None: + """Prepare the target files for FaaS submission. + + \f + + This will run :code:`scribble --arm ...` on the given target files, + instrumenting their code in-place with scribble. Additionally, + solc parameters can be passed to get compilation to work. + + The following YAML context options are supported: + - analyze + - targets + - scribble-path + - remappings + - solc + + :param ctx: The context, mainly used to get YAML params + :param targets: Arguments passed to the `analyze` subcommand + :param scribble_path: Optional path to the scribble executable + :param remap_import: List of import remappings to pass on to solc + :param solc_version: The solc version to use for Solidity compilation + """ + analyze_config = ctx.get("analyze") + solc_version = solc_version or analyze_config.get("solc") or None + remap_import = remap_import or analyze_config.get("remappings") or [] + scribble_path = scribble_path or analyze_config.get("scribble-path") or "scribble" + targets = targets or analyze_config.get("targets") or None + + ScribbleMixin.instrument_solc_in_place( + file_list=targets, + scribble_path=scribble_path, + remappings=remap_import, + solc_version=solc_version, + ) diff --git a/mythx_cli/fuzz/disarm.py b/mythx_cli/fuzz/disarm.py new file mode 100644 index 0000000..a7fda4e --- /dev/null +++ b/mythx_cli/fuzz/disarm.py @@ -0,0 +1,68 @@ +import logging +from typing import Tuple + +import click + +from mythx_cli.analyze.scribble import ScribbleMixin + +LOGGER = logging.getLogger("mythx-cli") + + +@click.command("disarm") +@click.argument("targets", default=None, nargs=-1, required=False) +@click.option( + "--scribble-path", + type=click.Path(exists=True), + default=None, + help="Path to a custom scribble executable (beta)", +) +@click.option( + "--remap-import", + type=click.STRING, + multiple=True, + help="Add a solc compilation import remapping", + default=None, +) +@click.option( + "--solc-version", + type=click.STRING, + help="The solc version to use for compilation", + default=None, +) +@click.pass_obj +def fuzz_disarm( + ctx, targets, scribble_path: str, remap_import: Tuple[str], solc_version: str +) -> None: + """Revert the target files to their original, un-instrumented state. + + \f + + This will run :code:`scribble --disarm ...` on the given target files, + reverting their code in-place to their original state using scribble. + Additionally, solc parameters can be passed to get compilation to work. + + The following YAML context options are supported: + - analyze + - targets + - scribble-path + - remappings + - solc + + :param ctx: The context, mainly used to get YAML params + :param targets: Arguments passed to the `analyze` subcommand + :param scribble_path: Optional path to the scribble executable + :param remap_import: List of import remappings to pass on to solc + :param solc_version: The solc version to use for Solidity compilation + """ + analyze_config = ctx.get("analyze") + solc_version = solc_version or analyze_config.get("solc") or None + remap_import = remap_import or analyze_config.get("remappings") or [] + scribble_path = scribble_path or analyze_config.get("scribble-path") or "scribble" + targets = targets or analyze_config.get("targets") or None + + ScribbleMixin.disarm_solc_in_place( + file_list=targets, + scribble_path=scribble_path, + remappings=remap_import, + solc_version=solc_version, + ) From 3cf6431150dec5e28e592c65a81220eea1bd0f4f Mon Sep 17 00:00:00 2001 From: Dominik Muhs Date: Mon, 1 Mar 2021 11:12:58 +0100 Subject: [PATCH 06/41] Fix minor formatting issues --- Makefile | 4 ++-- mythx_cli/cli.py | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index f9d75b9..9bd2ffe 100644 --- a/Makefile +++ b/Makefile @@ -51,8 +51,8 @@ clean-test: ## remove test and coverage artifacts rm -fr .pytest_cache format: - isort -rc mythx_cli tests - black -t py37 mythx_cli tests + isort mythx_cli tests + black -t py38 mythx_cli tests lint: ## check style with flake8 flake8 mythx_cli tests diff --git a/mythx_cli/cli.py b/mythx_cli/cli.py index b2614fa..1b27ad2 100644 --- a/mythx_cli/cli.py +++ b/mythx_cli/cli.py @@ -22,6 +22,7 @@ from mythx_cli.group.list import group_list from mythx_cli.group.open import group_open from mythx_cli.group.status import group_status +from mythx_cli.project import project_list from mythx_cli.render.command import render from mythx_cli.util import update_context from mythx_cli.version.command import version @@ -223,8 +224,6 @@ def project() -> None: pass -from mythx_cli.project import project_list - LOGGER.debug("Registering project commands") project.add_command(project_list) From f328a70d68c3a2c18fe66536c17d8dfb226d7c28 Mon Sep 17 00:00:00 2001 From: Dominik Muhs Date: Mon, 1 Mar 2021 11:16:01 +0100 Subject: [PATCH 07/41] Update install make command --- Makefile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 9bd2ffe..c26668c 100644 --- a/Makefile +++ b/Makefile @@ -89,4 +89,5 @@ dist: clean ## builds source and wheel package ls -l dist install: clean ## install the package to the active Python's site-packages - python setup.py install + pip install -r requirements_dev.txt + pip install -e . From 46f27051facdaca89da39b7eace319b6beb9317f Mon Sep 17 00:00:00 2001 From: Dominik Muhs Date: Mon, 1 Mar 2021 12:01:43 +0100 Subject: [PATCH 08/41] Add notes on fuzz FaaS commands --- mythx_cli/cli.py | 2 -- mythx_cli/fuzz/arm.py | 8 ++++---- mythx_cli/fuzz/run.py | 23 +++++++++++++++++++++-- mythx_cli/fuzz/setup.py | 10 ---------- tests/test_fuzz.py | 2 +- 5 files changed, 26 insertions(+), 19 deletions(-) delete mode 100644 mythx_cli/fuzz/setup.py diff --git a/mythx_cli/cli.py b/mythx_cli/cli.py index 1b27ad2..2d6346f 100644 --- a/mythx_cli/cli.py +++ b/mythx_cli/cli.py @@ -17,7 +17,6 @@ from mythx_cli.fuzz.arm import fuzz_arm from mythx_cli.fuzz.disarm import fuzz_disarm from mythx_cli.fuzz.run import fuzz_run -from mythx_cli.fuzz.setup import fuzz_setup from mythx_cli.group.close import group_close from mythx_cli.group.list import group_list from mythx_cli.group.open import group_open @@ -281,7 +280,6 @@ def fuzz() -> None: LOGGER.debug("Registering fuzz commands") -fuzz.add_command(fuzz_setup) fuzz.add_command(fuzz_run) fuzz.add_command(fuzz_arm) fuzz.add_command(fuzz_disarm) diff --git a/mythx_cli/fuzz/arm.py b/mythx_cli/fuzz/arm.py index ee7d770..8cbe553 100644 --- a/mythx_cli/fuzz/arm.py +++ b/mythx_cli/fuzz/arm.py @@ -43,10 +43,10 @@ def fuzz_arm( The following YAML context options are supported: - analyze - - targets - - scribble-path - - remappings - - solc + - targets + - scribble-path + - remappings + - solc :param ctx: The context, mainly used to get YAML params :param targets: Arguments passed to the `analyze` subcommand diff --git a/mythx_cli/fuzz/run.py b/mythx_cli/fuzz/run.py index 3f3d4af..c97e842 100644 --- a/mythx_cli/fuzz/run.py +++ b/mythx_cli/fuzz/run.py @@ -6,5 +6,24 @@ @click.command("run") -def fuzz_run(): - click.echo("Hello, run!") +@click.pass_obj +def fuzz_run(ctx): + # read YAML config params from ctx dict, e.g. ganache rpc url + # Introduce a separate `fuzz` section in the YAML file + + # construct seed state from ganache + + # construct the FaaS campaign object + # helpful method: mythx_cli/analyze/solidity.py:SolidityJob.generate_payloads + # NOTE: This currently patches link placeholders in the creation + # bytecode with the zero address. If we need to submit bytecode from + # solc compilation, we need to find a way to replace these with the Ganache + # instance's addresses. Preferably we pull all of this data from Ganache + # itself and just enrich the payload with source and AST data from the + # SolidityJob payload list + + # submit the FaaS payload, do error handling + + # print FaaS dashbaord url pointing to campaign + + pass diff --git a/mythx_cli/fuzz/setup.py b/mythx_cli/fuzz/setup.py deleted file mode 100644 index 179af78..0000000 --- a/mythx_cli/fuzz/setup.py +++ /dev/null @@ -1,10 +0,0 @@ -import logging - -import click - -LOGGER = logging.getLogger("mythx-cli") - - -@click.command("setup") -def fuzz_setup(): - click.echo("Hello, setup!") diff --git a/tests/test_fuzz.py b/tests/test_fuzz.py index 18ea042..fdf2a97 100644 --- a/tests/test_fuzz.py +++ b/tests/test_fuzz.py @@ -4,7 +4,7 @@ from mythx_cli.cli import cli -@pytest.mark.parametrize("keyword", ("run", "setup", "arm")) +@pytest.mark.parametrize("keyword", ("run", "disarm", "arm", "run")) def test_fuzz_subcommands_present(keyword): runner = CliRunner() From 7946f2b1354c6b8d0b78f55b4a397bb495028f9c Mon Sep 17 00:00:00 2001 From: Joao Santos Date: Wed, 3 Mar 2021 16:02:17 +0000 Subject: [PATCH 09/41] sync --- .DS_Store | Bin 0 -> 6148 bytes mythx_cli/analyze/solidity.py | 2 +- mythx_cli/fuzz/run.py | 115 +++++++++++++++++++++++++++++++++- 3 files changed, 114 insertions(+), 3 deletions(-) create mode 100644 .DS_Store diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..41a14701bf406495e2529fa0224aee114ea7a61e GIT binary patch literal 6148 zcmeHKOG-mQ5Ue&?MBHTQa<1SFh7eDX0~k<`tS2f; z0V!~-z$CYG@Bi2IALjpKl6F!+3j8YtY`R=67ks7at)rLoUfbwvy4QTt-M9`4L$qUJ jv}10(9bZOK)-_-AycZ6ML1#YbMEwl7E;1?b*9v?Aznm4C literal 0 HcmV?d00001 diff --git a/mythx_cli/analyze/solidity.py b/mythx_cli/analyze/solidity.py index bade412..c401891 100644 --- a/mythx_cli/analyze/solidity.py +++ b/mythx_cli/analyze/solidity.py @@ -201,7 +201,7 @@ def generate_payloads( :param enable_scribble: Enable instrumentation with scribble :param scribble_path: Optional path to the scribble executable """ - + remappings = remappings or [] with open(self.target) as f: source = f.read() diff --git a/mythx_cli/fuzz/run.py b/mythx_cli/fuzz/run.py index c97e842..a34c5a0 100644 --- a/mythx_cli/fuzz/run.py +++ b/mythx_cli/fuzz/run.py @@ -1,13 +1,99 @@ import logging - +import requests import click +from mythx_cli.analyze.solidity import SolidityJob +import json LOGGER = logging.getLogger("mythx-cli") +rpc_url = "http://localhost:7545" + +headers = { + 'Content-Type': 'application/json' +} + +time_limit_seconds = 3000 + + +def rpc_call(method: str, params: str): + payload = "{\"jsonrpc\":\"2.0\",\"method\":\"" + method + "\",\"params\":" + params + ",\"id\":1}" + response = (requests.request("POST", rpc_url, headers=headers, data=payload)).json() + return response["result"] + + +def get_block(latest: bool = False, block_number: int = -1): + block_value = "latest" if latest else str(block_number) + if not latest: + block_value = hex(block_number) + + block = rpc_call("eth_getBlockByNumber", "[\"" + block_value + "\", true]") + if block is None: + return None + else: + return block + + +def get_all_blocks(): + latest_block = get_block(True) + if not latest_block: + return [] + + blocks = [] + for i in range(0, int(latest_block["number"], 16) + 1, 1): + blocks.append(get_block(block_number=i)) + return blocks + + +def get_seed_state(address: str, other_addresses: [str]): + blocks = get_all_blocks() + processed_transactions = [] + for block in blocks: + for transaction in block["transactions"]: + for key, value in dict(transaction).items(): + if value is None: + transaction[key] = "" + processed_transactions.append(transaction) + setup = dict({ + "address-under-test": address, + "steps": processed_transactions, + "other-addresses-under-test": other_addresses}) + return dict( + { + "time-limit-secs": time_limit_seconds, + "analysis-setup": setup, + "discovery-probability-threshold": 0.0, + "assertion-checking-mode": 1, + "emit-mythx-report": True + } + ) + + +def camel_case_payload(payload): + payload["mainSource"] = payload.pop("main_source") + payload["solcVersion"] = payload.pop("solc_version") + payload["contractName"] = payload.pop("contract_name") + payload["sourceMap"] = payload.pop("source_map") + payload["sourceList"] = payload.pop("source_list") + payload["deployedBytecode"] = payload.pop("deployed_bytecode") + payload["deployedSourceMap"] = payload.pop("deployed_source_map") + @click.command("run") +@click.option( + "-a", + "--address", + type=click.STRING, + help="Address of the main contract to analyze", +) +@click.option( + "-m", + "--more-addresses", + type=click.STRING, + help="Addresses of other contracts to analyze, separated by commas", +) +@click.argument("target", default=None, nargs=-1, required=False) @click.pass_obj -def fuzz_run(ctx): +def fuzz_run(ctx, address, more_addresses, target): # read YAML config params from ctx dict, e.g. ganache rpc url # Introduce a separate `fuzz` section in the YAML file @@ -26,4 +112,29 @@ def fuzz_run(ctx): # print FaaS dashbaord url pointing to campaign + contract_address = address + contract_code_response = rpc_call("eth_getCode", "[\"" + contract_address + "\",\"latest\"]") + + if contract_code_response is None: + print("Invalid address") + + if more_addresses is None: + other_addresses=[] + else: + other_addresses = more_addresses.split(',') + + seed_state = get_seed_state(contract_address, other_addresses) + payloads = [] + for t in target: + sol = SolidityJob(target=t) + sol.generate_payloads(version="0.6.12") + camel_case_payload(sol.payloads[0]) + payloads.append(sol.payloads[0]) + + data = { + "execution": seed_state, + "input": payloads + } + + print(json.dumps(data)) pass From 8b4adcd2d19c95978cd75bf3eacefd0ba16aac89 Mon Sep 17 00:00:00 2001 From: Joao Santos Date: Tue, 9 Mar 2021 09:08:06 +0000 Subject: [PATCH 10/41] creates brownie class --- mythx_cli/fuzz/brownie.py | 73 +++++++++++++++++++++++++++++++++++++++ mythx_cli/fuzz/run.py | 39 +++++++-------------- 2 files changed, 85 insertions(+), 27 deletions(-) create mode 100644 mythx_cli/fuzz/brownie.py diff --git a/mythx_cli/fuzz/brownie.py b/mythx_cli/fuzz/brownie.py new file mode 100644 index 0000000..3189b68 --- /dev/null +++ b/mythx_cli/fuzz/brownie.py @@ -0,0 +1,73 @@ +from pathlib import Path +import json +import os + + +class BrownieJob(): + def __init__(self, target: Path): + self.target = target + self.contracts = [] + self.sources = {} + self.build_files, self.build_files_by_source_file = self.find_brownie_artifacts() + self.payload = {} + + def find_brownie_artifacts(self): + build_files = {} + build_files_by_source_file = {} + build_dir = os.walk('build/contracts') + + for sub_dir in build_dir: + if len(sub_dir[2]) > 0: + # sub directory with .json files + file_prefix = sub_dir[0] + for file in sub_dir[2]: + file_name = file_prefix + "/" + file + with open(file_name) as json_file: + # load the build artifact + data = json.load(json_file) + # store it on a dictionary by file name + build_files[file_name] = data + source_path = data["sourcePath"] + # store it on a dictionary by source file name + if source_path not in build_files_by_source_file: + # initialize the array of contracts with a list + build_files_by_source_file[source_path] = [] + build_files_by_source_file[source_path].append(data) + return build_files, build_files_by_source_file + + def generate_payload(self, execution): + for t in self.target: + smart_contracts = self.build_files_by_source_file[t] + for contract in smart_contracts: + faas_contract_item = {} + faas_contract_item["sourcePaths"] = contract["allSourcePaths"] + faas_contract_item["deployedSourceMap"] = contract["deployedSourceMap"] + faas_contract_item["deployedBytecode"] = contract["deployedBytecode"] + faas_contract_item["sourceMap"] = contract["sourceMap"] + faas_contract_item["bytecode"] = contract["bytecode"] + faas_contract_item["contractName"] = contract["contractName"] + faas_contract_item["mainSourceFile"] = contract["sourcePath"] + + for file_index, source_file in contract["allSourcePaths"].items(): + if source_file in self.sources: + # print("File already included, skipping") + continue + faas_source_item = {} + faas_source_item["fileIndex"] = file_index + if source_file not in self.build_files_by_source_file: + # print(str(source_file)+ " not available") + continue + + # We can select any dict on the build_files_by_source_file[source_file] array + # because the .source and .ast values will be the same in all. + target_file = self.build_files_by_source_file[source_file][0] + faas_source_item["source"] = target_file["source"] + faas_source_item["ast"] = target_file["ast"] + self.sources[source_file] = faas_source_item + + self.contracts.append(faas_contract_item) + self.payload = { + "execution": execution, + "contracts": self.contracts, + "sources": self.sources + } diff --git a/mythx_cli/fuzz/run.py b/mythx_cli/fuzz/run.py index a34c5a0..d2f4d25 100644 --- a/mythx_cli/fuzz/run.py +++ b/mythx_cli/fuzz/run.py @@ -1,8 +1,10 @@ import logging +import os + import requests import click -from mythx_cli.analyze.solidity import SolidityJob import json +from .brownie import BrownieJob LOGGER = logging.getLogger("mythx-cli") @@ -14,7 +16,6 @@ time_limit_seconds = 3000 - def rpc_call(method: str, params: str): payload = "{\"jsonrpc\":\"2.0\",\"method\":\"" + method + "\",\"params\":" + params + ",\"id\":1}" response = (requests.request("POST", rpc_url, headers=headers, data=payload)).json() @@ -67,17 +68,6 @@ def get_seed_state(address: str, other_addresses: [str]): } ) - -def camel_case_payload(payload): - payload["mainSource"] = payload.pop("main_source") - payload["solcVersion"] = payload.pop("solc_version") - payload["contractName"] = payload.pop("contract_name") - payload["sourceMap"] = payload.pop("source_map") - payload["sourceList"] = payload.pop("source_list") - payload["deployedBytecode"] = payload.pop("deployed_bytecode") - payload["deployedSourceMap"] = payload.pop("deployed_source_map") - - @click.command("run") @click.option( "-a", @@ -124,17 +114,12 @@ def fuzz_run(ctx, address, more_addresses, target): other_addresses = more_addresses.split(',') seed_state = get_seed_state(contract_address, other_addresses) - payloads = [] - for t in target: - sol = SolidityJob(target=t) - sol.generate_payloads(version="0.6.12") - camel_case_payload(sol.payloads[0]) - payloads.append(sol.payloads[0]) - - data = { - "execution": seed_state, - "input": payloads - } - - print(json.dumps(data)) - pass + + # print(json.dumps(api_payload)) + brownie = BrownieJob(target) + brownie.generate_payload(seed_state) + + api_payload = brownie.payload + print(json.dumps(api_payload)) + +pass From dcfdbaaa3145f2866516394daa0aa251e0541d82 Mon Sep 17 00:00:00 2001 From: blitz-1306 Date: Wed, 10 Mar 2021 16:15:55 +0500 Subject: [PATCH 11/41] Add support for --instrumentation-metadata-file for a Scribble invocation during mythx fuzz arm --- mythx_cli/analyze/scribble.py | 33 +++++++++++++++++++++++++++++++-- mythx_cli/fuzz/run.py | 7 +++++++ 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/mythx_cli/analyze/scribble.py b/mythx_cli/analyze/scribble.py index cc3c44c..f1c4d37 100644 --- a/mythx_cli/analyze/scribble.py +++ b/mythx_cli/analyze/scribble.py @@ -1,4 +1,5 @@ import json +import os import subprocess import sys from collections import defaultdict @@ -6,6 +7,7 @@ import click +SCRIBBLE_ARMING_META_FILE = ".scribble-arming.meta.json" class ScribbleMixin: """A mixing for job objects to instrument code with Scribble.""" @@ -27,6 +29,7 @@ def _handle_scribble_error(process: subprocess.CompletedProcess) -> None: click.echo(process.stderr.decode()) click.echo("=====STDOUT=====") click.echo(process.stdout.decode()) + sys.exit(process.returncode) def instrument_truffle_artifacts( @@ -49,6 +52,7 @@ def instrument_truffle_artifacts( "source": file_data["source"], "id": payload["source_list"].index(filename), } + stdin["contracts"][filename][payload["contract_name"]] = { "evm": { "bytecode": { @@ -72,6 +76,7 @@ def instrument_truffle_artifacts( ) self._handle_scribble_error(process) + return json.loads(process.stdout.decode()) def instrument_solc_file( @@ -91,7 +96,9 @@ def instrument_solc_file( stdout=subprocess.PIPE, stderr=subprocess.PIPE, ) + self._handle_scribble_error(process) + return json.loads(process.stdout.decode()) @staticmethod @@ -108,17 +115,25 @@ def instrument_solc_in_place( :param remappings: List of import remappings to pass to solc :param solc_version: The solc compiler version to use """ + command = [ + scribble_path, + "--arm", + "--output-mode=files", + f"--instrumentation-metadata-file={SCRIBBLE_ARMING_META_FILE}" + ] - command = [scribble_path, "--arm", "--output-mode=files"] if remappings: command.append(f"--path-remapping={';'.join(remappings)}") + if solc_version: command.append(f"--compiler-version={solc_version}") + command.extend(file_list) process = subprocess.run( command, stdout=subprocess.PIPE, stderr=subprocess.PIPE ) + ScribbleMixin._handle_scribble_error(process) @staticmethod @@ -135,15 +150,29 @@ def disarm_solc_in_place( :param remappings: List of import remappings to pass to solc :param solc_version: The solc compiler version to use """ - command = [scribble_path, "--disarm"] + if remappings: command.append(f"--path-remapping={';'.join(remappings)}") + if solc_version: command.append(f"--compiler-version={solc_version}") + command.extend(file_list) + if os.path.isfile(SCRIBBLE_ARMING_META_FILE): + os.remove(SCRIBBLE_ARMING_META_FILE) + process = subprocess.run( command, stdout=subprocess.PIPE, stderr=subprocess.PIPE ) + ScribbleMixin._handle_scribble_error(process) + + @staticmethod + def get_arming_instr_meta(): + if os.path.exists(SCRIBBLE_ARMING_META_FILE): + with open(SCRIBBLE_ARMING_META_FILE, 'r') as f: + return json.load(f) + + return None diff --git a/mythx_cli/fuzz/run.py b/mythx_cli/fuzz/run.py index d2f4d25..635d2e0 100644 --- a/mythx_cli/fuzz/run.py +++ b/mythx_cli/fuzz/run.py @@ -6,6 +6,8 @@ import json from .brownie import BrownieJob +from mythx_cli.analyze.scribble import ScribbleMixin + LOGGER = logging.getLogger("mythx-cli") rpc_url = "http://localhost:7545" @@ -120,6 +122,11 @@ def fuzz_run(ctx, address, more_addresses, target): brownie.generate_payload(seed_state) api_payload = brownie.payload + instr_meta = ScribbleMixin.get_arming_instr_meta() + + if instr_meta is not None: + api_payload["instrumentation_metadata"] = instr_meta + print(json.dumps(api_payload)) pass From f3cc7f1560bd30af46d411e351514efcfe650005 Mon Sep 17 00:00:00 2001 From: Joao Santos Date: Thu, 11 Mar 2021 10:57:25 +0000 Subject: [PATCH 12/41] feat: adds support for directories as targets and config file parameters for fuzz --- mythx_cli/cli.py | 6 +++-- mythx_cli/fuzz/brownie.py | 48 +++++++++++++++++++++++++++++++++------ mythx_cli/fuzz/run.py | 12 ++++------ 3 files changed, 50 insertions(+), 16 deletions(-) diff --git a/mythx_cli/cli.py b/mythx_cli/cli.py index 2d6346f..8bb63c7 100644 --- a/mythx_cli/cli.py +++ b/mythx_cli/cli.py @@ -164,9 +164,10 @@ def cli( else: parsed_config = {"analyze": {}} - # The analyze context is updated separately in the command + # The analyze/fuzz context is updated separately in the command # implementation ctx.obj["analyze"] = parsed_config.get("analyze", {}) + ctx.obj["fuzz"] = parsed_config.get("fuzz", {}) # overwrite context with top-level YAML config keys if necessary update_context(ctx.obj, "ci", parsed_config, "ci", False) @@ -193,7 +194,8 @@ def cli( ctx.obj["client"] = Client( username=username, password=password, middlewares=[toolname_mw] ) - elif sys.argv[1] not in ("fuzz",): + #elif sys.argv[1] not in ("fuzz",): + elif "fuzz" not in sys.argv: # fuzz subcommand is exempt from API auth raise click.UsageError( ( diff --git a/mythx_cli/fuzz/brownie.py b/mythx_cli/fuzz/brownie.py index 3189b68..3d40248 100644 --- a/mythx_cli/fuzz/brownie.py +++ b/mythx_cli/fuzz/brownie.py @@ -1,26 +1,60 @@ from pathlib import Path import json import os - +import logging +import click +LOGGER = logging.getLogger("mythx-cli") class BrownieJob(): - def __init__(self, target: Path): + def __init__(self, target: Path, build_dir: Path): self.target = target + self.build_dir = build_dir + self.source_files_paths = [] self.contracts = [] self.sources = {} self.build_files, self.build_files_by_source_file = self.find_brownie_artifacts() self.payload = {} + for t in target: + self.find_solidity_files(t) + # removing the duplicates + self.source_files_paths = list(set(self.source_files_paths)) + LOGGER.debug(f"Found {str(len(self.source_files_paths))} solidity files") + + + def find_solidity_files(self, target_item: str): + if target_item.endswith('.sol'): + if not os.path.isfile(target_item): + raise click.exceptions.UsageError( + "Could not find "+str(target_item)+". Did you pass the correct directory?" + ) + else: + self.source_files_paths.append(target_item) + source_dir = os.walk(target_item) + for sub_dir in source_dir: + if len(sub_dir[2]) > 0: + # sub directory with .json files + file_prefix = sub_dir[0] + for file in sub_dir[2]: + if not file.endswith(".sol"): + LOGGER.debug(f"Skipped for not being a solidity file: {file}") + continue + file_name = file_prefix + "/" + file + LOGGER.debug(f"Found solidity file: {file_name}") + self.source_files_paths.append(file_name) + def find_brownie_artifacts(self): build_files = {} build_files_by_source_file = {} - build_dir = os.walk('build/contracts') + build_dir = os.walk(self.build_dir) for sub_dir in build_dir: if len(sub_dir[2]) > 0: # sub directory with .json files file_prefix = sub_dir[0] for file in sub_dir[2]: + if not file.endswith(".json"): + continue file_name = file_prefix + "/" + file with open(file_name) as json_file: # load the build artifact @@ -36,8 +70,8 @@ def find_brownie_artifacts(self): return build_files, build_files_by_source_file def generate_payload(self, execution): - for t in self.target: - smart_contracts = self.build_files_by_source_file[t] + for source_file in self.source_files_paths: + smart_contracts = self.build_files_by_source_file[source_file] for contract in smart_contracts: faas_contract_item = {} faas_contract_item["sourcePaths"] = contract["allSourcePaths"] @@ -50,12 +84,12 @@ def generate_payload(self, execution): for file_index, source_file in contract["allSourcePaths"].items(): if source_file in self.sources: - # print("File already included, skipping") + LOGGER.debug(f"{source_file} already included, skipping.") continue faas_source_item = {} faas_source_item["fileIndex"] = file_index if source_file not in self.build_files_by_source_file: - # print(str(source_file)+ " not available") + LOGGER.debug(f"{source_file} not found.") continue # We can select any dict on the build_files_by_source_file[source_file] array diff --git a/mythx_cli/fuzz/run.py b/mythx_cli/fuzz/run.py index d2f4d25..f03c998 100644 --- a/mythx_cli/fuzz/run.py +++ b/mythx_cli/fuzz/run.py @@ -69,6 +69,7 @@ def get_seed_state(address: str, other_addresses: [str]): ) @click.command("run") +@click.argument("target", default=None, nargs=-1, required=False) @click.option( "-a", "--address", @@ -81,7 +82,7 @@ def get_seed_state(address: str, other_addresses: [str]): type=click.STRING, help="Addresses of other contracts to analyze, separated by commas", ) -@click.argument("target", default=None, nargs=-1, required=False) + @click.pass_obj def fuzz_run(ctx, address, more_addresses, target): # read YAML config params from ctx dict, e.g. ganache rpc url @@ -101,8 +102,8 @@ def fuzz_run(ctx, address, more_addresses, target): # submit the FaaS payload, do error handling # print FaaS dashbaord url pointing to campaign - - contract_address = address + analyze_config = ctx.get("fuzz") + contract_address = analyze_config["deployed_contract_address"] contract_code_response = rpc_call("eth_getCode", "[\"" + contract_address + "\",\"latest\"]") if contract_code_response is None: @@ -114,11 +115,8 @@ def fuzz_run(ctx, address, more_addresses, target): other_addresses = more_addresses.split(',') seed_state = get_seed_state(contract_address, other_addresses) - - # print(json.dumps(api_payload)) - brownie = BrownieJob(target) + brownie = BrownieJob(target, analyze_config["build_directory"]) brownie.generate_payload(seed_state) - api_payload = brownie.payload print(json.dumps(api_payload)) From da61537950b12a2a4d352ae48c35bff00cf5c190 Mon Sep 17 00:00:00 2001 From: Joao Santos Date: Fri, 12 Mar 2021 15:18:34 +0000 Subject: [PATCH 13/41] feat: adds support for directories as targets on fuzz arm and disarm commands --- mythx_cli/analyze/scribble.py | 25 +++++++++++++++++++++-- mythx_cli/fuzz/brownie.py | 25 +++++------------------ mythx_cli/fuzz/run.py | 10 ++++++++- mythx_cli/util.py | 38 ++++++++++++++++++++++++++++++++++- 4 files changed, 74 insertions(+), 24 deletions(-) diff --git a/mythx_cli/analyze/scribble.py b/mythx_cli/analyze/scribble.py index f1c4d37..7e92a3d 100644 --- a/mythx_cli/analyze/scribble.py +++ b/mythx_cli/analyze/scribble.py @@ -7,8 +7,11 @@ import click +from mythx_cli.util import sol_files_by_directory + SCRIBBLE_ARMING_META_FILE = ".scribble-arming.meta.json" + class ScribbleMixin: """A mixing for job objects to instrument code with Scribble.""" @@ -128,7 +131,16 @@ def instrument_solc_in_place( if solc_version: command.append(f"--compiler-version={solc_version}") - command.extend(file_list) + # Scribble doesnt currently support directories as inputs + # so we create a list of all solidity files inside each of the targets + # and submit that to Scribble. + + sol_files = [] + for file in file_list: + target_files = sol_files_by_directory(file) + sol_files = [*sol_files, *target_files] + + command.extend(sol_files) process = subprocess.run( command, stdout=subprocess.PIPE, stderr=subprocess.PIPE @@ -158,7 +170,16 @@ def disarm_solc_in_place( if solc_version: command.append(f"--compiler-version={solc_version}") - command.extend(file_list) + # Scribble doesnt currently support directories as inputs + # so we create a list of all solidity files inside each of the targets + # and submit that to Scribble. + + sol_files = [] + for file in file_list: + target_files = sol_files_by_directory(file) + sol_files = [*sol_files, *target_files] + + command.extend(sol_files) if os.path.isfile(SCRIBBLE_ARMING_META_FILE): os.remove(SCRIBBLE_ARMING_META_FILE) diff --git a/mythx_cli/fuzz/brownie.py b/mythx_cli/fuzz/brownie.py index 3d40248..b832c2b 100644 --- a/mythx_cli/fuzz/brownie.py +++ b/mythx_cli/fuzz/brownie.py @@ -3,8 +3,12 @@ import os import logging import click + LOGGER = logging.getLogger("mythx-cli") +from mythx_cli.util import sol_files_by_directory + + class BrownieJob(): def __init__(self, target: Path, build_dir: Path): self.target = target @@ -21,27 +25,8 @@ def __init__(self, target: Path, build_dir: Path): self.source_files_paths = list(set(self.source_files_paths)) LOGGER.debug(f"Found {str(len(self.source_files_paths))} solidity files") - def find_solidity_files(self, target_item: str): - if target_item.endswith('.sol'): - if not os.path.isfile(target_item): - raise click.exceptions.UsageError( - "Could not find "+str(target_item)+". Did you pass the correct directory?" - ) - else: - self.source_files_paths.append(target_item) - source_dir = os.walk(target_item) - for sub_dir in source_dir: - if len(sub_dir[2]) > 0: - # sub directory with .json files - file_prefix = sub_dir[0] - for file in sub_dir[2]: - if not file.endswith(".sol"): - LOGGER.debug(f"Skipped for not being a solidity file: {file}") - continue - file_name = file_prefix + "/" + file - LOGGER.debug(f"Found solidity file: {file_name}") - self.source_files_paths.append(file_name) + self.source_files_paths = sol_files_by_directory(target_item) def find_brownie_artifacts(self): build_files = {} diff --git a/mythx_cli/fuzz/run.py b/mythx_cli/fuzz/run.py index 69c51ec..e9e7ee8 100644 --- a/mythx_cli/fuzz/run.py +++ b/mythx_cli/fuzz/run.py @@ -119,7 +119,15 @@ def fuzz_run(ctx, address, more_addresses, target): seed_state = get_seed_state(contract_address, other_addresses) brownie = BrownieJob(target, analyze_config["build_directory"]) brownie.generate_payload(seed_state) - api_payload = brownie.payload + + api_payload = {"name": "default_name", "parameters": {}} + api_payload["parameters"]["discovery-probability-threshold"]=seed_state["discovery-probability-threshold"] + api_payload["parameters"]["assertion-checking-mode"]=seed_state["assertion-checking-mode"] + api_payload["corpus"] = seed_state["analysis-setup"] + + api_payload["sources"] = brownie.payload["sources"] + api_payload["contracts"] = brownie.payload["contracts"] + instr_meta = ScribbleMixin.get_arming_instr_meta() if instr_meta is not None: diff --git a/mythx_cli/util.py b/mythx_cli/util.py index fae6b90..e0c2c36 100644 --- a/mythx_cli/util.py +++ b/mythx_cli/util.py @@ -1,6 +1,7 @@ import logging +import os from collections import defaultdict -from typing import Any, List, Optional, Tuple +from typing import Any, List, Optional, Tuple, AnyStr import click from mythx_models.response import AnalysisInputResponse, DetectedIssuesResponse @@ -248,3 +249,38 @@ def write_or_print(ctx, data: str, mode="a+") -> None: with open(ctx["output"], mode) as outfile: LOGGER.debug(f"Writing data to {ctx['output']}") outfile.write(data + "\n") + + +def sol_files_by_directory(target_path: AnyStr) -> List: + """Gathers all the solidity files inside the target path + including sub-directories and returns them as a List. + Non solidity files are ignored. + + :param target_path: The directory to look for .sol files + :return: + """ + sol_files = [] + # We start by checking if the target_path is potentially a .sol file + if target_path.endswith('.sol'): + # If .sol file we check if the target exists or if it's a user input error + if not os.path.isfile(target_path): + raise click.exceptions.UsageError( + "Could not find " + str(target_path) + ". Did you pass the correct directory?" + ) + else: + # If it's a valid .sol file there is no need to search further and we just append it to our + # List to be returned + sol_files.append(target_path) + source_dir = os.walk(target_path) + for sub_dir in source_dir: + if len(sub_dir[2]) > 0: + # sub directory with .sol files + file_prefix = sub_dir[0] + for file in sub_dir[2]: + if not file.endswith(".sol"): + LOGGER.debug(f"Skipped for not being a solidity file: {file}") + continue + file_name = file_prefix + "/" + file + LOGGER.debug(f"Found solidity file: {file_name}") + sol_files.append(file_name) + return sol_files From d7dcd1818748bddf2fcb6eeabc30539e80c6bf55 Mon Sep 17 00:00:00 2001 From: Joao Santos Date: Thu, 18 Mar 2021 16:08:25 +0000 Subject: [PATCH 14/41] refactor rpc logic into separate class feat: add rpc_url and faas_url as config file options feat: create and start campaign with fuzz run command feat: print url with faas frontend report link --- mythx_cli/fuzz/brownie.py | 1 + mythx_cli/fuzz/rpc.py | 72 ++++++++++++++++++++++++++++ mythx_cli/fuzz/run.py | 99 +++++++++++++++++---------------------- 3 files changed, 115 insertions(+), 57 deletions(-) create mode 100644 mythx_cli/fuzz/rpc.py diff --git a/mythx_cli/fuzz/brownie.py b/mythx_cli/fuzz/brownie.py index b832c2b..594febf 100644 --- a/mythx_cli/fuzz/brownie.py +++ b/mythx_cli/fuzz/brownie.py @@ -31,6 +31,7 @@ def find_solidity_files(self, target_item: str): def find_brownie_artifacts(self): build_files = {} build_files_by_source_file = {} + # we search on Brownie's build directory build_dir = os.walk(self.build_dir) for sub_dir in build_dir: diff --git a/mythx_cli/fuzz/rpc.py b/mythx_cli/fuzz/rpc.py new file mode 100644 index 0000000..0db1067 --- /dev/null +++ b/mythx_cli/fuzz/rpc.py @@ -0,0 +1,72 @@ +from pathlib import Path +import json +import os +import logging +import click +import requests + +LOGGER = logging.getLogger("mythx-cli") + +headers = { + 'Content-Type': 'application/json' +} +time_limit_seconds = 3000 + + +class RPCClient(): + def __init__(self, rpc_url: str): + self.rpc_url = rpc_url + + + def rpc_call(self, method: str, params: str): + payload = "{\"jsonrpc\":\"2.0\",\"method\":\"" + method + "\",\"params\":" + params + ",\"id\":1}" + response = (requests.request("POST", self.rpc_url, headers=headers, data=payload)).json() + return response["result"] + + + def get_block(self, latest: bool = False, block_number: int = -1): + block_value = "latest" if latest else str(block_number) + if not latest: + block_value = hex(block_number) + + block = self.rpc_call("eth_getBlockByNumber", "[\"" + block_value + "\", true]") + if block is None: + return None + else: + return block + + + def get_all_blocks(self): + latest_block = self.get_block(latest=True) + if not latest_block: + return [] + + blocks = [] + for i in range(0, int(latest_block["number"], 16) + 1, 1): + blocks.append(self.get_block(block_number=i)) + return blocks + + + def get_seed_state(self, address: str, other_addresses: [str], number_of_cores: int): + blocks = self.get_all_blocks() + processed_transactions = [] + for block in blocks: + for transaction in block["transactions"]: + for key, value in dict(transaction).items(): + if value is None: + transaction[key] = "" + processed_transactions.append(transaction) + setup = dict({ + "address-under-test": address, + "steps": processed_transactions, + "other-addresses-under-test": other_addresses}) + return dict( + { + "time-limit-secs": time_limit_seconds, + "analysis-setup": setup, + "discovery-probability-threshold": 0.0, + "assertion-checking-mode": 1, + "emit-mythx-report": True, + "num-cores": number_of_cores + } + ) diff --git a/mythx_cli/fuzz/run.py b/mythx_cli/fuzz/run.py index e9e7ee8..3fc70c7 100644 --- a/mythx_cli/fuzz/run.py +++ b/mythx_cli/fuzz/run.py @@ -1,74 +1,33 @@ import logging import os +import random +import string import requests import click import json from .brownie import BrownieJob +from .rpc import RPCClient from mythx_cli.analyze.scribble import ScribbleMixin LOGGER = logging.getLogger("mythx-cli") -rpc_url = "http://localhost:7545" - headers = { 'Content-Type': 'application/json' } time_limit_seconds = 3000 -def rpc_call(method: str, params: str): - payload = "{\"jsonrpc\":\"2.0\",\"method\":\"" + method + "\",\"params\":" + params + ",\"id\":1}" - response = (requests.request("POST", rpc_url, headers=headers, data=payload)).json() - return response["result"] - +def start_faas_campaign(payload, faas_url): + response = (requests.request("POST", faas_url+"/api/campaigns?start_immediately=true", headers=headers, data=payload)).json() + return response["id"] -def get_block(latest: bool = False, block_number: int = -1): - block_value = "latest" if latest else str(block_number) - if not latest: - block_value = hex(block_number) - block = rpc_call("eth_getBlockByNumber", "[\"" + block_value + "\", true]") - if block is None: - return None - else: - return block - - -def get_all_blocks(): - latest_block = get_block(True) - if not latest_block: - return [] - - blocks = [] - for i in range(0, int(latest_block["number"], 16) + 1, 1): - blocks.append(get_block(block_number=i)) - return blocks - - -def get_seed_state(address: str, other_addresses: [str]): - blocks = get_all_blocks() - processed_transactions = [] - for block in blocks: - for transaction in block["transactions"]: - for key, value in dict(transaction).items(): - if value is None: - transaction[key] = "" - processed_transactions.append(transaction) - setup = dict({ - "address-under-test": address, - "steps": processed_transactions, - "other-addresses-under-test": other_addresses}) - return dict( - { - "time-limit-secs": time_limit_seconds, - "analysis-setup": setup, - "discovery-probability-threshold": 0.0, - "assertion-checking-mode": 1, - "emit-mythx-report": True - } - ) +def generate_campaign_name (prefix: str): + letters = string.ascii_lowercase + random_string = ''.join(random.choice(letters) for i in range(5)) + return str(prefix+"_"+random_string) @click.command("run") @click.argument("target", default=None, nargs=-1, required=False) @@ -103,10 +62,28 @@ def fuzz_run(ctx, address, more_addresses, target): # submit the FaaS payload, do error handling - # print FaaS dashbaord url pointing to campaign + # print FaaS dashboard url pointing to campaign analyze_config = ctx.get("fuzz") + contract_address = analyze_config["deployed_contract_address"] - contract_code_response = rpc_call("eth_getCode", "[\"" + contract_address + "\",\"latest\"]") + + + + rpc_url = "http://localhost:7545" + faas_url = "http://localhost:8080" + + if 'rpc_url' in analyze_config.keys(): + rpc_url = analyze_config["rpc_url"] + + if 'faas_url' in analyze_config.keys(): + faas_url = analyze_config["faas_url"] + + rpc_client = RPCClient(rpc_url) + + number_of_cores = 2 + if 'number_of_cores' in analyze_config.keys(): + number_of_cores = analyze_config["number_of_cores"] + contract_code_response = rpc_client.rpc_call("eth_getCode", "[\"" + contract_address + "\",\"latest\"]") if contract_code_response is None: print("Invalid address") @@ -116,12 +93,20 @@ def fuzz_run(ctx, address, more_addresses, target): else: other_addresses = more_addresses.split(',') - seed_state = get_seed_state(contract_address, other_addresses) + seed_state = rpc_client.get_seed_state(contract_address, other_addresses, number_of_cores) brownie = BrownieJob(target, analyze_config["build_directory"]) brownie.generate_payload(seed_state) - api_payload = {"name": "default_name", "parameters": {}} + + api_payload = {"parameters": {}} + + # We set the name for the campaign if there is a prefix in the config file + # If no prefix is configured, we don't include a name in the request, and the API generates one. + if "campaign_name_prefix" in analyze_config: + api_payload["name"] = generate_campaign_name((analyze_config["campaign_name_prefix"])) + api_payload["parameters"]["discovery-probability-threshold"]=seed_state["discovery-probability-threshold"] + api_payload["parameters"]["num-cores"]=seed_state["num-cores"] api_payload["parameters"]["assertion-checking-mode"]=seed_state["assertion-checking-mode"] api_payload["corpus"] = seed_state["analysis-setup"] @@ -133,6 +118,6 @@ def fuzz_run(ctx, address, more_addresses, target): if instr_meta is not None: api_payload["instrumentation_metadata"] = instr_meta - print(json.dumps(api_payload)) - + campaign_id = start_faas_campaign(json.dumps(api_payload), faas_url) + print("You can view campaign here: "+ faas_url+"/campaigns/"+str(campaign_id)) pass From f1c4c5d967e552b1b9b306259be17ba5760e614f Mon Sep 17 00:00:00 2001 From: Joao Santos Date: Thu, 18 Mar 2021 17:11:42 +0000 Subject: [PATCH 15/41] fix: issue with __scrible_* file --- mythx_cli/fuzz/run.py | 6 +++++- mythx_cli/util.py | 4 ++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/mythx_cli/fuzz/run.py b/mythx_cli/fuzz/run.py index 3fc70c7..a715ce6 100644 --- a/mythx_cli/fuzz/run.py +++ b/mythx_cli/fuzz/run.py @@ -45,7 +45,7 @@ def generate_campaign_name (prefix: str): ) @click.pass_obj -def fuzz_run(ctx, address, more_addresses, target): +def fuzz_run(ctx, address, more_addresses, target ): # read YAML config params from ctx dict, e.g. ganache rpc url # Introduce a separate `fuzz` section in the YAML file @@ -118,6 +118,10 @@ def fuzz_run(ctx, address, more_addresses, target): if instr_meta is not None: api_payload["instrumentation_metadata"] = instr_meta + campaign_id = start_faas_campaign(json.dumps(api_payload), faas_url) print("You can view campaign here: "+ faas_url+"/campaigns/"+str(campaign_id)) + + # print(json.dumps(api_payload)) + pass diff --git a/mythx_cli/util.py b/mythx_cli/util.py index e0c2c36..b65e76e 100644 --- a/mythx_cli/util.py +++ b/mythx_cli/util.py @@ -277,6 +277,10 @@ def sol_files_by_directory(target_path: AnyStr) -> List: # sub directory with .sol files file_prefix = sub_dir[0] for file in sub_dir[2]: + if "__scribble_" in file: + LOGGER.debug(f"Skipped for being a scribble file {file}") + continue + if not file.endswith(".sol"): LOGGER.debug(f"Skipped for not being a solidity file: {file}") continue From 8d5edefc97c4f0b50704d68bd740e70b5104622a Mon Sep 17 00:00:00 2001 From: Joao Santos Date: Wed, 24 Mar 2021 13:26:21 +0000 Subject: [PATCH 16/41] feat: add error messages for bad configs refactor faas api interaction --- mythx_cli/fuzz/faas.py | 65 ++++++++++++++++++++++++ mythx_cli/fuzz/rpc.py | 82 +++++++++++++++++++----------- mythx_cli/fuzz/run.py | 111 ++++++++++++++++++++++------------------- 3 files changed, 179 insertions(+), 79 deletions(-) create mode 100644 mythx_cli/fuzz/faas.py diff --git a/mythx_cli/fuzz/faas.py b/mythx_cli/fuzz/faas.py new file mode 100644 index 0000000..b143f3a --- /dev/null +++ b/mythx_cli/fuzz/faas.py @@ -0,0 +1,65 @@ +import logging +import random +from mythx_cli.analyze.scribble import ScribbleMixin +import click +import requests +import json +import string + +LOGGER = logging.getLogger("mythx-cli") + +headers = { + 'Content-Type': 'application/json' +} + + +class FaasClient(): + def __init__(self, faas_url, campaign_name_prefix, project_type): + self.faas_url = faas_url + self.campaign_name_prefix = campaign_name_prefix + self.project_type = project_type + + def generate_campaign_name(self): + """Generates a random campaign name, starting with the provided + campaign name prefix, followed by 5 random characters, ensuring + each campaign has a unique name. + """ + letters = string.ascii_lowercase + random_string = ''.join(random.choice(letters) for i in range(5)) + return str(self.campaign_name_prefix + "_" + random_string) + + def start_faas_campaign(self, payload): + response = (requests.request("POST", self.faas_url + "/api/campaigns?start_immediately=true", headers=headers, + data=payload)).json() + return response["id"] + + def create_faas_campaign(self, campaign_data, seed_state): + """ A FaaS campaign creation request requires 3 fields: + - sources: dictionary of source code and AST of source files, indexed by file name + - corpus: Harvey's seed state + - parameters: Harvey's configuration settings + - contracts: contract build artifacts (bytecode, sourcemap, etc) + For full docs visit {faas_url}/docs#operation/list_campaigns_api_campaigns__get + """ + if self.project_type != 'brownie': + raise click.exceptions.UsageError("Currently only Brownie projects are supported") + + api_payload = {"parameters": {}} + api_payload["name"] = self.generate_campaign_name() + api_payload["parameters"]["discovery-probability-threshold"] = seed_state["discovery-probability-threshold"] + api_payload["parameters"]["num-cores"] = seed_state["num-cores"] + api_payload["parameters"]["assertion-checking-mode"] = seed_state["assertion-checking-mode"] + api_payload["corpus"] = seed_state["analysis-setup"] + + api_payload["sources"] = campaign_data.payload["sources"] + api_payload["contracts"] = campaign_data.payload["contracts"] + + instr_meta = ScribbleMixin.get_arming_instr_meta() + + if instr_meta is not None: + api_payload["instrumentation_metadata"] = instr_meta + + #print(json.dumps(api_payload)) + campaign_id = self.start_faas_campaign(json.dumps(api_payload)) + + return campaign_id diff --git a/mythx_cli/fuzz/rpc.py b/mythx_cli/fuzz/rpc.py index 0db1067..a308b49 100644 --- a/mythx_cli/fuzz/rpc.py +++ b/mythx_cli/fuzz/rpc.py @@ -11,19 +11,22 @@ 'Content-Type': 'application/json' } time_limit_seconds = 3000 - +NUM_BLOCKS_UPPER_LIMIT = 9999 class RPCClient(): - def __init__(self, rpc_url: str): + def __init__(self, rpc_url: str, number_of_cores: int): self.rpc_url = rpc_url + self.number_of_cores = number_of_cores + """Makes an rpc call to the RPC endpoint passed to the construcotr + and returns the `result` property of the rpc response. + """ def rpc_call(self, method: str, params: str): payload = "{\"jsonrpc\":\"2.0\",\"method\":\"" + method + "\",\"params\":" + params + ",\"id\":1}" response = (requests.request("POST", self.rpc_url, headers=headers, data=payload)).json() return response["result"] - def get_block(self, latest: bool = False, block_number: int = -1): block_value = "latest" if latest else str(block_number) if not latest: @@ -35,38 +38,61 @@ def get_block(self, latest: bool = False, block_number: int = -1): else: return block + """Returns all the blocks that exist on the target + ethereum node. Raises an exception if the number of blocks + exceeds 10000 as it is likely a user error who passed the wrong + RPC address. + """ def get_all_blocks(self): latest_block = self.get_block(latest=True) if not latest_block: return [] + num_of_blocks = int(latest_block["number"], 16) + 1 + if num_of_blocks > NUM_BLOCKS_UPPER_LIMIT: + raise click.exceptions.UsageError( + "Number of blocks existing on the ethereum node running at" + + str(self.rpc_url) + "can not exceed 10000. Did you pass the correct RPC url?" + ) blocks = [] - for i in range(0, int(latest_block["number"], 16) + 1, 1): + for i in range(0, num_of_blocks, 1): blocks.append(self.get_block(block_number=i)) return blocks - - def get_seed_state(self, address: str, other_addresses: [str], number_of_cores: int): - blocks = self.get_all_blocks() - processed_transactions = [] - for block in blocks: - for transaction in block["transactions"]: - for key, value in dict(transaction).items(): - if value is None: - transaction[key] = "" - processed_transactions.append(transaction) - setup = dict({ - "address-under-test": address, - "steps": processed_transactions, - "other-addresses-under-test": other_addresses}) - return dict( - { - "time-limit-secs": time_limit_seconds, - "analysis-setup": setup, - "discovery-probability-threshold": 0.0, - "assertion-checking-mode": 1, - "emit-mythx-report": True, - "num-cores": number_of_cores - } - ) + """Returns a seed state for the target contract in a format that can be used by + the FaaS API and Harvey. + """ + def get_seed_state(self, address: str, other_addresses: [str]): + try: + blocks = self.get_all_blocks() + processed_transactions = [] + for block in blocks: + for transaction in block["transactions"]: + for key, value in dict(transaction).items(): + if value is None: + transaction[key] = "" + processed_transactions.append(transaction) + setup = dict({ + "address-under-test": address, + "steps": processed_transactions, + "other-addresses-under-test": other_addresses}) + return dict( + { + "time-limit-secs": time_limit_seconds, + "analysis-setup": setup, + "discovery-probability-threshold": 0.0, + "assertion-checking-mode": 1, + "emit-mythx-report": True, + "num-cores": self.number_of_cores + } + ) + except: + LOGGER.warning(f"Could generate seed state for address: {address}") + click.echo( + ( + "Unable to generate the seed state for address" + + str(address) + + "Are you sure you passed the correct contract address?" + ) + ) diff --git a/mythx_cli/fuzz/run.py b/mythx_cli/fuzz/run.py index a715ce6..1459f48 100644 --- a/mythx_cli/fuzz/run.py +++ b/mythx_cli/fuzz/run.py @@ -6,8 +6,9 @@ import requests import click import json -from .brownie import BrownieJob -from .rpc import RPCClient +from .brownie import BrownieJob +from .faas import FaasClient +from .rpc import RPCClient from mythx_cli.analyze.scribble import ScribbleMixin @@ -19,15 +20,18 @@ time_limit_seconds = 3000 + def start_faas_campaign(payload, faas_url): - response = (requests.request("POST", faas_url+"/api/campaigns?start_immediately=true", headers=headers, data=payload)).json() + response = (requests.request("POST", faas_url + "/api/campaigns?start_immediately=true", headers=headers, + data=payload)).json() return response["id"] -def generate_campaign_name (prefix: str): +def generate_campaign_name(prefix: str): letters = string.ascii_lowercase random_string = ''.join(random.choice(letters) for i in range(5)) - return str(prefix+"_"+random_string) + return str(prefix + "_" + random_string) + @click.command("run") @click.argument("target", default=None, nargs=-1, required=False) @@ -43,9 +47,8 @@ def generate_campaign_name (prefix: str): type=click.STRING, help="Addresses of other contracts to analyze, separated by commas", ) - @click.pass_obj -def fuzz_run(ctx, address, more_addresses, target ): +def fuzz_run(ctx, address, more_addresses, target): # read YAML config params from ctx dict, e.g. ganache rpc url # Introduce a separate `fuzz` section in the YAML file @@ -67,61 +70,67 @@ def fuzz_run(ctx, address, more_addresses, target ): contract_address = analyze_config["deployed_contract_address"] + default_config = { + "rpc_url": "http://localhost:7545", + "faas_url": "http://localhost:8080", + "harvey_num_cores": 2, + "campaign_name_prefix": "untitled" + + } + config_options = analyze_config.keys() + # Mandatory config parameters verification + if "build_directory" not in config_options: + raise click.exceptions.UsageError( + "build_directory not found on .mythx.yaml config file" + "You need to provide your project's build directory in the .mythx.yaml config file" + ) + if "deployed_contract_address" not in config_options: + raise click.exceptions.UsageError( + "deployed_contract_address not found on .mythx.yaml config file" + "You need to provide the address where your main contract is deployed on the .mythx.yaml" + ) + if not target and "target" not in config_options: + raise click.exceptions.UsageError( + "Target not provided. You need to provide a target as the last parameter of the fuzz run command." + "\nYou can also set the target on the `fuzz` key of your .mythx.yaml config file." + "\nSee https://mythx-cli.readthedocs.io/en/latest/advanced-usage.html#configuration-using-mythx-yml" + " for more information." + ) + if not target: + target = [analyze_config["target"]] + # Optional config parameters + # Here we parse the config parameters from the config file and use defaults for non available values + rpc_url = analyze_config["rpc_url"] if 'rpc_url' in config_options else default_config["rpc_url"] + faas_url = analyze_config["faas_url"] if 'faas_url' in config_options else default_config["faas_url"] + number_of_cores = analyze_config["number_of_cores"] if 'number_of_cores' in config_options else default_config[ + "harvey_num_cores"] + campaign_name_prefix = analyze_config["campaign_name_prefix"] if "campaign_name_prefix" in config_options else \ + default_config["campaign_name_prefix"] + + rpc_client = RPCClient(rpc_url, number_of_cores) - - rpc_url = "http://localhost:7545" - faas_url = "http://localhost:8080" - - if 'rpc_url' in analyze_config.keys(): - rpc_url = analyze_config["rpc_url"] - - if 'faas_url' in analyze_config.keys(): - faas_url = analyze_config["faas_url"] - - rpc_client = RPCClient(rpc_url) - - number_of_cores = 2 - if 'number_of_cores' in analyze_config.keys(): - number_of_cores = analyze_config["number_of_cores"] contract_code_response = rpc_client.rpc_call("eth_getCode", "[\"" + contract_address + "\",\"latest\"]") if contract_code_response is None: print("Invalid address") if more_addresses is None: - other_addresses=[] + other_addresses = [] else: other_addresses = more_addresses.split(',') - seed_state = rpc_client.get_seed_state(contract_address, other_addresses, number_of_cores) - brownie = BrownieJob(target, analyze_config["build_directory"]) - brownie.generate_payload(seed_state) - - - api_payload = {"parameters": {}} - - # We set the name for the campaign if there is a prefix in the config file - # If no prefix is configured, we don't include a name in the request, and the API generates one. - if "campaign_name_prefix" in analyze_config: - api_payload["name"] = generate_campaign_name((analyze_config["campaign_name_prefix"])) - - api_payload["parameters"]["discovery-probability-threshold"]=seed_state["discovery-probability-threshold"] - api_payload["parameters"]["num-cores"]=seed_state["num-cores"] - api_payload["parameters"]["assertion-checking-mode"]=seed_state["assertion-checking-mode"] - api_payload["corpus"] = seed_state["analysis-setup"] - - api_payload["sources"] = brownie.payload["sources"] - api_payload["contracts"] = brownie.payload["contracts"] - - instr_meta = ScribbleMixin.get_arming_instr_meta() - - if instr_meta is not None: - api_payload["instrumentation_metadata"] = instr_meta - + # We get the seed state from the provided rpc endpoint + seed_state = rpc_client.get_seed_state(contract_address, other_addresses) + brownie_artifacts = BrownieJob(target, analyze_config["build_directory"]) + brownie_artifacts.generate_payload(seed_state) - campaign_id = start_faas_campaign(json.dumps(api_payload), faas_url) - print("You can view campaign here: "+ faas_url+"/campaigns/"+str(campaign_id)) + faas_client = FaasClient(faas_url=faas_url, campaign_name_prefix=campaign_name_prefix, project_type="brownie") + try: + campaign_id = faas_client.create_faas_campaign(campaign_data=brownie_artifacts, seed_state=seed_state) + click.echo("You can view campaign here: " + faas_url + "/campaigns/" + str(campaign_id)) + except: + LOGGER.warning(f"Could not submit campaign to the FaaS") + click.echo(f"Unable to submit the campaign to the faas. Are you sure the service is running on {faas_url} ?") - # print(json.dumps(api_payload)) pass From 1de182d578ca34c2a5b2f903daccb80036e0081a Mon Sep 17 00:00:00 2001 From: Joao Santos Date: Thu, 25 Mar 2021 18:26:40 +0000 Subject: [PATCH 17/41] Adds comments and custom Exceptions --- mythx_cli/fuzz/brownie.py | 166 ++++++++++++++++++++++------------- mythx_cli/fuzz/exceptions.py | 56 ++++++++++++ mythx_cli/fuzz/faas.py | 90 ++++++++++++------- mythx_cli/fuzz/rpc.py | 4 +- mythx_cli/fuzz/run.py | 11 +-- 5 files changed, 229 insertions(+), 98 deletions(-) create mode 100644 mythx_cli/fuzz/exceptions.py diff --git a/mythx_cli/fuzz/brownie.py b/mythx_cli/fuzz/brownie.py index 594febf..b80e68d 100644 --- a/mythx_cli/fuzz/brownie.py +++ b/mythx_cli/fuzz/brownie.py @@ -2,8 +2,7 @@ import json import os import logging -import click - +from .exceptions import BrownieError, BuildArtifactsError, SourceError, PayloadError LOGGER = logging.getLogger("mythx-cli") from mythx_cli.util import sol_files_by_directory @@ -26,68 +25,113 @@ def __init__(self, target: Path, build_dir: Path): LOGGER.debug(f"Found {str(len(self.source_files_paths))} solidity files") def find_solidity_files(self, target_item: str): - self.source_files_paths = sol_files_by_directory(target_item) + try: + self.source_files_paths = sol_files_by_directory(target_item) + except Exception as e: + raise SourceError(f"Error finding solidity files for target {target_item}") def find_brownie_artifacts(self): - build_files = {} - build_files_by_source_file = {} - # we search on Brownie's build directory - build_dir = os.walk(self.build_dir) + """Build indexes of Brownie build artifacts. + + This function starts by loading the contents from the Brownie build artifacts json, found in the /build + folder, which contain the following data: + + * :code: `allSourcePaths` + * :code: `deployedSourceMap` + * :code: `deployedBytecode` + * :code: `sourceMap` + * :code: `bytecode` + * :code: `contractName` + * :code: `sourcePath` - for sub_dir in build_dir: - if len(sub_dir[2]) > 0: + It then stores that data in two separate dictionaires, build_files and build_files_by_source_file. The first + is indexed by the compilation artifact file name (the json found in /build/*) and the second is indexed by the + source file (.sol) found in the .sourcePath property of the json. + """ + + try: + build_files = {} + build_files_by_source_file = {} + # we search on Brownie's build directory + build_dir = os.walk(self.build_dir) + + for sub_dir in build_dir: + if len(sub_dir[2]) <= 0: + continue # sub directory with .json files file_prefix = sub_dir[0] for file in sub_dir[2]: - if not file.endswith(".json"): - continue - file_name = file_prefix + "/" + file - with open(file_name) as json_file: - # load the build artifact - data = json.load(json_file) - # store it on a dictionary by file name - build_files[file_name] = data - source_path = data["sourcePath"] - # store it on a dictionary by source file name - if source_path not in build_files_by_source_file: - # initialize the array of contracts with a list - build_files_by_source_file[source_path] = [] - build_files_by_source_file[source_path].append(data) - return build_files, build_files_by_source_file - - def generate_payload(self, execution): - for source_file in self.source_files_paths: - smart_contracts = self.build_files_by_source_file[source_file] - for contract in smart_contracts: - faas_contract_item = {} - faas_contract_item["sourcePaths"] = contract["allSourcePaths"] - faas_contract_item["deployedSourceMap"] = contract["deployedSourceMap"] - faas_contract_item["deployedBytecode"] = contract["deployedBytecode"] - faas_contract_item["sourceMap"] = contract["sourceMap"] - faas_contract_item["bytecode"] = contract["bytecode"] - faas_contract_item["contractName"] = contract["contractName"] - faas_contract_item["mainSourceFile"] = contract["sourcePath"] - - for file_index, source_file in contract["allSourcePaths"].items(): - if source_file in self.sources: - LOGGER.debug(f"{source_file} already included, skipping.") - continue - faas_source_item = {} - faas_source_item["fileIndex"] = file_index - if source_file not in self.build_files_by_source_file: - LOGGER.debug(f"{source_file} not found.") - continue - - # We can select any dict on the build_files_by_source_file[source_file] array - # because the .source and .ast values will be the same in all. - target_file = self.build_files_by_source_file[source_file][0] - faas_source_item["source"] = target_file["source"] - faas_source_item["ast"] = target_file["ast"] - self.sources[source_file] = faas_source_item - - self.contracts.append(faas_contract_item) - self.payload = { - "execution": execution, - "contracts": self.contracts, - "sources": self.sources - } + try: + if not file.endswith(".json"): + continue + file_name = file_prefix + "/" + file + with open(file_name) as json_file: + # load the build artifact + data = json.load(json_file) + # store it on a dictionary by file name + build_files[file_name] = data + source_path = data["sourcePath"] + # store it on a dictionary by source file name + if source_path not in build_files_by_source_file: + # initialize the array of contracts with a list + build_files_by_source_file[source_path] = [] + build_files_by_source_file[source_path].append(data) + except Exception as e: + raise BuildArtifactsError(f"Error getting brownie artifacts for file {file}: \n {e}") + return build_files, build_files_by_source_file + except Exception as e: + raise BrownieError(f"Error processing build artifacts: \n{e}") + + + def generate_payload(self): + """Generates a payload in the format consumed by the FaaS API. See {faas_url}/docs""" + + # Starts by iterating through the string list of .sol source file names listed as dependencies + try: + for source_file in self.source_files_paths: + # gets the compilation artifacts for each contract in each source file + smart_contracts = self.build_files_by_source_file.get(source_file,"") + # each source file may have more than 1 contract, here we iterate through the contracts + for contract in smart_contracts: + LOGGER.debug(f"Getting artifacts from {contract}.") + #We get the build items from brownie and rename them into the properties used by the FaaS + try: + faas_contract_item = {} + faas_contract_item["sourcePaths"] = contract["allSourcePaths"] + faas_contract_item["deployedSourceMap"] = contract["deployedSourceMap"] + faas_contract_item["deployedBytecode"] = contract["deployedBytecode"] + faas_contract_item["sourceMap"] = contract["sourceMap"] + faas_contract_item["bytecode"] = contract["bytecode"] + faas_contract_item["contractName"] = contract["contractName"] + faas_contract_item["mainSourceFile"] = contract["sourcePath"] + except Exception as e: + raise BuildArtifactsError(f"Error accessing build artifacts in {contract}: \n{e}") + + # After getting the build items, we fetch the source code and AST + for file_index, source_file in contract["allSourcePaths"].items(): + try: + if source_file in self.sources: + LOGGER.debug(f"{source_file} already included, skipping.") + continue + faas_source_item = {} + faas_source_item["fileIndex"] = file_index + if source_file not in self.build_files_by_source_file: + LOGGER.debug(f"{source_file} not found.") + continue + + # We can select any dict on the build_files_by_source_file[source_file] array + # because the .source and .ast values will be the same in all. + target_file = self.build_files_by_source_file[source_file][0] + faas_source_item["source"] = target_file["source"] + faas_source_item["ast"] = target_file["ast"] + self.sources[source_file] = faas_source_item + except Exception as e: + raise SourceError(f"Error accessing source code in {source_file}: \n{e}") + + self.contracts.append(faas_contract_item) + self.payload = { + "contracts": self.contracts, + "sources": self.sources + } + except Exception as e: + raise PayloadError(f"Error assembling the FaaS payload from the Brownie job: \n {e}") diff --git a/mythx_cli/fuzz/exceptions.py b/mythx_cli/fuzz/exceptions.py new file mode 100644 index 0000000..1d72e95 --- /dev/null +++ b/mythx_cli/fuzz/exceptions.py @@ -0,0 +1,56 @@ +# +# FaaS Client Errors +# + +class FaaSError(Exception): + """Base class for FaaS module exceptions""" + def __init__(self, message): + self.message = message + pass + +# HTTP Requests + +class RequestError(FaaSError): + """Exception raised for errors with the http connection to the faas""" + pass + +class BadStatusCode(RequestError): + """Exception raised for http responses with a bad status code""" + pass + +# Data Formats + +class PayloadError(FaaSError): + """Exception raised for errors extracting data from the provided payload""" + pass + +class ScribbleMetaError(FaaSError): + """Exception raised for errors getting the Scribble Metadata""" + pass + +class CreateFaaSCampaignError(FaaSError): + """Exception raised for errors creating the FaaS Campaign""" + pass + + +# +# Brownie Job Errors +# + +class BrownieError(Exception): + """Base class for Brownie Job exceptions""" + def __init__(self, message): + self.message = message + pass + +class BuildArtifactsError(BrownieError): + """Exception raised for errors fetching the build artifacts""" + pass + +class SourceError(BrownieError): + """Exception raised for errors the source and AST of a source file""" + pass + +class PayloadError(BrownieError): + """Exception raised for errors assembling the FaaS payload""" + pass diff --git a/mythx_cli/fuzz/faas.py b/mythx_cli/fuzz/faas.py index b143f3a..ea01c6c 100644 --- a/mythx_cli/fuzz/faas.py +++ b/mythx_cli/fuzz/faas.py @@ -1,9 +1,9 @@ import logging import random from mythx_cli.analyze.scribble import ScribbleMixin +from .exceptions import RequestError, BadStatusCode, PayloadError, ScribbleMetaError, CreateFaaSCampaignError import click import requests -import json import string LOGGER = logging.getLogger("mythx-cli") @@ -14,52 +14,80 @@ class FaasClient(): + """ A client to interact with the FaaS API. + + This object receives solidity compilation artifacts and a Harvey Seed state, generates a payload that the faas + API can consume and submits it, also triggering the start of a Campaign. + """ + def __init__(self, faas_url, campaign_name_prefix, project_type): self.faas_url = faas_url self.campaign_name_prefix = campaign_name_prefix self.project_type = project_type def generate_campaign_name(self): - """Generates a random campaign name, starting with the provided - campaign name prefix, followed by 5 random characters, ensuring - each campaign has a unique name. - """ + """Return a random name with the provided prefix self.campaign_name_prefix.""" letters = string.ascii_lowercase random_string = ''.join(random.choice(letters) for i in range(5)) return str(self.campaign_name_prefix + "_" + random_string) def start_faas_campaign(self, payload): - response = (requests.request("POST", self.faas_url + "/api/campaigns?start_immediately=true", headers=headers, - data=payload)).json() - return response["id"] + """Make HTTP request to the faas""" + try: + req_url = f"{self.faas_url}/api/campaigns?start_immediately=true" + response = requests.post(req_url, json=payload, headers=headers) + response_data = response.json() + if response.status_code != requests.codes.ok: + raise BadStatusCode(f"Got http status code {response.status_code} for request {req_url}") + return response_data["id"] + except Exception as e: + raise RequestError(f"Error starting FaaS campaign: \n {e}") def create_faas_campaign(self, campaign_data, seed_state): - """ A FaaS campaign creation request requires 3 fields: - - sources: dictionary of source code and AST of source files, indexed by file name - - corpus: Harvey's seed state - - parameters: Harvey's configuration settings - - contracts: contract build artifacts (bytecode, sourcemap, etc) - For full docs visit {faas_url}/docs#operation/list_campaigns_api_campaigns__get - """ - if self.project_type != 'brownie': - raise click.exceptions.UsageError("Currently only Brownie projects are supported") + """Submit a campaign to the FaaS and start that campaign. - api_payload = {"parameters": {}} - api_payload["name"] = self.generate_campaign_name() - api_payload["parameters"]["discovery-probability-threshold"] = seed_state["discovery-probability-threshold"] - api_payload["parameters"]["num-cores"] = seed_state["num-cores"] - api_payload["parameters"]["assertion-checking-mode"] = seed_state["assertion-checking-mode"] - api_payload["corpus"] = seed_state["analysis-setup"] + This function takes a FaaS payload and makes an HTTP request to the Faas backend, which + then creates and starts a campaign. The campaign is started because of the `start_immediately=true` query + parameter. + + This will send the following data to the FaaS for analysis: + + * :code:`name` + * :code:`parameters` A dict of Harvey configuration options + * :code:`sources` A dict containing source files code and AST + * :code:`contracts` Solidity artifacts of the target smart contracts + * :code:`corpus` Seed state of the target contract. Usually the list of transactions that took place on the + local ganache (or equivalent) instance. + + :return: Campaign ID + """ + try: + if self.project_type != 'brownie': + raise click.exceptions.UsageError("Currently only Brownie projects are supported") - api_payload["sources"] = campaign_data.payload["sources"] - api_payload["contracts"] = campaign_data.payload["contracts"] + try: + api_payload = {"parameters": {}} + api_payload["name"] = self.generate_campaign_name() + api_payload["parameters"]["discovery-probability-threshold"] = seed_state[ + "discovery-probability-threshold"] + api_payload["parameters"]["num-cores"] = seed_state["num-cores"] + api_payload["parameters"]["assertion-checking-mode"] = seed_state["assertion-checking-mode"] + api_payload["corpus"] = seed_state["analysis-setup"] + api_payload["sources"] = campaign_data.payload["sources"] + api_payload["contracts"] = campaign_data.payload["contracts"] + except Exception: + raise PayloadError(f"Error extracting data from payload") - instr_meta = ScribbleMixin.get_arming_instr_meta() + try: + instr_meta = ScribbleMixin.get_arming_instr_meta() - if instr_meta is not None: - api_payload["instrumentation_metadata"] = instr_meta + if instr_meta is not None: + api_payload["instrumentation_metadata"] = instr_meta + except Exception as e: + raise ScribbleMetaError(f"Error getting Scribble arming metadata:\n {e}") - #print(json.dumps(api_payload)) - campaign_id = self.start_faas_campaign(json.dumps(api_payload)) + campaign_id = self.start_faas_campaign(api_payload) - return campaign_id + return campaign_id + except Exception as e: + raise CreateFaaSCampaignError(f"Error creating the FaaS campaign: \n {e}") diff --git a/mythx_cli/fuzz/rpc.py b/mythx_cli/fuzz/rpc.py index a308b49..bc34d0b 100644 --- a/mythx_cli/fuzz/rpc.py +++ b/mythx_cli/fuzz/rpc.py @@ -13,6 +13,7 @@ time_limit_seconds = 3000 NUM_BLOCKS_UPPER_LIMIT = 9999 +# TODO: separate into an RPC class and a Harvey class class RPCClient(): def __init__(self, rpc_url: str, number_of_cores: int): self.rpc_url = rpc_url @@ -21,8 +22,9 @@ def __init__(self, rpc_url: str, number_of_cores: int): """Makes an rpc call to the RPC endpoint passed to the construcotr and returns the `result` property of the rpc response. """ - + # TODO: rename to call def rpc_call(self, method: str, params: str): + # TODO: add try catch, use the base exceptions if available payload = "{\"jsonrpc\":\"2.0\",\"method\":\"" + method + "\",\"params\":" + params + ",\"id\":1}" response = (requests.request("POST", self.rpc_url, headers=headers, data=payload)).json() return response["result"] diff --git a/mythx_cli/fuzz/run.py b/mythx_cli/fuzz/run.py index 1459f48..e58cf3b 100644 --- a/mythx_cli/fuzz/run.py +++ b/mythx_cli/fuzz/run.py @@ -100,6 +100,7 @@ def fuzz_run(ctx, address, more_addresses, target): target = [analyze_config["target"]] # Optional config parameters # Here we parse the config parameters from the config file and use defaults for non available values + # TODO: make into ifs or use dict.update dict.get('key', default), safe way to check it exists rpc_url = analyze_config["rpc_url"] if 'rpc_url' in config_options else default_config["rpc_url"] faas_url = analyze_config["faas_url"] if 'faas_url' in config_options else default_config["faas_url"] number_of_cores = analyze_config["number_of_cores"] if 'number_of_cores' in config_options else default_config[ @@ -111,6 +112,7 @@ def fuzz_run(ctx, address, more_addresses, target): contract_code_response = rpc_client.rpc_call("eth_getCode", "[\"" + contract_address + "\",\"latest\"]") + # TODO: raise exception with wrong contract address if contract_code_response is None: print("Invalid address") @@ -122,15 +124,14 @@ def fuzz_run(ctx, address, more_addresses, target): # We get the seed state from the provided rpc endpoint seed_state = rpc_client.get_seed_state(contract_address, other_addresses) brownie_artifacts = BrownieJob(target, analyze_config["build_directory"]) - brownie_artifacts.generate_payload(seed_state) + brownie_artifacts.generate_payload() faas_client = FaasClient(faas_url=faas_url, campaign_name_prefix=campaign_name_prefix, project_type="brownie") try: campaign_id = faas_client.create_faas_campaign(campaign_data=brownie_artifacts, seed_state=seed_state) click.echo("You can view campaign here: " + faas_url + "/campaigns/" + str(campaign_id)) - except: + except Exception as e: LOGGER.warning(f"Could not submit campaign to the FaaS") - click.echo(f"Unable to submit the campaign to the faas. Are you sure the service is running on {faas_url} ?") - - + click.echo(f"Unable to submit the campaign to the faas. Are you sure the service is running on {faas_url} ?" + f"Error: {e}") pass From 9a91487d0cd901b84954234296d9c55f2acefd75 Mon Sep 17 00:00:00 2001 From: Joran Honig Date: Fri, 26 Mar 2021 15:53:41 +0100 Subject: [PATCH 18/41] initial rewrite --- mythx_cli/fuzz/brownie.py | 137 ----------------------- mythx_cli/fuzz/ide/__init__.py | 0 mythx_cli/fuzz/ide/brownie.py | 196 +++++++++++++++++++++++++++++++++ mythx_cli/fuzz/ide/hardhat.py | 0 mythx_cli/fuzz/run.py | 6 +- 5 files changed, 197 insertions(+), 142 deletions(-) delete mode 100644 mythx_cli/fuzz/brownie.py create mode 100644 mythx_cli/fuzz/ide/__init__.py create mode 100644 mythx_cli/fuzz/ide/brownie.py create mode 100644 mythx_cli/fuzz/ide/hardhat.py diff --git a/mythx_cli/fuzz/brownie.py b/mythx_cli/fuzz/brownie.py deleted file mode 100644 index b80e68d..0000000 --- a/mythx_cli/fuzz/brownie.py +++ /dev/null @@ -1,137 +0,0 @@ -from pathlib import Path -import json -import os -import logging -from .exceptions import BrownieError, BuildArtifactsError, SourceError, PayloadError -LOGGER = logging.getLogger("mythx-cli") - -from mythx_cli.util import sol_files_by_directory - - -class BrownieJob(): - def __init__(self, target: Path, build_dir: Path): - self.target = target - self.build_dir = build_dir - self.source_files_paths = [] - self.contracts = [] - self.sources = {} - self.build_files, self.build_files_by_source_file = self.find_brownie_artifacts() - self.payload = {} - - for t in target: - self.find_solidity_files(t) - # removing the duplicates - self.source_files_paths = list(set(self.source_files_paths)) - LOGGER.debug(f"Found {str(len(self.source_files_paths))} solidity files") - - def find_solidity_files(self, target_item: str): - try: - self.source_files_paths = sol_files_by_directory(target_item) - except Exception as e: - raise SourceError(f"Error finding solidity files for target {target_item}") - - def find_brownie_artifacts(self): - """Build indexes of Brownie build artifacts. - - This function starts by loading the contents from the Brownie build artifacts json, found in the /build - folder, which contain the following data: - - * :code: `allSourcePaths` - * :code: `deployedSourceMap` - * :code: `deployedBytecode` - * :code: `sourceMap` - * :code: `bytecode` - * :code: `contractName` - * :code: `sourcePath` - - It then stores that data in two separate dictionaires, build_files and build_files_by_source_file. The first - is indexed by the compilation artifact file name (the json found in /build/*) and the second is indexed by the - source file (.sol) found in the .sourcePath property of the json. - """ - - try: - build_files = {} - build_files_by_source_file = {} - # we search on Brownie's build directory - build_dir = os.walk(self.build_dir) - - for sub_dir in build_dir: - if len(sub_dir[2]) <= 0: - continue - # sub directory with .json files - file_prefix = sub_dir[0] - for file in sub_dir[2]: - try: - if not file.endswith(".json"): - continue - file_name = file_prefix + "/" + file - with open(file_name) as json_file: - # load the build artifact - data = json.load(json_file) - # store it on a dictionary by file name - build_files[file_name] = data - source_path = data["sourcePath"] - # store it on a dictionary by source file name - if source_path not in build_files_by_source_file: - # initialize the array of contracts with a list - build_files_by_source_file[source_path] = [] - build_files_by_source_file[source_path].append(data) - except Exception as e: - raise BuildArtifactsError(f"Error getting brownie artifacts for file {file}: \n {e}") - return build_files, build_files_by_source_file - except Exception as e: - raise BrownieError(f"Error processing build artifacts: \n{e}") - - - def generate_payload(self): - """Generates a payload in the format consumed by the FaaS API. See {faas_url}/docs""" - - # Starts by iterating through the string list of .sol source file names listed as dependencies - try: - for source_file in self.source_files_paths: - # gets the compilation artifacts for each contract in each source file - smart_contracts = self.build_files_by_source_file.get(source_file,"") - # each source file may have more than 1 contract, here we iterate through the contracts - for contract in smart_contracts: - LOGGER.debug(f"Getting artifacts from {contract}.") - #We get the build items from brownie and rename them into the properties used by the FaaS - try: - faas_contract_item = {} - faas_contract_item["sourcePaths"] = contract["allSourcePaths"] - faas_contract_item["deployedSourceMap"] = contract["deployedSourceMap"] - faas_contract_item["deployedBytecode"] = contract["deployedBytecode"] - faas_contract_item["sourceMap"] = contract["sourceMap"] - faas_contract_item["bytecode"] = contract["bytecode"] - faas_contract_item["contractName"] = contract["contractName"] - faas_contract_item["mainSourceFile"] = contract["sourcePath"] - except Exception as e: - raise BuildArtifactsError(f"Error accessing build artifacts in {contract}: \n{e}") - - # After getting the build items, we fetch the source code and AST - for file_index, source_file in contract["allSourcePaths"].items(): - try: - if source_file in self.sources: - LOGGER.debug(f"{source_file} already included, skipping.") - continue - faas_source_item = {} - faas_source_item["fileIndex"] = file_index - if source_file not in self.build_files_by_source_file: - LOGGER.debug(f"{source_file} not found.") - continue - - # We can select any dict on the build_files_by_source_file[source_file] array - # because the .source and .ast values will be the same in all. - target_file = self.build_files_by_source_file[source_file][0] - faas_source_item["source"] = target_file["source"] - faas_source_item["ast"] = target_file["ast"] - self.sources[source_file] = faas_source_item - except Exception as e: - raise SourceError(f"Error accessing source code in {source_file}: \n{e}") - - self.contracts.append(faas_contract_item) - self.payload = { - "contracts": self.contracts, - "sources": self.sources - } - except Exception as e: - raise PayloadError(f"Error assembling the FaaS payload from the Brownie job: \n {e}") diff --git a/mythx_cli/fuzz/ide/__init__.py b/mythx_cli/fuzz/ide/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/mythx_cli/fuzz/ide/brownie.py b/mythx_cli/fuzz/ide/brownie.py new file mode 100644 index 0000000..02b58f0 --- /dev/null +++ b/mythx_cli/fuzz/ide/brownie.py @@ -0,0 +1,196 @@ +from pathlib import Path +import json +import os +import logging +from mythx_cli.fuzz.exceptions import BrownieError, BuildArtifactsError, SourceError, PayloadError +LOGGER = logging.getLogger("mythx-cli") + +from mythx_cli.util import sol_files_by_directory +from collections import defaultdict +from pathlib import Path +from typing import Tuple, Dict + +class IDEArtifacts: + @property + def contracts(self): + pass + + @property + def sources(self): + pass + + def get_source_data(self, source_path) -> Dict: + pass + + def get_contract_data(self, source_path, contract_name): + pass + + +class BrownieArtifacts: + def __init__(self, build_dir=None): + self._build_dir = build_dir or Path("./build/contracts") + build_files, build_files_by_source_file = self._get_build_artifacts(self._build_dir) + + self._contracts = self.populate_contracts(build_files, build_files_by_source_file) + self._sources = self.populate_sources(self._contracts, build_files_by_source_file) + + @property + def contracts(self): + return self._contracts + + @property + def sources(self): + return self._contracts + + def get_source_data(self, source_path) -> Dict: + return self._contracts.get(source_path, None) + + def get_contract_data(self, source_path, contract_name): + return self._contracts.get(source_path, {}).get(contract_name, None) + + @staticmethod + def populate_contracts(build_files, build_files_by_source_file): + contracts = {} + for source_file, contracts in build_files_by_source_file.values(): + contracts[source_file] = {} + for contract in contracts: + LOGGER.debug(f"Getting artifacts from {contract}.") + + # We get the build items from brownie and rename them into the properties used by the FaaS + try: + contracts[source_file][contract] ={ + "sourcePaths": contract["allSourcePaths"], + "deployedSourceMap": contract["deployedSourceMap"], + "deployedBytecode": contract["deployedBytecode"], + "sourceMap": contract["sourceMap"], + "bytecode": contract["bytecode"], + "contractName": contract["contractName"], + "mainSourceFile": contract["sourcePath"], + } + except KeyError as e: + raise BuildArtifactsError( + f"Build artifact did not contain expected key. Contract: {contract}: \n{e}" + ) + return contracts + + @staticmethod + def populate_sources(contracts, build_files_by_source_file): + sources = {} + for source_file, contracts in contracts.items(): + for contract_name, contract in contracts.items(): + for file_index, source_file in contract["allSourcePaths"].items(): + if source_file in sources: + continue + + if source_file not in build_files_by_source_file: + LOGGER.debug(f"{source_file} not found.") + continue + + # We can select any dict on the build_files_by_source_file[source_file] array + # because the .source and .ast values will be the same in all. + target_file = build_files_by_source_file[source_file][0] + sources[source_file] = { + "fileIndex": file_index, + "source": target_file["source"], + "ast": target_file["ast"], + } + return sources + + @staticmethod + def _get_build_artifacts(build_dir) -> Tuple[Dict, Dict]: + """Build indexes of Brownie build artifacts. + + This function starts by loading the contents from the Brownie build artifacts json, found in the /build + folder, which contain the following data: + + * :code: `allSourcePaths` + * :code: `deployedSourceMap` + * :code: `deployedBytecode` + * :code: `sourceMap` + * :code: `bytecode` + * :code: `contractName` + * :code: `sourcePath` + + It then stores that data in two separate dictionaires, build_files and build_files_by_source_file. The first + is indexed by the compilation artifact file name (the json found in /build/*) and the second is indexed by the + source file (.sol) found in the .sourcePath property of the json. + """ + build_files = {} + build_files_by_source_file = {} + + build_dir = Path(build_dir) + + if not build_dir.is_dir(): + raise BuildArtifactsError("Build directory doesn't exist") + + for child in build_dir.iterdir(): + if not child.is_file(): + continue + if not child.name.endswith(".json"): + continue + + data = json.loads(child.read_text('utf-8')) + build_files[child.name] = data + source_path = data["sourcePath"] + + if source_path not in build_files_by_source_file: + # initialize the array of contracts with a list + build_files_by_source_file[source_path] = [] + + build_files_by_source_file[source_path].append(data) + + return build_files, build_files_by_source_file + + +class BrownieJobBuilder: + def __init__(self): + pass + + def generate_payload(self, target: Path, build_directory: Path): + sources, contracts = {}, {} + + build_files, build_files_by_source_file = BrownieArtifacts.get_build_artifacts(build_directory) + for source_file in sol_files_by_directory(target): + for contract in build_files_by_source_file.get(source_file, None): + if not contract: + continue + LOGGER.debug(f"Getting artifacts from {contract}.") + + # We get the build items from brownie and rename them into the properties used by the FaaS + try: + contracts += [{ + "sourcePaths": contract["allSourcePaths"], + "deployedSourceMap": contract["deployedSourceMap"], + "deployedBytecode": contract["deployedBytecode"], + "sourceMap": contract["sourceMap"], + "bytecode": contract["bytecode"], + "contractName": contract["contractName"], + "mainSourceFile": contract["sourcePath"], + }] + except KeyError as e: + raise BuildArtifactsError( + f"Build artifact did not contain expected key. Contract: {contract}: \n{e}" + ) + + # After getting the build items, we fetch the source code and AST + for file_index, source_file in contract["allSourcePaths"].items(): + if source_file in sources: + continue + + if source_file not in build_files_by_source_file: + LOGGER.debug(f"{source_file} not found.") + continue + + # We can select any dict on the build_files_by_source_file[source_file] array + # because the .source and .ast values will be the same in all. + target_file = build_files_by_source_file[source_file][0] + sources[source_file] = { + "fileIndex": file_index, + "source": target_file["source"], + "ast": target_file["ast"], + } + return { + "contracts": contracts, + "sources": sources + } + diff --git a/mythx_cli/fuzz/ide/hardhat.py b/mythx_cli/fuzz/ide/hardhat.py new file mode 100644 index 0000000..e69de29 diff --git a/mythx_cli/fuzz/run.py b/mythx_cli/fuzz/run.py index e58cf3b..e03cb30 100644 --- a/mythx_cli/fuzz/run.py +++ b/mythx_cli/fuzz/run.py @@ -1,17 +1,13 @@ import logging -import os import random import string import requests import click -import json -from .brownie import BrownieJob +from mythx_cli.fuzz.ide.brownie import BrownieJob from .faas import FaasClient from .rpc import RPCClient -from mythx_cli.analyze.scribble import ScribbleMixin - LOGGER = logging.getLogger("mythx-cli") headers = { From ed86d9f9f2022b77c1ef0df8eee14fdea814bdbf Mon Sep 17 00:00:00 2001 From: Joran Honig Date: Fri, 26 Mar 2021 17:09:14 +0100 Subject: [PATCH 19/41] rewrite generics --- mythx_cli/fuzz/ide/brownie.py | 157 ++++++++++++++-------------------- mythx_cli/fuzz/run.py | 1 + 2 files changed, 67 insertions(+), 91 deletions(-) diff --git a/mythx_cli/fuzz/ide/brownie.py b/mythx_cli/fuzz/ide/brownie.py index 02b58f0..a72c6d9 100644 --- a/mythx_cli/fuzz/ide/brownie.py +++ b/mythx_cli/fuzz/ide/brownie.py @@ -8,31 +8,51 @@ from mythx_cli.util import sol_files_by_directory from collections import defaultdict from pathlib import Path -from typing import Tuple, Dict +from typing import Tuple, Dict, List + class IDEArtifacts: @property - def contracts(self): + def contracts(self) -> Dict: + """ Returns sources + sources = { + "filename": [ + { + "bytecode": <>, + ... + "deployedBytecode": <> + } + ] + } + """ pass @property - def sources(self): - pass - - def get_source_data(self, source_path) -> Dict: + def sources(self) -> Dict: + """ Returns sources + sources = { + "filename": { + "ast": <>, + "source: "" + } + } + """ pass - def get_contract_data(self, source_path, contract_name): - pass +class BrownieArtifacts(IDEArtifacts): + def __init__(self, build_dir=None, targets=None): + self._include = [] + if targets: + include = [] + for target in targets: + include.extend(sol_files_by_directory(target)) + self._include = include -class BrownieArtifacts: - def __init__(self, build_dir=None): self._build_dir = build_dir or Path("./build/contracts") - build_files, build_files_by_source_file = self._get_build_artifacts(self._build_dir) + build_files_by_source_file = self._get_build_artifacts(self._build_dir) - self._contracts = self.populate_contracts(build_files, build_files_by_source_file) - self._sources = self.populate_sources(self._contracts, build_files_by_source_file) + self._contracts, self._sources = self.fetch_data(build_files_by_source_file) @property def contracts(self): @@ -40,25 +60,19 @@ def contracts(self): @property def sources(self): - return self._contracts - - def get_source_data(self, source_path) -> Dict: - return self._contracts.get(source_path, None) - - def get_contract_data(self, source_path, contract_name): - return self._contracts.get(source_path, {}).get(contract_name, None) + return self._sources - @staticmethod - def populate_contracts(build_files, build_files_by_source_file): - contracts = {} - for source_file, contracts in build_files_by_source_file.values(): - contracts[source_file] = {} + def fetch_data(self, build_files_by_source_file): + result_contracts = {} + result_sources = {} + for source_file, contracts in build_files_by_source_file.items(): + if source_file not in self._include: + continue + result_contracts[source_file] = [] for contract in contracts: - LOGGER.debug(f"Getting artifacts from {contract}.") - # We get the build items from brownie and rename them into the properties used by the FaaS try: - contracts[source_file][contract] ={ + result_contracts[source_file] += [{ "sourcePaths": contract["allSourcePaths"], "deployedSourceMap": contract["deployedSourceMap"], "deployedBytecode": contract["deployedBytecode"], @@ -66,38 +80,32 @@ def populate_contracts(build_files, build_files_by_source_file): "bytecode": contract["bytecode"], "contractName": contract["contractName"], "mainSourceFile": contract["sourcePath"], - } + }] except KeyError as e: raise BuildArtifactsError( f"Build artifact did not contain expected key. Contract: {contract}: \n{e}" ) - return contracts - @staticmethod - def populate_sources(contracts, build_files_by_source_file): - sources = {} - for source_file, contracts in contracts.items(): - for contract_name, contract in contracts.items(): - for file_index, source_file in contract["allSourcePaths"].items(): - if source_file in sources: + for file_index, source_file_dep in contract["allSourcePaths"].items(): + if source_file_dep in result_sources.keys(): continue - if source_file not in build_files_by_source_file: + if source_file_dep not in build_files_by_source_file: LOGGER.debug(f"{source_file} not found.") continue # We can select any dict on the build_files_by_source_file[source_file] array # because the .source and .ast values will be the same in all. - target_file = build_files_by_source_file[source_file][0] - sources[source_file] = { + target_file = build_files_by_source_file[source_file_dep][0] + result_sources[source_file_dep] = { "fileIndex": file_index, "source": target_file["source"], "ast": target_file["ast"], } - return sources + return result_contracts, result_sources @staticmethod - def _get_build_artifacts(build_dir) -> Tuple[Dict, Dict]: + def _get_build_artifacts(build_dir) -> Dict: """Build indexes of Brownie build artifacts. This function starts by loading the contents from the Brownie build artifacts json, found in the /build @@ -115,7 +123,6 @@ def _get_build_artifacts(build_dir) -> Tuple[Dict, Dict]: is indexed by the compilation artifact file name (the json found in /build/*) and the second is indexed by the source file (.sol) found in the .sourcePath property of the json. """ - build_files = {} build_files_by_source_file = {} build_dir = Path(build_dir) @@ -130,7 +137,6 @@ def _get_build_artifacts(build_dir) -> Tuple[Dict, Dict]: continue data = json.loads(child.read_text('utf-8')) - build_files[child.name] = data source_path = data["sourcePath"] if source_path not in build_files_by_source_file: @@ -139,58 +145,27 @@ def _get_build_artifacts(build_dir) -> Tuple[Dict, Dict]: build_files_by_source_file[source_path].append(data) - return build_files, build_files_by_source_file - - -class BrownieJobBuilder: - def __init__(self): - pass - - def generate_payload(self, target: Path, build_directory: Path): - sources, contracts = {}, {} - - build_files, build_files_by_source_file = BrownieArtifacts.get_build_artifacts(build_directory) - for source_file in sol_files_by_directory(target): - for contract in build_files_by_source_file.get(source_file, None): - if not contract: - continue - LOGGER.debug(f"Getting artifacts from {contract}.") - - # We get the build items from brownie and rename them into the properties used by the FaaS - try: - contracts += [{ - "sourcePaths": contract["allSourcePaths"], - "deployedSourceMap": contract["deployedSourceMap"], - "deployedBytecode": contract["deployedBytecode"], - "sourceMap": contract["sourceMap"], - "bytecode": contract["bytecode"], - "contractName": contract["contractName"], - "mainSourceFile": contract["sourcePath"], - }] - except KeyError as e: - raise BuildArtifactsError( - f"Build artifact did not contain expected key. Contract: {contract}: \n{e}" - ) + return build_files_by_source_file - # After getting the build items, we fetch the source code and AST - for file_index, source_file in contract["allSourcePaths"].items(): - if source_file in sources: - continue - if source_file not in build_files_by_source_file: - LOGGER.debug(f"{source_file} not found.") - continue +class JobBuilder: + def __init__(self, artifacts: IDEArtifacts): + self._artifacts = artifacts - # We can select any dict on the build_files_by_source_file[source_file] array - # because the .source and .ast values will be the same in all. - target_file = build_files_by_source_file[source_file][0] - sources[source_file] = { - "fileIndex": file_index, - "source": target_file["source"], - "ast": target_file["ast"], - } + def payload(self): + sources = self._artifacts.sources + contracts = [c for contracts_for_file in self._artifacts.contracts.values() for c in contracts_for_file] return { "contracts": contracts, "sources": sources } + +class BrownieJob: + def __init__(self, target: List[str], build_dir: Path): + artifacts = BrownieArtifacts(build_dir, targets=target) + self._jb = JobBuilder(artifacts) + self.payload = None + + def generate_payload(self): + self.payload = self._jb.payload() diff --git a/mythx_cli/fuzz/run.py b/mythx_cli/fuzz/run.py index e03cb30..dfef532 100644 --- a/mythx_cli/fuzz/run.py +++ b/mythx_cli/fuzz/run.py @@ -130,4 +130,5 @@ def fuzz_run(ctx, address, more_addresses, target): LOGGER.warning(f"Could not submit campaign to the FaaS") click.echo(f"Unable to submit the campaign to the faas. Are you sure the service is running on {faas_url} ?" f"Error: {e}") + raise pass From 849a6ff7ec7db91ed9e44af0de07156a0684de36 Mon Sep 17 00:00:00 2001 From: Joran Honig Date: Fri, 26 Mar 2021 17:20:54 +0100 Subject: [PATCH 20/41] restructure generics --- mythx_cli/fuzz/ide/__init__.py | 2 ++ mythx_cli/fuzz/ide/brownie.py | 49 +++------------------------------- mythx_cli/fuzz/ide/generic.py | 46 +++++++++++++++++++++++++++++++ 3 files changed, 52 insertions(+), 45 deletions(-) create mode 100644 mythx_cli/fuzz/ide/generic.py diff --git a/mythx_cli/fuzz/ide/__init__.py b/mythx_cli/fuzz/ide/__init__.py index e69de29..d475e4a 100644 --- a/mythx_cli/fuzz/ide/__init__.py +++ b/mythx_cli/fuzz/ide/__init__.py @@ -0,0 +1,2 @@ +from mythx_cli.fuzz.ide.generic import IDEArtifacts +from mythx_cli.fuzz.ide.brownie import BrownieJob diff --git a/mythx_cli/fuzz/ide/brownie.py b/mythx_cli/fuzz/ide/brownie.py index a72c6d9..60d6305 100644 --- a/mythx_cli/fuzz/ide/brownie.py +++ b/mythx_cli/fuzz/ide/brownie.py @@ -3,41 +3,13 @@ import os import logging from mythx_cli.fuzz.exceptions import BrownieError, BuildArtifactsError, SourceError, PayloadError -LOGGER = logging.getLogger("mythx-cli") -from mythx_cli.util import sol_files_by_directory -from collections import defaultdict +from ...util import sol_files_by_directory from pathlib import Path -from typing import Tuple, Dict, List - - -class IDEArtifacts: - @property - def contracts(self) -> Dict: - """ Returns sources - sources = { - "filename": [ - { - "bytecode": <>, - ... - "deployedBytecode": <> - } - ] - } - """ - pass +from typing import Dict, List +from mythx_cli.fuzz.ide.generic import IDEArtifacts, JobBuilder - @property - def sources(self) -> Dict: - """ Returns sources - sources = { - "filename": { - "ast": <>, - "source: "" - } - } - """ - pass +LOGGER = logging.getLogger("mythx-cli") class BrownieArtifacts(IDEArtifacts): @@ -148,19 +120,6 @@ def _get_build_artifacts(build_dir) -> Dict: return build_files_by_source_file -class JobBuilder: - def __init__(self, artifacts: IDEArtifacts): - self._artifacts = artifacts - - def payload(self): - sources = self._artifacts.sources - contracts = [c for contracts_for_file in self._artifacts.contracts.values() for c in contracts_for_file] - return { - "contracts": contracts, - "sources": sources - } - - class BrownieJob: def __init__(self, target: List[str], build_dir: Path): artifacts = BrownieArtifacts(build_dir, targets=target) diff --git a/mythx_cli/fuzz/ide/generic.py b/mythx_cli/fuzz/ide/generic.py new file mode 100644 index 0000000..d3cadf0 --- /dev/null +++ b/mythx_cli/fuzz/ide/generic.py @@ -0,0 +1,46 @@ +from typing import Dict +from abc import ABC, abstractmethod + + +class IDEArtifacts(ABC): + @property + @abstractmethod + def contracts(self) -> Dict: + """ Returns sources + sources = { + "filename": [ + { + "bytecode": <>, + ... + "deployedBytecode": <> + } + ] + } + """ + pass + + @property + @abstractmethod + def sources(self) -> Dict: + """ Returns sources + sources = { + "filename": { + "ast": <>, + "source: "" + } + } + """ + pass + + +class JobBuilder: + def __init__(self, artifacts: IDEArtifacts): + self._artifacts = artifacts + + def payload(self): + sources = self._artifacts.sources + contracts = [c for contracts_for_file in self._artifacts.contracts.values() for c in contracts_for_file] + return { + "contracts": contracts, + "sources": sources + } From aa4c5538e51be6d2d17367d3ea94dd08cf42b6de Mon Sep 17 00:00:00 2001 From: Joran Honig Date: Mon, 29 Mar 2021 13:08:55 +0200 Subject: [PATCH 21/41] traverse nested directories --- mythx_cli/fuzz/ide/brownie.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mythx_cli/fuzz/ide/brownie.py b/mythx_cli/fuzz/ide/brownie.py index 60d6305..300748a 100644 --- a/mythx_cli/fuzz/ide/brownie.py +++ b/mythx_cli/fuzz/ide/brownie.py @@ -102,7 +102,7 @@ def _get_build_artifacts(build_dir) -> Dict: if not build_dir.is_dir(): raise BuildArtifactsError("Build directory doesn't exist") - for child in build_dir.iterdir(): + for child in build_dir.glob('**/*'): if not child.is_file(): continue if not child.name.endswith(".json"): From 5e067727c7479a8a1c50a472b090449ba49f5fa1 Mon Sep 17 00:00:00 2001 From: Joao Santos Date: Tue, 30 Mar 2021 19:46:35 +0100 Subject: [PATCH 22/41] Add error messages, improve error handling Adds tests to fuzz run --- .mythx.yml | 7 + mythx_cli/fuzz/exceptions.py | 12 + mythx_cli/fuzz/faas.py | 9 +- mythx_cli/fuzz/rpc.py | 56 +- mythx_cli/fuzz/run.py | 26 +- tests/.mythx.yml | 6 + tests/common.py | 14 + tests/test_fuzz.py | 192 + tests/testdata/brownie-artifact.json | 4813 +++++++++++++++++ tests/testdata/faas-new-campaign-request.json | 2924 ++++++++++ .../testdata/faas-new-campaign-response.json | 10 + tests/testdata/ganache-all-blocks.json | 64 + 12 files changed, 8092 insertions(+), 41 deletions(-) create mode 100644 .mythx.yml create mode 100644 tests/.mythx.yml create mode 100644 tests/testdata/brownie-artifact.json create mode 100644 tests/testdata/faas-new-campaign-request.json create mode 100644 tests/testdata/faas-new-campaign-response.json create mode 100644 tests/testdata/ganache-all-blocks.json diff --git a/.mythx.yml b/.mythx.yml new file mode 100644 index 0000000..daefc82 --- /dev/null +++ b/.mythx.yml @@ -0,0 +1,7 @@ +fuzz: + deployed_contract_address: "0x7277646075fa72737e1F6114654C5d9949a67dF2" + number_of_cores: 1 + campaign_name_prefix: "brownie_test" + rpc_url: "http://localhost:9898" + faas_url: "http://localhost:9899" + build_directory: /private/var/folders/w9/36q5pfw94rz6bh0062p2j8p40000gn/T/pytest-of-boss/pytest-100/test_rpc_not_running0/build/contracts \ No newline at end of file diff --git a/mythx_cli/fuzz/exceptions.py b/mythx_cli/fuzz/exceptions.py index 1d72e95..1fd2328 100644 --- a/mythx_cli/fuzz/exceptions.py +++ b/mythx_cli/fuzz/exceptions.py @@ -54,3 +54,15 @@ class SourceError(BrownieError): class PayloadError(BrownieError): """Exception raised for errors assembling the FaaS payload""" pass + +# +# RPC client +# + +class RPCCallError(FaaSError): + """Exception raised when there is an error calling the RPC endpoint""" + pass + +class SeedStateError(FaaSError): + """Exception raised when there is an error generating the seed state""" + pass diff --git a/mythx_cli/fuzz/faas.py b/mythx_cli/fuzz/faas.py index ea01c6c..9ae6af0 100644 --- a/mythx_cli/fuzz/faas.py +++ b/mythx_cli/fuzz/faas.py @@ -1,3 +1,4 @@ +import json import logging import random from mythx_cli.analyze.scribble import ScribbleMixin @@ -41,7 +42,7 @@ def start_faas_campaign(self, payload): raise BadStatusCode(f"Got http status code {response.status_code} for request {req_url}") return response_data["id"] except Exception as e: - raise RequestError(f"Error starting FaaS campaign: \n {e}") + raise RequestError(f"Error starting FaaS campaign.") def create_faas_campaign(self, campaign_data, seed_state): """Submit a campaign to the FaaS and start that campaign. @@ -84,10 +85,10 @@ def create_faas_campaign(self, campaign_data, seed_state): if instr_meta is not None: api_payload["instrumentation_metadata"] = instr_meta except Exception as e: - raise ScribbleMetaError(f"Error getting Scribble arming metadata:\n {e}") + raise ScribbleMetaError(f"Error getting Scribble arming metadata.") from e campaign_id = self.start_faas_campaign(api_payload) return campaign_id - except Exception as e: - raise CreateFaaSCampaignError(f"Error creating the FaaS campaign: \n {e}") + except (PayloadError,ScribbleMetaError ) as e: + raise CreateFaaSCampaignError(f"Error creating the FaaS campaign:") diff --git a/mythx_cli/fuzz/rpc.py b/mythx_cli/fuzz/rpc.py index bc34d0b..1b4fb29 100644 --- a/mythx_cli/fuzz/rpc.py +++ b/mythx_cli/fuzz/rpc.py @@ -2,9 +2,12 @@ import json import os import logging + import click import requests +from requests import RequestException +from .exceptions import RPCCallError LOGGER = logging.getLogger("mythx-cli") headers = { @@ -13,40 +16,46 @@ time_limit_seconds = 3000 NUM_BLOCKS_UPPER_LIMIT = 9999 -# TODO: separate into an RPC class and a Harvey class class RPCClient(): def __init__(self, rpc_url: str, number_of_cores: int): self.rpc_url = rpc_url self.number_of_cores = number_of_cores - """Makes an rpc call to the RPC endpoint passed to the construcotr - and returns the `result` property of the rpc response. - """ - # TODO: rename to call - def rpc_call(self, method: str, params: str): - # TODO: add try catch, use the base exceptions if available - payload = "{\"jsonrpc\":\"2.0\",\"method\":\"" + method + "\",\"params\":" + params + ",\"id\":1}" - response = (requests.request("POST", self.rpc_url, headers=headers, data=payload)).json() - return response["result"] + + def call(self, method: str, params: str): + """Make an rpc call to the RPC endpoint + + :return: Result property of the RPC response + """ + try: + payload = "{\"jsonrpc\":\"2.0\",\"method\":\"" + method + "\",\"params\":" + params + ",\"id\":1}" + response = (requests.request("POST", self.rpc_url, headers=headers, data=payload)).json() + return response["result"] + except RequestException as e: + raise RPCCallError(f"HTTP error calling RPC method {method} with parameters: {params}" + f"\nAre you sure the RPC is running at {self.rpc_url}?") + + def contract_exists(self, contract_address): + return self.call("eth_getCode", "[\"" + contract_address + "\",\"latest\"]") def get_block(self, latest: bool = False, block_number: int = -1): block_value = "latest" if latest else str(block_number) if not latest: block_value = hex(block_number) - block = self.rpc_call("eth_getBlockByNumber", "[\"" + block_value + "\", true]") + block = self.call("eth_getBlockByNumber", "[\"" + block_value + "\", true]") if block is None: return None else: return block - """Returns all the blocks that exist on the target - ethereum node. Raises an exception if the number of blocks - exceeds 10000 as it is likely a user error who passed the wrong - RPC address. - """ - def get_all_blocks(self): + """ Get all blocks from the node running at rpc_url + + Raises an exception if the number of blocks + exceeds 10000 as it is likely a user error who passed the wrong + RPC address. + """ latest_block = self.get_block(latest=True) if not latest_block: return [] @@ -62,10 +71,9 @@ def get_all_blocks(self): blocks.append(self.get_block(block_number=i)) return blocks - """Returns a seed state for the target contract in a format that can be used by - the FaaS API and Harvey. - """ + def get_seed_state(self, address: str, other_addresses: [str]): + """Get a seed state for the target contract to be used by Harvey""" try: blocks = self.get_all_blocks() processed_transactions = [] @@ -89,12 +97,12 @@ def get_seed_state(self, address: str, other_addresses: [str]): "num-cores": self.number_of_cores } ) - except: - LOGGER.warning(f"Could generate seed state for address: {address}") - click.echo( + except Exception as e: + LOGGER.warning(f"Could not generate seed state for address: {address}") + raise click.exceptions.UsageError( ( "Unable to generate the seed state for address" + str(address) + "Are you sure you passed the correct contract address?" ) - ) + ) from e diff --git a/mythx_cli/fuzz/run.py b/mythx_cli/fuzz/run.py index dfef532..568d833 100644 --- a/mythx_cli/fuzz/run.py +++ b/mythx_cli/fuzz/run.py @@ -5,6 +5,7 @@ import requests import click from mythx_cli.fuzz.ide.brownie import BrownieJob +from .exceptions import RPCCallError from .faas import FaasClient from .rpc import RPCClient @@ -64,8 +65,6 @@ def fuzz_run(ctx, address, more_addresses, target): # print FaaS dashboard url pointing to campaign analyze_config = ctx.get("fuzz") - contract_address = analyze_config["deployed_contract_address"] - default_config = { "rpc_url": "http://localhost:7545", "faas_url": "http://localhost:8080", @@ -82,7 +81,7 @@ def fuzz_run(ctx, address, more_addresses, target): ) if "deployed_contract_address" not in config_options: raise click.exceptions.UsageError( - "deployed_contract_address not found on .mythx.yaml config file" + "deployed_contract_address not found on .mythx.yaml config file." "You need to provide the address where your main contract is deployed on the .mythx.yaml" ) if not target and "target" not in config_options: @@ -96,7 +95,7 @@ def fuzz_run(ctx, address, more_addresses, target): target = [analyze_config["target"]] # Optional config parameters # Here we parse the config parameters from the config file and use defaults for non available values - # TODO: make into ifs or use dict.update dict.get('key', default), safe way to check it exists + contract_address = analyze_config["deployed_contract_address"] rpc_url = analyze_config["rpc_url"] if 'rpc_url' in config_options else default_config["rpc_url"] faas_url = analyze_config["faas_url"] if 'faas_url' in config_options else default_config["faas_url"] number_of_cores = analyze_config["number_of_cores"] if 'number_of_cores' in config_options else default_config[ @@ -104,13 +103,16 @@ def fuzz_run(ctx, address, more_addresses, target): campaign_name_prefix = analyze_config["campaign_name_prefix"] if "campaign_name_prefix" in config_options else \ default_config["campaign_name_prefix"] - rpc_client = RPCClient(rpc_url, number_of_cores) - - contract_code_response = rpc_client.rpc_call("eth_getCode", "[\"" + contract_address + "\",\"latest\"]") + try: + rpc_client = RPCClient(rpc_url, number_of_cores) + contract_code_response = rpc_client.contract_exists( contract_address) + except RPCCallError as e: + raise click.exceptions.UsageError(f"RPC endpoint." + f"\n{e}") - # TODO: raise exception with wrong contract address - if contract_code_response is None: - print("Invalid address") + if not contract_code_response: + LOGGER.warning(f"Contract code not found") + raise click.exceptions.ClickException(f"Unable to find a contract deployed at {contract_address}.") if more_addresses is None: other_addresses = [] @@ -128,7 +130,5 @@ def fuzz_run(ctx, address, more_addresses, target): click.echo("You can view campaign here: " + faas_url + "/campaigns/" + str(campaign_id)) except Exception as e: LOGGER.warning(f"Could not submit campaign to the FaaS") - click.echo(f"Unable to submit the campaign to the faas. Are you sure the service is running on {faas_url} ?" - f"Error: {e}") - raise + raise click.exceptions.UsageError(f"Unable to submit the campaign to the faas. Are you sure the service is running on {faas_url} ?") pass diff --git a/tests/.mythx.yml b/tests/.mythx.yml new file mode 100644 index 0000000..af20b9b --- /dev/null +++ b/tests/.mythx.yml @@ -0,0 +1,6 @@ +fuzz: + build_directory: build/contracts + number_of_cores: 1 + campaign_name_prefix: "brownie_test" + rpc_url: "http://localhost:7545" + faas_url: "http://localhost:8080" \ No newline at end of file diff --git a/tests/common.py b/tests/common.py index bd9bf9e..0910f65 100644 --- a/tests/common.py +++ b/tests/common.py @@ -34,6 +34,20 @@ def get_test_case(path: str, obj=None, raw=False): AST = get_test_case("testdata/test-ast.json") +@contextmanager +def mock_faas_context(): + # with patch("mythx_cli.fuzz.rpc.RPCClient.get_all_blocks", new=) as get_all_blocks_patch, patch( + # "mythx_cli.fuzz.rpc.RPCClient.contract_exists" + # ) as contract_exists_patch: + # print("-->patching blocks") + # get_all_blocks_patch.return_value = get_test_case("testdata/ganache-all-blocks.json") + # contract_exists_patch.return_value = True + with patch("mythx_cli.fuzz.rpc.RPCClient") as RPCClient_mock: + instance = RPCClient_mock.return_value + instance.get_all_blocks.return_value = get_test_case("testdata/ganache-all-blocks.json") + instance.contract_exists.return_value = True + yield + @contextmanager def mock_context( diff --git a/tests/test_fuzz.py b/tests/test_fuzz.py index fdf2a97..b027340 100644 --- a/tests/test_fuzz.py +++ b/tests/test_fuzz.py @@ -1,7 +1,199 @@ import pytest from click.testing import CliRunner +import os + +import requests +from requests import RequestException from mythx_cli.cli import cli +import json +from unittest.mock import patch + +from mythx_cli.fuzz.exceptions import RequestError +from .common import get_test_case, mock_context, mock_faas_context +from mythx_cli.fuzz.rpc import RPCClient +from mythx_cli.fuzz.faas import FaasClient + +BROWNIE_ARTIFACT = get_test_case("testdata/brownie-artifact.json") +GANACHE_URL = "http://localhost:9898" +FAAS_URL = "http://localhost:9899" + + +def setup_brownie_project(base_path, compiled=True, switch_dir=False): + # switch to temp dir if requested + if switch_dir: + os.chdir(str(base_path)) + + # add brownie project structure + os.makedirs(str(base_path / "build/contracts/")) + os.makedirs(str(base_path / "contracts/")) + + # patch brownie artifact with temp path + BROWNIE_ARTIFACT["allSourcePaths"][0] = f"{base_path}/contracts/sample.sol" + BROWNIE_ARTIFACT["sourcePath"] = f"{base_path}/contracts/sample.sol" + + # add sample brownie artifact + with open(base_path / "build/contracts/Foo.json", "w+") as artifact_f: + json.dump(BROWNIE_ARTIFACT, artifact_f) + with open(base_path / "contracts/sample.sol", "w+") as sol_f: + sol_f.write("sol code here") + + +def generate_config_file(base_path="", not_include=[]): + config_file = "fuzz:" + + if 'deployed_contract_address' not in not_include: + config_file += '\n deployed_contract_address: "0x7277646075fa72737e1F6114654C5d9949a67dF2"' + if 'number_of_cores' not in not_include: + config_file += '\n number_of_cores: 1' + if 'campaign_name_prefix' not in not_include: + config_file += '\n campaign_name_prefix: "brownie_test"' + if 'rpc_url' not in not_include: + config_file += f'\n rpc_url: "{GANACHE_URL}"' + if 'faas_url' not in not_include: + config_file += f'\n faas_url: "{FAAS_URL}"' + if 'build_directory' not in not_include: + config_file += f'\n build_directory: {base_path}/build/contracts' + + return config_file + + +def test_fuzz_no_build_dir(tmp_path): + runner = CliRunner() + with open(".mythx.yml", "w+") as conf_f: + conf_f.write(generate_config_file(not_include=["build_directory"])) + + result = runner.invoke(cli, ["fuzz", "run", "contracts"]) + assert "Error: build_directory not found on .mythx.yaml config file" in result.output + assert result.exit_code != 0 + + +def test_fuzz_no_deployed_address(tmp_path): + runner = CliRunner() + with open(".mythx.yml", "w+") as conf_f: + conf_f.write(generate_config_file(not_include=["deployed_contract_address"])) + + result = runner.invoke(cli, ["fuzz", "run", "contracts"]) + assert "Error: deployed_contract_address not found on .mythx.yaml config file." in result.output + assert result.exit_code != 0 + + +def test_fuzz_no_target(tmp_path): + runner = CliRunner() + with open(".mythx.yml", "w+") as conf_f: + conf_f.write(generate_config_file()) + + result = runner.invoke(cli, ["fuzz", "run"]) + assert "Error: Target not provided." in result.output + assert result.exit_code != 0 + + +def test_fuzz_no_contract_at_address(tmp_path): + setup_brownie_project( + tmp_path, compiled=False, switch_dir=False + ) + + with open(".mythx.yml", "w+") as conf_f: + conf_f.write(generate_config_file(base_path=tmp_path)) + + with patch.object(RPCClient, 'contract_exists') as contract_exists_mock, patch.object( + RPCClient, 'get_all_blocks') as get_all_blocks_mock: + get_all_blocks_mock.return_value = get_test_case("testdata/ganache-all-blocks.json") + contract_exists_mock.return_value = False + + runner = CliRunner() + result = runner.invoke(cli, ["fuzz", "run", f"{tmp_path}/contracts"]) + + assert "Error: Unable to find a contract deployed" in result.output + assert result.exit_code != 0 + + +def test_faas_not_running(tmp_path): + setup_brownie_project( + tmp_path, compiled=False, switch_dir=False + ) + + with open(".mythx.yml", "w+") as conf_f: + conf_f.write(generate_config_file(base_path=tmp_path)) + + with patch.object(RPCClient, 'contract_exists') as contract_exists_mock, patch.object( + RPCClient, 'get_all_blocks') as get_all_blocks_mock, patch.object( + FaasClient, 'start_faas_campaign') as start_faas_campaign_mock: + get_all_blocks_mock.return_value = get_test_case("testdata/ganache-all-blocks.json") + contract_exists_mock.return_value = True + start_faas_campaign_mock.side_effect = RequestError(f"Error starting FaaS campaign.") + + runner = CliRunner() + result = runner.invoke(cli, ["fuzz", "run", f"{tmp_path}/contracts"]) + + assert "Error: Unable to submit the campaign to the faas. Are you sure the service is running on" in result.output + assert result.exit_code != 0 + +def test_rpc_not_running(tmp_path): + with open(".mythx.yml", "w+") as conf_f: + conf_f.write(generate_config_file(base_path=tmp_path)) + + with patch.object(requests, 'request') as requests_mock: + requests_mock.side_effect = RequestException() + + runner = CliRunner() + result = runner.invoke(cli, ["fuzz", "run", f"{tmp_path}/contracts"]) + + assert "HTTP error calling RPC method eth_getCode with parameters" in result.output + assert result.exit_code != 0 + + + +@pytest.mark.parametrize( + "keyword", + ( + "parameters", + "name", + "corpus", + "sources", + "contracts", + "address-under-test", + "source", + "fileIndex", + "sourcePaths", + "deployedSourceMap", + "mainSourceFile", + "contractName", + "bytecode", + "deployedBytecode", + "sourceMap", + "deployedSourceMap" + ), +) +def test_fuzz_run(tmp_path, keyword): + setup_brownie_project( + tmp_path, compiled=False, switch_dir=False + ) + + with open(".mythx.yml", "w+") as conf_f: + conf_f.write(generate_config_file(base_path=tmp_path)) + + with patch.object(RPCClient, 'contract_exists') as contract_exists_mock, patch.object( + RPCClient, 'get_all_blocks') as get_all_blocks_mock, patch.object( + FaasClient, 'start_faas_campaign') as start_faas_campaign_mock: + get_all_blocks_mock.return_value = get_test_case("testdata/ganache-all-blocks.json") + contract_exists_mock.return_value = True + campaign_id = "560ba03a-8744-4da6-aeaa-a62568ccbf44" + start_faas_campaign_mock.return_value = campaign_id + + runner = CliRunner() + result = runner.invoke(cli, ["fuzz", "run", f"{tmp_path}/contracts"]) + + contract_exists_mock.assert_called_with("0x7277646075fa72737e1F6114654C5d9949a67dF2") + contract_exists_mock.assert_called_once() + get_all_blocks_mock.assert_called_once() + start_faas_campaign_mock.assert_called_once() + called_with = start_faas_campaign_mock.call_args + assert f"You can view campaign here: {FAAS_URL}/campaigns/{campaign_id}" in result.output + + request_payload = json.dumps(called_with.args[0]) + assert keyword in request_payload + assert result.exit_code == 0 @pytest.mark.parametrize("keyword", ("run", "disarm", "arm", "run")) diff --git a/tests/testdata/brownie-artifact.json b/tests/testdata/brownie-artifact.json new file mode 100644 index 0000000..34efce4 --- /dev/null +++ b/tests/testdata/brownie-artifact.json @@ -0,0 +1,4813 @@ +{ + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "string", + "name": "message", + "type": "string" + } + ], + "name": "AssertionFailed", + "type": "event" + }, + { + "inputs": [], + "name": "Bar", + "outputs": [ + { + "internalType": "int256", + "name": "RET_0", + "type": "int256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bool", + "name": "b", + "type": "bool" + } + ], + "name": "SetNext", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "allSourcePaths": { + "0": "contracts/sample.sol" + }, + "ast": { + "absolutePath": "contracts/sample.sol", + "exportedSymbols": { + "Foo": [ + 171 + ] + }, + "id": 172, + "license": null, + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 1, + "literals": [ + "solidity", + "<", + "0.8", + ".0" + ], + "nodeType": "PragmaDirective", + "src": "0:23:0" + }, + { + "abstract": false, + "baseContracts": [], + "contractDependencies": [], + "contractKind": "contract", + "documentation": null, + "fullyImplemented": true, + "id": 171, + "linearizedBaseContracts": [ + 171 + ], + "name": "Foo", + "nodeType": "ContractDefinition", + "nodes": [ + { + "anonymous": false, + "documentation": null, + "id": 5, + "name": "AssertionFailed", + "nodeType": "EventDefinition", + "parameters": { + "id": 4, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3, + "indexed": false, + "mutability": "mutable", + "name": "message", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 5, + "src": "66:14:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string" + }, + "typeName": { + "id": 2, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "66:6:0", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "65:16:0" + }, + "src": "44:38:0" + }, + { + "constant": false, + "id": 7, + "mutability": "mutable", + "name": "x", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 171, + "src": "88:16:0", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 6, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "88:6:0", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "value": null, + "visibility": "private" + }, + { + "body": { + "id": 32, + "nodeType": "Block", + "src": "156:164:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 15, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 12, + "name": "RET_0", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10, + "src": "166:5:0", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 13, + "name": "_original_Foo_Bar", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 151, + "src": "174:17:0", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_int256_$", + "typeString": "function () view returns (int256)" + } + }, + "id": 14, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "174:19:0", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "src": "166:27:0", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "id": 16, + "nodeType": "ExpressionStatement", + "src": "166:27:0" + }, + { + "condition": { + "argumentTypes": null, + "id": 21, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "!", + "prefix": true, + "src": "207:10:0", + "subExpression": { + "argumentTypes": null, + "components": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 19, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 17, + "name": "x", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7, + "src": "209:1:0", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "hexValue": "3139", + "id": 18, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "214:2:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_19_by_1", + "typeString": "int_const 19" + }, + "value": "19" + }, + "src": "209:7:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "id": 20, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "208:9:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 31, + "nodeType": "IfStatement", + "src": "203:111:0", + "trueBody": { + "id": 30, + "nodeType": "Block", + "src": "219:95:0", + "statements": [ + { + "eventCall": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "303a20546869732073686f756c64206661696c", + "id": 23, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "254:21:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_7379ea5b6329927764dc2a90425e24f5f69809aa582db010111d15cc830e8a08", + "typeString": "literal_string \"0: This should fail\"" + }, + "value": "0: This should fail" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_7379ea5b6329927764dc2a90425e24f5f69809aa582db010111d15cc830e8a08", + "typeString": "literal_string \"0: This should fail\"" + } + ], + "id": 22, + "name": "AssertionFailed", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5, + "src": "238:15:0", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_string_memory_ptr_$returns$__$", + "typeString": "function (string memory)" + } + }, + "id": 24, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "238:38:0", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 25, + "nodeType": "EmitStatement", + "src": "233:43:0" + }, + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "66616c7365", + "id": 27, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "297:5:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "false" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "id": 26, + "name": "assert", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -3, + "src": "290:6:0", + "typeDescriptions": { + "typeIdentifier": "t_function_assert_pure$_t_bool_$returns$__$", + "typeString": "function (bool) pure" + } + }, + "id": 28, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "290:13:0", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 29, + "nodeType": "ExpressionStatement", + "src": "290:13:0" + } + ] + } + } + ] + }, + "documentation": null, + "functionSelector": "b0a378b0", + "id": 33, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "Bar", + "nodeType": "FunctionDefinition", + "overrides": null, + "parameters": { + "id": 8, + "nodeType": "ParameterList", + "parameters": [], + "src": "123:2:0" + }, + "returnParameters": { + "id": 11, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10, + "mutability": "mutable", + "name": "RET_0", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 33, + "src": "142:12:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 9, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "142:6:0", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "141:14:0" + }, + "scope": 171, + "src": "111:209:0", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "public" + }, + { + "body": { + "id": 150, + "nodeType": "Block", + "src": "385:855:0", + "statements": [ + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 40, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 38, + "name": "x", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7, + "src": "399:1:0", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "hexValue": "3130", + "id": 39, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "404:2:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_10_by_1", + "typeString": "int_const 10" + }, + "value": "10" + }, + "src": "399:7:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 48, + "nodeType": "IfStatement", + "src": "395:73:0", + "trueBody": { + "id": 47, + "nodeType": "Block", + "src": "408:60:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "66616c7365", + "id": 42, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "429:5:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "false" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "id": 41, + "name": "assert", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -3, + "src": "422:6:0", + "typeDescriptions": { + "typeIdentifier": "t_function_assert_pure$_t_bool_$returns$__$", + "typeString": "function (bool) pure" + } + }, + "id": 43, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "422:13:0", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 44, + "nodeType": "ExpressionStatement", + "src": "422:13:0" + }, + { + "expression": { + "argumentTypes": null, + "hexValue": "31", + "id": 45, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "456:1:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "functionReturnParameters": 37, + "id": 46, + "nodeType": "Return", + "src": "449:8:0" + } + ] + } + }, + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 51, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 49, + "name": "x", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7, + "src": "481:1:0", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "hexValue": "3330", + "id": 50, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "486:2:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_30_by_1", + "typeString": "int_const 30" + }, + "value": "30" + }, + "src": "481:7:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 59, + "nodeType": "IfStatement", + "src": "477:73:0", + "trueBody": { + "id": 58, + "nodeType": "Block", + "src": "490:60:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "66616c7365", + "id": 53, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "511:5:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "false" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "id": 52, + "name": "assert", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -3, + "src": "504:6:0", + "typeDescriptions": { + "typeIdentifier": "t_function_assert_pure$_t_bool_$returns$__$", + "typeString": "function (bool) pure" + } + }, + "id": 54, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "504:13:0", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 55, + "nodeType": "ExpressionStatement", + "src": "504:13:0" + }, + { + "expression": { + "argumentTypes": null, + "hexValue": "33", + "id": 56, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "538:1:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_3_by_1", + "typeString": "int_const 3" + }, + "value": "3" + }, + "functionReturnParameters": 37, + "id": 57, + "nodeType": "Return", + "src": "531:8:0" + } + ] + } + }, + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 62, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 60, + "name": "x", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7, + "src": "563:1:0", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "hexValue": "3530", + "id": 61, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "568:2:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_50_by_1", + "typeString": "int_const 50" + }, + "value": "50" + }, + "src": "563:7:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 70, + "nodeType": "IfStatement", + "src": "559:73:0", + "trueBody": { + "id": 69, + "nodeType": "Block", + "src": "572:60:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "66616c7365", + "id": 64, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "593:5:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "false" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "id": 63, + "name": "assert", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -3, + "src": "586:6:0", + "typeDescriptions": { + "typeIdentifier": "t_function_assert_pure$_t_bool_$returns$__$", + "typeString": "function (bool) pure" + } + }, + "id": 65, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "586:13:0", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 66, + "nodeType": "ExpressionStatement", + "src": "586:13:0" + }, + { + "expression": { + "argumentTypes": null, + "hexValue": "35", + "id": 67, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "620:1:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_5_by_1", + "typeString": "int_const 5" + }, + "value": "5" + }, + "functionReturnParameters": 37, + "id": 68, + "nodeType": "Return", + "src": "613:8:0" + } + ] + } + }, + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 73, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 71, + "name": "x", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7, + "src": "645:1:0", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "hexValue": "3730", + "id": 72, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "650:2:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_70_by_1", + "typeString": "int_const 70" + }, + "value": "70" + }, + "src": "645:7:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 81, + "nodeType": "IfStatement", + "src": "641:73:0", + "trueBody": { + "id": 80, + "nodeType": "Block", + "src": "654:60:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "66616c7365", + "id": 75, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "675:5:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "false" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "id": 74, + "name": "assert", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -3, + "src": "668:6:0", + "typeDescriptions": { + "typeIdentifier": "t_function_assert_pure$_t_bool_$returns$__$", + "typeString": "function (bool) pure" + } + }, + "id": 76, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "668:13:0", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 77, + "nodeType": "ExpressionStatement", + "src": "668:13:0" + }, + { + "expression": { + "argumentTypes": null, + "hexValue": "37", + "id": 78, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "702:1:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_7_by_1", + "typeString": "int_const 7" + }, + "value": "7" + }, + "functionReturnParameters": 37, + "id": 79, + "nodeType": "Return", + "src": "695:8:0" + } + ] + } + }, + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 84, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 82, + "name": "x", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7, + "src": "727:1:0", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "hexValue": "3930", + "id": 83, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "732:2:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_90_by_1", + "typeString": "int_const 90" + }, + "value": "90" + }, + "src": "727:7:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 92, + "nodeType": "IfStatement", + "src": "723:73:0", + "trueBody": { + "id": 91, + "nodeType": "Block", + "src": "736:60:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "66616c7365", + "id": 86, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "757:5:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "false" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "id": 85, + "name": "assert", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -3, + "src": "750:6:0", + "typeDescriptions": { + "typeIdentifier": "t_function_assert_pure$_t_bool_$returns$__$", + "typeString": "function (bool) pure" + } + }, + "id": 87, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "750:13:0", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 88, + "nodeType": "ExpressionStatement", + "src": "750:13:0" + }, + { + "expression": { + "argumentTypes": null, + "hexValue": "39", + "id": 89, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "784:1:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_9_by_1", + "typeString": "int_const 9" + }, + "value": "9" + }, + "functionReturnParameters": 37, + "id": 90, + "nodeType": "Return", + "src": "777:8:0" + } + ] + } + }, + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 95, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 93, + "name": "x", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7, + "src": "809:1:0", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "hexValue": "313130", + "id": 94, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "814:3:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_110_by_1", + "typeString": "int_const 110" + }, + "value": "110" + }, + "src": "809:8:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 103, + "nodeType": "IfStatement", + "src": "805:75:0", + "trueBody": { + "id": 102, + "nodeType": "Block", + "src": "819:61:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "66616c7365", + "id": 97, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "840:5:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "false" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "id": 96, + "name": "assert", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -3, + "src": "833:6:0", + "typeDescriptions": { + "typeIdentifier": "t_function_assert_pure$_t_bool_$returns$__$", + "typeString": "function (bool) pure" + } + }, + "id": 98, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "833:13:0", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 99, + "nodeType": "ExpressionStatement", + "src": "833:13:0" + }, + { + "expression": { + "argumentTypes": null, + "hexValue": "3131", + "id": 100, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "867:2:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_11_by_1", + "typeString": "int_const 11" + }, + "value": "11" + }, + "functionReturnParameters": 37, + "id": 101, + "nodeType": "Return", + "src": "860:9:0" + } + ] + } + }, + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 106, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 104, + "name": "x", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7, + "src": "893:1:0", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "hexValue": "313330", + "id": 105, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "898:3:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_130_by_1", + "typeString": "int_const 130" + }, + "value": "130" + }, + "src": "893:8:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 114, + "nodeType": "IfStatement", + "src": "889:75:0", + "trueBody": { + "id": 113, + "nodeType": "Block", + "src": "903:61:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "66616c7365", + "id": 108, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "924:5:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "false" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "id": 107, + "name": "assert", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -3, + "src": "917:6:0", + "typeDescriptions": { + "typeIdentifier": "t_function_assert_pure$_t_bool_$returns$__$", + "typeString": "function (bool) pure" + } + }, + "id": 109, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "917:13:0", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 110, + "nodeType": "ExpressionStatement", + "src": "917:13:0" + }, + { + "expression": { + "argumentTypes": null, + "hexValue": "3133", + "id": 111, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "951:2:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_13_by_1", + "typeString": "int_const 13" + }, + "value": "13" + }, + "functionReturnParameters": 37, + "id": 112, + "nodeType": "Return", + "src": "944:9:0" + } + ] + } + }, + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 117, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 115, + "name": "x", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7, + "src": "977:1:0", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "hexValue": "313530", + "id": 116, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "982:3:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_150_by_1", + "typeString": "int_const 150" + }, + "value": "150" + }, + "src": "977:8:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 125, + "nodeType": "IfStatement", + "src": "973:75:0", + "trueBody": { + "id": 124, + "nodeType": "Block", + "src": "987:61:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "66616c7365", + "id": 119, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1008:5:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "false" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "id": 118, + "name": "assert", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -3, + "src": "1001:6:0", + "typeDescriptions": { + "typeIdentifier": "t_function_assert_pure$_t_bool_$returns$__$", + "typeString": "function (bool) pure" + } + }, + "id": 120, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "1001:13:0", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 121, + "nodeType": "ExpressionStatement", + "src": "1001:13:0" + }, + { + "expression": { + "argumentTypes": null, + "hexValue": "3135", + "id": 122, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1035:2:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_15_by_1", + "typeString": "int_const 15" + }, + "value": "15" + }, + "functionReturnParameters": 37, + "id": 123, + "nodeType": "Return", + "src": "1028:9:0" + } + ] + } + }, + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 128, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 126, + "name": "x", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7, + "src": "1061:1:0", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "hexValue": "313730", + "id": 127, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1066:3:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_170_by_1", + "typeString": "int_const 170" + }, + "value": "170" + }, + "src": "1061:8:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 136, + "nodeType": "IfStatement", + "src": "1057:75:0", + "trueBody": { + "id": 135, + "nodeType": "Block", + "src": "1071:61:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "66616c7365", + "id": 130, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1092:5:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "false" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "id": 129, + "name": "assert", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -3, + "src": "1085:6:0", + "typeDescriptions": { + "typeIdentifier": "t_function_assert_pure$_t_bool_$returns$__$", + "typeString": "function (bool) pure" + } + }, + "id": 131, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "1085:13:0", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 132, + "nodeType": "ExpressionStatement", + "src": "1085:13:0" + }, + { + "expression": { + "argumentTypes": null, + "hexValue": "3137", + "id": 133, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1119:2:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_17_by_1", + "typeString": "int_const 17" + }, + "value": "17" + }, + "functionReturnParameters": 37, + "id": 134, + "nodeType": "Return", + "src": "1112:9:0" + } + ] + } + }, + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 139, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 137, + "name": "x", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7, + "src": "1145:1:0", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "hexValue": "313930", + "id": 138, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1150:3:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_190_by_1", + "typeString": "int_const 190" + }, + "value": "190" + }, + "src": "1145:8:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 147, + "nodeType": "IfStatement", + "src": "1141:75:0", + "trueBody": { + "id": 146, + "nodeType": "Block", + "src": "1155:61:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "66616c7365", + "id": 141, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1176:5:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "false" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "id": 140, + "name": "assert", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -3, + "src": "1169:6:0", + "typeDescriptions": { + "typeIdentifier": "t_function_assert_pure$_t_bool_$returns$__$", + "typeString": "function (bool) pure" + } + }, + "id": 142, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "1169:13:0", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 143, + "nodeType": "ExpressionStatement", + "src": "1169:13:0" + }, + { + "expression": { + "argumentTypes": null, + "hexValue": "3139", + "id": 144, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1203:2:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_19_by_1", + "typeString": "int_const 19" + }, + "value": "19" + }, + "functionReturnParameters": 37, + "id": 145, + "nodeType": "Return", + "src": "1196:9:0" + } + ] + } + }, + { + "expression": { + "argumentTypes": null, + "hexValue": "30", + "id": 148, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1232:1:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "functionReturnParameters": 37, + "id": 149, + "nodeType": "Return", + "src": "1225:8:0" + } + ] + }, + "documentation": null, + "id": 151, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_original_Foo_Bar", + "nodeType": "FunctionDefinition", + "overrides": null, + "parameters": { + "id": 34, + "nodeType": "ParameterList", + "parameters": [], + "src": "352:2:0" + }, + "returnParameters": { + "id": 37, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 36, + "mutability": "mutable", + "name": "", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 151, + "src": "377:6:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 35, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "377:6:0", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "376:8:0" + }, + "scope": 171, + "src": "326:914:0", + "stateMutability": "view", + "virtual": false, + "visibility": "private" + }, + { + "body": { + "id": 169, + "nodeType": "Block", + "src": "1278:42:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 167, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 156, + "name": "x", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7, + "src": "1288:1:0", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 166, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "components": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 159, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "hexValue": "32", + "id": 157, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1293:1:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_2_by_1", + "typeString": "int_const 2" + }, + "value": "2" + }, + "nodeType": "BinaryOperation", + "operator": "*", + "rightExpression": { + "argumentTypes": null, + "id": 158, + "name": "x", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7, + "src": "1297:1:0", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "src": "1293:5:0", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "id": 160, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "1292:7:0", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "argumentTypes": null, + "components": [ + { + "argumentTypes": null, + "condition": { + "argumentTypes": null, + "id": 161, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 153, + "src": "1303:1:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseExpression": { + "argumentTypes": null, + "hexValue": "30", + "id": 163, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1311:1:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "id": 164, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "Conditional", + "src": "1303:9:0", + "trueExpression": { + "argumentTypes": null, + "hexValue": "31", + "id": 162, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1307:1:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + } + ], + "id": 165, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "1302:11:0", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "src": "1292:21:0", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "src": "1288:25:0", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "id": 168, + "nodeType": "ExpressionStatement", + "src": "1288:25:0" + } + ] + }, + "documentation": null, + "functionSelector": "df5b7227", + "id": 170, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "SetNext", + "nodeType": "FunctionDefinition", + "overrides": null, + "parameters": { + "id": 154, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 153, + "mutability": "mutable", + "name": "b", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 170, + "src": "1263:6:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 152, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "1263:4:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "1262:8:0" + }, + "returnParameters": { + "id": 155, + "nodeType": "ParameterList", + "parameters": [], + "src": "1278:0:0" + }, + "scope": 171, + "src": "1246:74:0", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "public" + } + ], + "scope": 172, + "src": "25:1297:0" + } + ], + "src": "0:1322:0" + }, + "bytecode": "608060405234801561001057600080fd5b506101c8806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063b0a378b01461003b578063df5b722714610055575b600080fd5b610043610076565b60408051918252519081900360200190f35b6100746004803603602081101561006b57600080fd5b503515156100e7565b005b6000610080610109565b90506000546013146100e457604080516020808252601390820152720c0e88151a1a5cc81cda1bdd5b190819985a5b606a1b8183015290517fb42604cb105a16c8f6db8a41e6b00c0c1b4826465e8bc504b3eb3e88b3e6a4a09181900360600190a1fe5b90565b806100f35760006100f6565b60015b60ff166000546002020160008190555050565b60008054600a141561011757fe5b600054601e141561012457fe5b6000546032141561013157fe5b6000546046141561013e57fe5b600054605a141561014b57fe5b600054606e141561015857fe5b6000546082141561016557fe5b6000546096141561017257fe5b60005460aa141561017f57fe5b60005460be141561018c57fe5b5060009056fea2646970667358221220d15c0974595ed5c9a5da68377d16635bfa92f13a2af22bf0b52f63632505f04664736f6c634300060c0033", + "bytecodeSha1": "ccde364430bb9e46053b700e953a13e72469a7ad", + "compiler": { + "evm_version": "istanbul", + "optimizer": { + "enabled": true, + "runs": 200 + }, + "version": "0.6.12+commit.27d51765" + }, + "contractName": "Foo", + "coverageMap": { + "branches": { + "0": { + "Foo.SetNext": { + "15": [ + 1303, + 1304, + true + ] + }, + "Foo._original_Foo_Bar": { + "16": [ + 399, + 406, + false + ], + "17": [ + 481, + 488, + false + ], + "18": [ + 563, + 570, + false + ], + "19": [ + 645, + 652, + false + ], + "20": [ + 727, + 734, + false + ], + "21": [ + 809, + 817, + false + ], + "22": [ + 893, + 901, + false + ], + "23": [ + 977, + 985, + false + ], + "24": [ + 1061, + 1069, + false + ], + "25": [ + 1145, + 1153, + false + ] + } + } + }, + "statements": { + "0": { + "Foo.Bar": { + "0": [ + 166, + 193 + ], + "1": [ + 233, + 276 + ], + "2": [ + 290, + 303 + ] + }, + "Foo.SetNext": { + "3": [ + 1288, + 1313 + ] + }, + "Foo._original_Foo_Bar": { + "4": [ + 422, + 435 + ], + "5": [ + 504, + 517 + ], + "6": [ + 586, + 599 + ], + "7": [ + 668, + 681 + ], + "8": [ + 750, + 763 + ], + "9": [ + 833, + 846 + ], + "10": [ + 917, + 930 + ], + "11": [ + 1001, + 1014 + ], + "12": [ + 1085, + 1098 + ], + "13": [ + 1169, + 1182 + ], + "14": [ + 1225, + 1233 + ] + } + } + } + }, + "dependencies": [], + "deployedBytecode": "608060405234801561001057600080fd5b50600436106100365760003560e01c8063b0a378b01461003b578063df5b722714610055575b600080fd5b610043610076565b60408051918252519081900360200190f35b6100746004803603602081101561006b57600080fd5b503515156100e7565b005b6000610080610109565b90506000546013146100e457604080516020808252601390820152720c0e88151a1a5cc81cda1bdd5b190819985a5b606a1b8183015290517fb42604cb105a16c8f6db8a41e6b00c0c1b4826465e8bc504b3eb3e88b3e6a4a09181900360600190a1fe5b90565b806100f35760006100f6565b60015b60ff166000546002020160008190555050565b60008054600a141561011757fe5b600054601e141561012457fe5b6000546032141561013157fe5b6000546046141561013e57fe5b600054605a141561014b57fe5b600054606e141561015857fe5b6000546082141561016557fe5b6000546096141561017257fe5b60005460aa141561017f57fe5b60005460be141561018c57fe5b5060009056fea2646970667358221220d15c0974595ed5c9a5da68377d16635bfa92f13a2af22bf0b52f63632505f04664736f6c634300060c0033", + "deployedSourceMap": "25:1297:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;111:209;;;:::i;:::-;;;;;;;;;;;;;;;;1246:74;;;;;;;;;;;;;;;;-1:-1:-1;1246:74:0;;;;:::i;:::-;;111:209;142:12;174:19;:17;:19::i;:::-;166:27;;209:1;;214:2;209:7;203:111;;238:38;;;;;;;;;;;;-1:-1:-1;;;238:38:0;;;;;;;;;;;;;;;290:13;;111:209;:::o;1246:74::-;1303:1;:9;;1311:1;1303:9;;;1307:1;1303:9;1292:21;;1297:1;;1293;:5;1292:21;1288:1;:25;;;;1246:74;:::o;326:914::-;377:6;399:1;;404:2;399:7;395:73;;;422:13;395:73;481:1;;486:2;481:7;477:73;;;504:13;477:73;563:1;;568:2;563:7;559:73;;;586:13;559:73;645:1;;650:2;645:7;641:73;;;668:13;641:73;727:1;;732:2;727:7;723:73;;;750:13;723:73;809:1;;814:3;809:8;805:75;;;833:13;805:75;893:1;;898:3;893:8;889:75;;;917:13;889:75;977:1;;982:3;977:8;973:75;;;1001:13;973:75;1061:1;;1066:3;1061:8;1057:75;;;1085:13;1057:75;1145:1;;1150:3;1145:8;1141:75;;;1169:13;1141:75;-1:-1:-1;1232:1:0;326:914;:::o", + "language": "Solidity", + "natspec": { + "kind": "dev", + "methods": {}, + "version": 1 + }, + "offset": [ + 25, + 1322 + ], + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x36 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xB0A378B0 EQ PUSH2 0x3B JUMPI DUP1 PUSH4 0xDF5B7227 EQ PUSH2 0x55 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x43 PUSH2 0x76 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x74 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x6B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD ISZERO ISZERO PUSH2 0xE7 JUMP JUMPDEST STOP JUMPDEST PUSH1 0x0 PUSH2 0x80 PUSH2 0x109 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 SLOAD PUSH1 0x13 EQ PUSH2 0xE4 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x13 SWAP1 DUP3 ADD MSTORE PUSH19 0xC0E88151A1A5CC81CDA1BDD5B190819985A5B PUSH1 0x6A SHL DUP2 DUP4 ADD MSTORE SWAP1 MLOAD PUSH32 0xB42604CB105A16C8F6DB8A41E6B00C0C1B4826465E8BC504B3EB3E88B3E6A4A0 SWAP2 DUP2 SWAP1 SUB PUSH1 0x60 ADD SWAP1 LOG1 INVALID JUMPDEST SWAP1 JUMP JUMPDEST DUP1 PUSH2 0xF3 JUMPI PUSH1 0x0 PUSH2 0xF6 JUMP JUMPDEST PUSH1 0x1 JUMPDEST PUSH1 0xFF AND PUSH1 0x0 SLOAD PUSH1 0x2 MUL ADD PUSH1 0x0 DUP2 SWAP1 SSTORE POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0xA EQ ISZERO PUSH2 0x117 JUMPI INVALID JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1E EQ ISZERO PUSH2 0x124 JUMPI INVALID JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x32 EQ ISZERO PUSH2 0x131 JUMPI INVALID JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x46 EQ ISZERO PUSH2 0x13E JUMPI INVALID JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x5A EQ ISZERO PUSH2 0x14B JUMPI INVALID JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x6E EQ ISZERO PUSH2 0x158 JUMPI INVALID JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x82 EQ ISZERO PUSH2 0x165 JUMPI INVALID JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x96 EQ ISZERO PUSH2 0x172 JUMPI INVALID JUMPDEST PUSH1 0x0 SLOAD PUSH1 0xAA EQ ISZERO PUSH2 0x17F JUMPI INVALID JUMPDEST PUSH1 0x0 SLOAD PUSH1 0xBE EQ ISZERO PUSH2 0x18C JUMPI INVALID JUMPDEST POP PUSH1 0x0 SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xD1 0x5C MULMOD PUSH21 0x595ED5C9A5DA68377D16635BFA92F13A2AF22BF0B5 0x2F PUSH4 0x632505F0 CHAINID PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER ", + "pcMap": { + "0": { + "offset": [ + 25, + 1322 + ], + "op": "PUSH1", + "path": "0", + "value": "0x80" + }, + "2": { + "fn": null, + "offset": [ + 25, + 1322 + ], + "op": "PUSH1", + "path": "0", + "value": "0x40" + }, + "4": { + "fn": null, + "offset": [ + 25, + 1322 + ], + "op": "MSTORE", + "path": "0" + }, + "5": { + "fn": null, + "offset": [ + 25, + 1322 + ], + "op": "CALLVALUE", + "path": "0" + }, + "6": { + "fn": null, + "offset": [ + 25, + 1322 + ], + "op": "DUP1", + "path": "0" + }, + "7": { + "fn": null, + "offset": [ + 25, + 1322 + ], + "op": "ISZERO", + "path": "0" + }, + "8": { + "fn": null, + "offset": [ + 25, + 1322 + ], + "op": "PUSH2", + "path": "0", + "value": "0x10" + }, + "11": { + "fn": null, + "offset": [ + 25, + 1322 + ], + "op": "JUMPI", + "path": "0" + }, + "12": { + "fn": null, + "offset": [ + 25, + 1322 + ], + "op": "PUSH1", + "path": "0", + "value": "0x0" + }, + "14": { + "fn": null, + "offset": [ + 25, + 1322 + ], + "op": "DUP1", + "path": "0" + }, + "15": { + "dev": "Cannot send ether to nonpayable function", + "fn": null, + "offset": [ + 25, + 1322 + ], + "op": "REVERT", + "path": "0" + }, + "16": { + "fn": null, + "offset": [ + 25, + 1322 + ], + "op": "JUMPDEST", + "path": "0" + }, + "17": { + "fn": null, + "offset": [ + 25, + 1322 + ], + "op": "POP", + "path": "0" + }, + "18": { + "fn": null, + "offset": [ + 25, + 1322 + ], + "op": "PUSH1", + "path": "0", + "value": "0x4" + }, + "20": { + "fn": null, + "offset": [ + 25, + 1322 + ], + "op": "CALLDATASIZE", + "path": "0" + }, + "21": { + "fn": null, + "offset": [ + 25, + 1322 + ], + "op": "LT", + "path": "0" + }, + "22": { + "fn": null, + "offset": [ + 25, + 1322 + ], + "op": "PUSH2", + "path": "0", + "value": "0x36" + }, + "25": { + "fn": null, + "offset": [ + 25, + 1322 + ], + "op": "JUMPI", + "path": "0" + }, + "26": { + "fn": null, + "offset": [ + 25, + 1322 + ], + "op": "PUSH1", + "path": "0", + "value": "0x0" + }, + "28": { + "fn": null, + "offset": [ + 25, + 1322 + ], + "op": "CALLDATALOAD", + "path": "0" + }, + "29": { + "fn": null, + "offset": [ + 25, + 1322 + ], + "op": "PUSH1", + "path": "0", + "value": "0xE0" + }, + "31": { + "fn": null, + "offset": [ + 25, + 1322 + ], + "op": "SHR", + "path": "0" + }, + "32": { + "fn": null, + "offset": [ + 25, + 1322 + ], + "op": "DUP1", + "path": "0" + }, + "33": { + "fn": null, + "offset": [ + 25, + 1322 + ], + "op": "PUSH4", + "path": "0", + "value": "0xB0A378B0" + }, + "38": { + "fn": null, + "offset": [ + 25, + 1322 + ], + "op": "EQ", + "path": "0" + }, + "39": { + "fn": null, + "offset": [ + 25, + 1322 + ], + "op": "PUSH2", + "path": "0", + "value": "0x3B" + }, + "42": { + "fn": null, + "offset": [ + 25, + 1322 + ], + "op": "JUMPI", + "path": "0" + }, + "43": { + "fn": null, + "offset": [ + 25, + 1322 + ], + "op": "DUP1", + "path": "0" + }, + "44": { + "fn": null, + "offset": [ + 25, + 1322 + ], + "op": "PUSH4", + "path": "0", + "value": "0xDF5B7227" + }, + "49": { + "fn": null, + "offset": [ + 25, + 1322 + ], + "op": "EQ", + "path": "0" + }, + "50": { + "fn": null, + "offset": [ + 25, + 1322 + ], + "op": "PUSH2", + "path": "0", + "value": "0x55" + }, + "53": { + "fn": null, + "offset": [ + 25, + 1322 + ], + "op": "JUMPI", + "path": "0" + }, + "54": { + "fn": null, + "offset": [ + 25, + 1322 + ], + "op": "JUMPDEST", + "path": "0" + }, + "55": { + "fn": null, + "offset": [ + 25, + 1322 + ], + "op": "PUSH1", + "path": "0", + "value": "0x0" + }, + "57": { + "fn": null, + "offset": [ + 25, + 1322 + ], + "op": "DUP1", + "path": "0" + }, + "58": { + "first_revert": true, + "fn": null, + "offset": [ + 25, + 1322 + ], + "op": "REVERT", + "path": "0" + }, + "59": { + "fn": "Foo.Bar", + "offset": [ + 111, + 320 + ], + "op": "JUMPDEST", + "path": "0" + }, + "60": { + "fn": "Foo.Bar", + "offset": [ + 111, + 320 + ], + "op": "PUSH2", + "path": "0", + "value": "0x43" + }, + "63": { + "fn": "Foo.Bar", + "offset": [ + 111, + 320 + ], + "op": "PUSH2", + "path": "0", + "value": "0x76" + }, + "66": { + "fn": "Foo.Bar", + "jump": "i", + "offset": [ + 111, + 320 + ], + "op": "JUMP", + "path": "0" + }, + "67": { + "fn": "Foo.Bar", + "offset": [ + 111, + 320 + ], + "op": "JUMPDEST", + "path": "0" + }, + "68": { + "fn": "Foo.Bar", + "offset": [ + 111, + 320 + ], + "op": "PUSH1", + "path": "0", + "value": "0x40" + }, + "70": { + "fn": "Foo.Bar", + "offset": [ + 111, + 320 + ], + "op": "DUP1", + "path": "0" + }, + "71": { + "fn": "Foo.Bar", + "offset": [ + 111, + 320 + ], + "op": "MLOAD", + "path": "0" + }, + "72": { + "fn": "Foo.Bar", + "offset": [ + 111, + 320 + ], + "op": "SWAP2", + "path": "0" + }, + "73": { + "fn": "Foo.Bar", + "offset": [ + 111, + 320 + ], + "op": "DUP3", + "path": "0" + }, + "74": { + "fn": "Foo.Bar", + "offset": [ + 111, + 320 + ], + "op": "MSTORE", + "path": "0" + }, + "75": { + "fn": "Foo.Bar", + "offset": [ + 111, + 320 + ], + "op": "MLOAD", + "path": "0" + }, + "76": { + "fn": "Foo.Bar", + "offset": [ + 111, + 320 + ], + "op": "SWAP1", + "path": "0" + }, + "77": { + "fn": "Foo.Bar", + "offset": [ + 111, + 320 + ], + "op": "DUP2", + "path": "0" + }, + "78": { + "fn": "Foo.Bar", + "offset": [ + 111, + 320 + ], + "op": "SWAP1", + "path": "0" + }, + "79": { + "fn": "Foo.Bar", + "offset": [ + 111, + 320 + ], + "op": "SUB", + "path": "0" + }, + "80": { + "fn": "Foo.Bar", + "offset": [ + 111, + 320 + ], + "op": "PUSH1", + "path": "0", + "value": "0x20" + }, + "82": { + "fn": "Foo.Bar", + "offset": [ + 111, + 320 + ], + "op": "ADD", + "path": "0" + }, + "83": { + "fn": "Foo.Bar", + "offset": [ + 111, + 320 + ], + "op": "SWAP1", + "path": "0" + }, + "84": { + "fn": "Foo.Bar", + "offset": [ + 111, + 320 + ], + "op": "RETURN", + "path": "0" + }, + "85": { + "fn": "Foo.SetNext", + "offset": [ + 1246, + 1320 + ], + "op": "JUMPDEST", + "path": "0" + }, + "86": { + "fn": "Foo.SetNext", + "offset": [ + 1246, + 1320 + ], + "op": "PUSH2", + "path": "0", + "value": "0x74" + }, + "89": { + "fn": "Foo.SetNext", + "offset": [ + 1246, + 1320 + ], + "op": "PUSH1", + "path": "0", + "value": "0x4" + }, + "91": { + "fn": "Foo.SetNext", + "offset": [ + 1246, + 1320 + ], + "op": "DUP1", + "path": "0" + }, + "92": { + "fn": "Foo.SetNext", + "offset": [ + 1246, + 1320 + ], + "op": "CALLDATASIZE", + "path": "0" + }, + "93": { + "fn": "Foo.SetNext", + "offset": [ + 1246, + 1320 + ], + "op": "SUB", + "path": "0" + }, + "94": { + "fn": "Foo.SetNext", + "offset": [ + 1246, + 1320 + ], + "op": "PUSH1", + "path": "0", + "value": "0x20" + }, + "96": { + "fn": "Foo.SetNext", + "offset": [ + 1246, + 1320 + ], + "op": "DUP2", + "path": "0" + }, + "97": { + "fn": "Foo.SetNext", + "offset": [ + 1246, + 1320 + ], + "op": "LT", + "path": "0" + }, + "98": { + "fn": "Foo.SetNext", + "offset": [ + 1246, + 1320 + ], + "op": "ISZERO", + "path": "0" + }, + "99": { + "fn": "Foo.SetNext", + "offset": [ + 1246, + 1320 + ], + "op": "PUSH2", + "path": "0", + "value": "0x6B" + }, + "102": { + "fn": "Foo.SetNext", + "offset": [ + 1246, + 1320 + ], + "op": "JUMPI", + "path": "0" + }, + "103": { + "fn": "Foo.SetNext", + "offset": [ + 1246, + 1320 + ], + "op": "PUSH1", + "path": "0", + "value": "0x0" + }, + "105": { + "fn": "Foo.SetNext", + "offset": [ + 1246, + 1320 + ], + "op": "DUP1", + "path": "0" + }, + "106": { + "fn": "Foo.SetNext", + "offset": [ + 1246, + 1320 + ], + "op": "REVERT", + "path": "0" + }, + "107": { + "fn": "Foo.SetNext", + "offset": [ + 1246, + 1320 + ], + "op": "JUMPDEST", + "path": "0" + }, + "108": { + "op": "POP" + }, + "109": { + "fn": "Foo.SetNext", + "offset": [ + 1246, + 1320 + ], + "op": "CALLDATALOAD", + "path": "0" + }, + "110": { + "fn": "Foo.SetNext", + "offset": [ + 1246, + 1320 + ], + "op": "ISZERO", + "path": "0" + }, + "111": { + "fn": "Foo.SetNext", + "offset": [ + 1246, + 1320 + ], + "op": "ISZERO", + "path": "0" + }, + "112": { + "fn": "Foo.SetNext", + "offset": [ + 1246, + 1320 + ], + "op": "PUSH2", + "path": "0", + "value": "0xE7" + }, + "115": { + "fn": "Foo.SetNext", + "jump": "i", + "offset": [ + 1246, + 1320 + ], + "op": "JUMP", + "path": "0" + }, + "116": { + "fn": "Foo.SetNext", + "offset": [ + 1246, + 1320 + ], + "op": "JUMPDEST", + "path": "0" + }, + "117": { + "fn": "Foo.SetNext", + "offset": [ + 1246, + 1320 + ], + "op": "STOP", + "path": "0" + }, + "118": { + "fn": "Foo.Bar", + "offset": [ + 111, + 320 + ], + "op": "JUMPDEST", + "path": "0" + }, + "119": { + "fn": "Foo.Bar", + "offset": [ + 142, + 154 + ], + "op": "PUSH1", + "path": "0", + "value": "0x0" + }, + "121": { + "fn": "Foo.Bar", + "offset": [ + 174, + 193 + ], + "op": "PUSH2", + "path": "0", + "statement": 0, + "value": "0x80" + }, + "124": { + "fn": "Foo.Bar", + "offset": [ + 174, + 191 + ], + "op": "PUSH2", + "path": "0", + "value": "0x109" + }, + "127": { + "fn": "Foo.Bar", + "jump": "i", + "offset": [ + 174, + 193 + ], + "op": "JUMP", + "path": "0" + }, + "128": { + "fn": "Foo.Bar", + "offset": [ + 174, + 193 + ], + "op": "JUMPDEST", + "path": "0" + }, + "129": { + "fn": "Foo.Bar", + "offset": [ + 166, + 193 + ], + "op": "SWAP1", + "path": "0" + }, + "130": { + "fn": "Foo.Bar", + "offset": [ + 166, + 193 + ], + "op": "POP", + "path": "0" + }, + "131": { + "fn": "Foo.Bar", + "offset": [ + 209, + 210 + ], + "op": "PUSH1", + "path": "0", + "value": "0x0" + }, + "133": { + "fn": "Foo.Bar", + "offset": [ + 209, + 210 + ], + "op": "SLOAD", + "path": "0" + }, + "134": { + "fn": "Foo.Bar", + "offset": [ + 214, + 216 + ], + "op": "PUSH1", + "path": "0", + "value": "0x13" + }, + "136": { + "fn": "Foo.Bar", + "offset": [ + 209, + 216 + ], + "op": "EQ", + "path": "0" + }, + "137": { + "fn": "Foo.Bar", + "offset": [ + 203, + 314 + ], + "op": "PUSH2", + "path": "0", + "value": "0xE4" + }, + "140": { + "fn": "Foo.Bar", + "offset": [ + 203, + 314 + ], + "op": "JUMPI", + "path": "0" + }, + "141": { + "fn": "Foo.Bar", + "offset": [ + 238, + 276 + ], + "op": "PUSH1", + "path": "0", + "statement": 1, + "value": "0x40" + }, + "143": { + "fn": "Foo.Bar", + "offset": [ + 238, + 276 + ], + "op": "DUP1", + "path": "0" + }, + "144": { + "fn": "Foo.Bar", + "offset": [ + 238, + 276 + ], + "op": "MLOAD", + "path": "0" + }, + "145": { + "fn": "Foo.Bar", + "offset": [ + 238, + 276 + ], + "op": "PUSH1", + "path": "0", + "value": "0x20" + }, + "147": { + "fn": "Foo.Bar", + "offset": [ + 238, + 276 + ], + "op": "DUP1", + "path": "0" + }, + "148": { + "fn": "Foo.Bar", + "offset": [ + 238, + 276 + ], + "op": "DUP3", + "path": "0" + }, + "149": { + "fn": "Foo.Bar", + "offset": [ + 238, + 276 + ], + "op": "MSTORE", + "path": "0" + }, + "150": { + "fn": "Foo.Bar", + "offset": [ + 238, + 276 + ], + "op": "PUSH1", + "path": "0", + "value": "0x13" + }, + "152": { + "fn": "Foo.Bar", + "offset": [ + 238, + 276 + ], + "op": "SWAP1", + "path": "0" + }, + "153": { + "fn": "Foo.Bar", + "offset": [ + 238, + 276 + ], + "op": "DUP3", + "path": "0" + }, + "154": { + "fn": "Foo.Bar", + "offset": [ + 238, + 276 + ], + "op": "ADD", + "path": "0" + }, + "155": { + "fn": "Foo.Bar", + "offset": [ + 238, + 276 + ], + "op": "MSTORE", + "path": "0" + }, + "156": { + "op": "PUSH19", + "value": "0xC0E88151A1A5CC81CDA1BDD5B190819985A5B" + }, + "176": { + "op": "PUSH1", + "value": "0x6A" + }, + "178": { + "op": "SHL" + }, + "179": { + "fn": "Foo.Bar", + "offset": [ + 238, + 276 + ], + "op": "DUP2", + "path": "0" + }, + "180": { + "fn": "Foo.Bar", + "offset": [ + 238, + 276 + ], + "op": "DUP4", + "path": "0" + }, + "181": { + "fn": "Foo.Bar", + "offset": [ + 238, + 276 + ], + "op": "ADD", + "path": "0" + }, + "182": { + "fn": "Foo.Bar", + "offset": [ + 238, + 276 + ], + "op": "MSTORE", + "path": "0" + }, + "183": { + "fn": "Foo.Bar", + "offset": [ + 238, + 276 + ], + "op": "SWAP1", + "path": "0" + }, + "184": { + "fn": "Foo.Bar", + "offset": [ + 238, + 276 + ], + "op": "MLOAD", + "path": "0" + }, + "185": { + "fn": "Foo.Bar", + "offset": [ + 238, + 276 + ], + "op": "PUSH32", + "path": "0", + "value": "0xB42604CB105A16C8F6DB8A41E6B00C0C1B4826465E8BC504B3EB3E88B3E6A4A0" + }, + "218": { + "fn": "Foo.Bar", + "offset": [ + 238, + 276 + ], + "op": "SWAP2", + "path": "0" + }, + "219": { + "fn": "Foo.Bar", + "offset": [ + 238, + 276 + ], + "op": "DUP2", + "path": "0" + }, + "220": { + "fn": "Foo.Bar", + "offset": [ + 238, + 276 + ], + "op": "SWAP1", + "path": "0" + }, + "221": { + "fn": "Foo.Bar", + "offset": [ + 238, + 276 + ], + "op": "SUB", + "path": "0" + }, + "222": { + "fn": "Foo.Bar", + "offset": [ + 238, + 276 + ], + "op": "PUSH1", + "path": "0", + "value": "0x60" + }, + "224": { + "fn": "Foo.Bar", + "offset": [ + 238, + 276 + ], + "op": "ADD", + "path": "0" + }, + "225": { + "fn": "Foo.Bar", + "offset": [ + 238, + 276 + ], + "op": "SWAP1", + "path": "0" + }, + "226": { + "fn": "Foo.Bar", + "offset": [ + 238, + 276 + ], + "op": "LOG1", + "path": "0" + }, + "227": { + "fn": "Foo.Bar", + "offset": [ + 290, + 303 + ], + "op": "INVALID", + "path": "0", + "statement": 2 + }, + "228": { + "fn": "Foo.Bar", + "offset": [ + 290, + 303 + ], + "op": "JUMPDEST", + "path": "0" + }, + "229": { + "fn": "Foo.Bar", + "offset": [ + 111, + 320 + ], + "op": "SWAP1", + "path": "0" + }, + "230": { + "fn": "Foo.Bar", + "jump": "o", + "offset": [ + 111, + 320 + ], + "op": "JUMP", + "path": "0" + }, + "231": { + "fn": "Foo.SetNext", + "offset": [ + 1246, + 1320 + ], + "op": "JUMPDEST", + "path": "0" + }, + "232": { + "branch": 15, + "fn": "Foo.SetNext", + "offset": [ + 1303, + 1304 + ], + "op": "DUP1", + "path": "0", + "statement": 3 + }, + "233": { + "fn": "Foo.SetNext", + "offset": [ + 1303, + 1312 + ], + "op": "PUSH2", + "path": "0", + "value": "0xF3" + }, + "236": { + "branch": 15, + "fn": "Foo.SetNext", + "offset": [ + 1303, + 1312 + ], + "op": "JUMPI", + "path": "0" + }, + "237": { + "fn": "Foo.SetNext", + "offset": [ + 1311, + 1312 + ], + "op": "PUSH1", + "path": "0", + "value": "0x0" + }, + "239": { + "fn": "Foo.SetNext", + "offset": [ + 1303, + 1312 + ], + "op": "PUSH2", + "path": "0", + "value": "0xF6" + }, + "242": { + "fn": "Foo.SetNext", + "offset": [ + 1303, + 1312 + ], + "op": "JUMP", + "path": "0" + }, + "243": { + "fn": "Foo.SetNext", + "offset": [ + 1303, + 1312 + ], + "op": "JUMPDEST", + "path": "0" + }, + "244": { + "fn": "Foo.SetNext", + "offset": [ + 1307, + 1308 + ], + "op": "PUSH1", + "path": "0", + "value": "0x1" + }, + "246": { + "fn": "Foo.SetNext", + "offset": [ + 1303, + 1312 + ], + "op": "JUMPDEST", + "path": "0" + }, + "247": { + "fn": "Foo.SetNext", + "offset": [ + 1292, + 1313 + ], + "op": "PUSH1", + "path": "0", + "value": "0xFF" + }, + "249": { + "fn": "Foo.SetNext", + "offset": [ + 1292, + 1313 + ], + "op": "AND", + "path": "0" + }, + "250": { + "fn": "Foo.SetNext", + "offset": [ + 1297, + 1298 + ], + "op": "PUSH1", + "path": "0", + "value": "0x0" + }, + "252": { + "fn": "Foo.SetNext", + "offset": [ + 1297, + 1298 + ], + "op": "SLOAD", + "path": "0" + }, + "253": { + "fn": "Foo.SetNext", + "offset": [ + 1293, + 1294 + ], + "op": "PUSH1", + "path": "0", + "value": "0x2" + }, + "255": { + "fn": "Foo.SetNext", + "offset": [ + 1293, + 1298 + ], + "op": "MUL", + "path": "0" + }, + "256": { + "fn": "Foo.SetNext", + "offset": [ + 1292, + 1313 + ], + "op": "ADD", + "path": "0" + }, + "257": { + "fn": "Foo.SetNext", + "offset": [ + 1288, + 1289 + ], + "op": "PUSH1", + "path": "0", + "value": "0x0" + }, + "259": { + "fn": "Foo.SetNext", + "offset": [ + 1288, + 1313 + ], + "op": "DUP2", + "path": "0" + }, + "260": { + "fn": "Foo.SetNext", + "offset": [ + 1288, + 1313 + ], + "op": "SWAP1", + "path": "0" + }, + "261": { + "fn": "Foo.SetNext", + "offset": [ + 1288, + 1313 + ], + "op": "SSTORE", + "path": "0" + }, + "262": { + "fn": "Foo.SetNext", + "offset": [ + 1288, + 1313 + ], + "op": "POP", + "path": "0" + }, + "263": { + "fn": "Foo.SetNext", + "offset": [ + 1246, + 1320 + ], + "op": "POP", + "path": "0" + }, + "264": { + "fn": "Foo.SetNext", + "jump": "o", + "offset": [ + 1246, + 1320 + ], + "op": "JUMP", + "path": "0" + }, + "265": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 326, + 1240 + ], + "op": "JUMPDEST", + "path": "0" + }, + "266": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 377, + 383 + ], + "op": "PUSH1", + "path": "0", + "value": "0x0" + }, + "268": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 399, + 400 + ], + "op": "DUP1", + "path": "0" + }, + "269": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 399, + 400 + ], + "op": "SLOAD", + "path": "0" + }, + "270": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 404, + 406 + ], + "op": "PUSH1", + "path": "0", + "value": "0xA" + }, + "272": { + "branch": 16, + "fn": "Foo._original_Foo_Bar", + "offset": [ + 399, + 406 + ], + "op": "EQ", + "path": "0" + }, + "273": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 395, + 468 + ], + "op": "ISZERO", + "path": "0" + }, + "274": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 395, + 468 + ], + "op": "PUSH2", + "path": "0", + "value": "0x117" + }, + "277": { + "branch": 16, + "fn": "Foo._original_Foo_Bar", + "offset": [ + 395, + 468 + ], + "op": "JUMPI", + "path": "0" + }, + "278": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 422, + 435 + ], + "op": "INVALID", + "path": "0", + "statement": 4 + }, + "279": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 395, + 468 + ], + "op": "JUMPDEST", + "path": "0" + }, + "280": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 481, + 482 + ], + "op": "PUSH1", + "path": "0", + "value": "0x0" + }, + "282": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 481, + 482 + ], + "op": "SLOAD", + "path": "0" + }, + "283": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 486, + 488 + ], + "op": "PUSH1", + "path": "0", + "value": "0x1E" + }, + "285": { + "branch": 17, + "fn": "Foo._original_Foo_Bar", + "offset": [ + 481, + 488 + ], + "op": "EQ", + "path": "0" + }, + "286": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 477, + 550 + ], + "op": "ISZERO", + "path": "0" + }, + "287": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 477, + 550 + ], + "op": "PUSH2", + "path": "0", + "value": "0x124" + }, + "290": { + "branch": 17, + "fn": "Foo._original_Foo_Bar", + "offset": [ + 477, + 550 + ], + "op": "JUMPI", + "path": "0" + }, + "291": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 504, + 517 + ], + "op": "INVALID", + "path": "0", + "statement": 5 + }, + "292": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 477, + 550 + ], + "op": "JUMPDEST", + "path": "0" + }, + "293": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 563, + 564 + ], + "op": "PUSH1", + "path": "0", + "value": "0x0" + }, + "295": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 563, + 564 + ], + "op": "SLOAD", + "path": "0" + }, + "296": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 568, + 570 + ], + "op": "PUSH1", + "path": "0", + "value": "0x32" + }, + "298": { + "branch": 18, + "fn": "Foo._original_Foo_Bar", + "offset": [ + 563, + 570 + ], + "op": "EQ", + "path": "0" + }, + "299": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 559, + 632 + ], + "op": "ISZERO", + "path": "0" + }, + "300": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 559, + 632 + ], + "op": "PUSH2", + "path": "0", + "value": "0x131" + }, + "303": { + "branch": 18, + "fn": "Foo._original_Foo_Bar", + "offset": [ + 559, + 632 + ], + "op": "JUMPI", + "path": "0" + }, + "304": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 586, + 599 + ], + "op": "INVALID", + "path": "0", + "statement": 6 + }, + "305": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 559, + 632 + ], + "op": "JUMPDEST", + "path": "0" + }, + "306": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 645, + 646 + ], + "op": "PUSH1", + "path": "0", + "value": "0x0" + }, + "308": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 645, + 646 + ], + "op": "SLOAD", + "path": "0" + }, + "309": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 650, + 652 + ], + "op": "PUSH1", + "path": "0", + "value": "0x46" + }, + "311": { + "branch": 19, + "fn": "Foo._original_Foo_Bar", + "offset": [ + 645, + 652 + ], + "op": "EQ", + "path": "0" + }, + "312": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 641, + 714 + ], + "op": "ISZERO", + "path": "0" + }, + "313": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 641, + 714 + ], + "op": "PUSH2", + "path": "0", + "value": "0x13E" + }, + "316": { + "branch": 19, + "fn": "Foo._original_Foo_Bar", + "offset": [ + 641, + 714 + ], + "op": "JUMPI", + "path": "0" + }, + "317": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 668, + 681 + ], + "op": "INVALID", + "path": "0", + "statement": 7 + }, + "318": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 641, + 714 + ], + "op": "JUMPDEST", + "path": "0" + }, + "319": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 727, + 728 + ], + "op": "PUSH1", + "path": "0", + "value": "0x0" + }, + "321": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 727, + 728 + ], + "op": "SLOAD", + "path": "0" + }, + "322": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 732, + 734 + ], + "op": "PUSH1", + "path": "0", + "value": "0x5A" + }, + "324": { + "branch": 20, + "fn": "Foo._original_Foo_Bar", + "offset": [ + 727, + 734 + ], + "op": "EQ", + "path": "0" + }, + "325": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 723, + 796 + ], + "op": "ISZERO", + "path": "0" + }, + "326": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 723, + 796 + ], + "op": "PUSH2", + "path": "0", + "value": "0x14B" + }, + "329": { + "branch": 20, + "fn": "Foo._original_Foo_Bar", + "offset": [ + 723, + 796 + ], + "op": "JUMPI", + "path": "0" + }, + "330": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 750, + 763 + ], + "op": "INVALID", + "path": "0", + "statement": 8 + }, + "331": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 723, + 796 + ], + "op": "JUMPDEST", + "path": "0" + }, + "332": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 809, + 810 + ], + "op": "PUSH1", + "path": "0", + "value": "0x0" + }, + "334": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 809, + 810 + ], + "op": "SLOAD", + "path": "0" + }, + "335": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 814, + 817 + ], + "op": "PUSH1", + "path": "0", + "value": "0x6E" + }, + "337": { + "branch": 21, + "fn": "Foo._original_Foo_Bar", + "offset": [ + 809, + 817 + ], + "op": "EQ", + "path": "0" + }, + "338": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 805, + 880 + ], + "op": "ISZERO", + "path": "0" + }, + "339": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 805, + 880 + ], + "op": "PUSH2", + "path": "0", + "value": "0x158" + }, + "342": { + "branch": 21, + "fn": "Foo._original_Foo_Bar", + "offset": [ + 805, + 880 + ], + "op": "JUMPI", + "path": "0" + }, + "343": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 833, + 846 + ], + "op": "INVALID", + "path": "0", + "statement": 9 + }, + "344": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 805, + 880 + ], + "op": "JUMPDEST", + "path": "0" + }, + "345": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 893, + 894 + ], + "op": "PUSH1", + "path": "0", + "value": "0x0" + }, + "347": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 893, + 894 + ], + "op": "SLOAD", + "path": "0" + }, + "348": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 898, + 901 + ], + "op": "PUSH1", + "path": "0", + "value": "0x82" + }, + "350": { + "branch": 22, + "fn": "Foo._original_Foo_Bar", + "offset": [ + 893, + 901 + ], + "op": "EQ", + "path": "0" + }, + "351": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 889, + 964 + ], + "op": "ISZERO", + "path": "0" + }, + "352": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 889, + 964 + ], + "op": "PUSH2", + "path": "0", + "value": "0x165" + }, + "355": { + "branch": 22, + "fn": "Foo._original_Foo_Bar", + "offset": [ + 889, + 964 + ], + "op": "JUMPI", + "path": "0" + }, + "356": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 917, + 930 + ], + "op": "INVALID", + "path": "0", + "statement": 10 + }, + "357": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 889, + 964 + ], + "op": "JUMPDEST", + "path": "0" + }, + "358": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 977, + 978 + ], + "op": "PUSH1", + "path": "0", + "value": "0x0" + }, + "360": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 977, + 978 + ], + "op": "SLOAD", + "path": "0" + }, + "361": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 982, + 985 + ], + "op": "PUSH1", + "path": "0", + "value": "0x96" + }, + "363": { + "branch": 23, + "fn": "Foo._original_Foo_Bar", + "offset": [ + 977, + 985 + ], + "op": "EQ", + "path": "0" + }, + "364": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 973, + 1048 + ], + "op": "ISZERO", + "path": "0" + }, + "365": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 973, + 1048 + ], + "op": "PUSH2", + "path": "0", + "value": "0x172" + }, + "368": { + "branch": 23, + "fn": "Foo._original_Foo_Bar", + "offset": [ + 973, + 1048 + ], + "op": "JUMPI", + "path": "0" + }, + "369": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 1001, + 1014 + ], + "op": "INVALID", + "path": "0", + "statement": 11 + }, + "370": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 973, + 1048 + ], + "op": "JUMPDEST", + "path": "0" + }, + "371": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 1061, + 1062 + ], + "op": "PUSH1", + "path": "0", + "value": "0x0" + }, + "373": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 1061, + 1062 + ], + "op": "SLOAD", + "path": "0" + }, + "374": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 1066, + 1069 + ], + "op": "PUSH1", + "path": "0", + "value": "0xAA" + }, + "376": { + "branch": 24, + "fn": "Foo._original_Foo_Bar", + "offset": [ + 1061, + 1069 + ], + "op": "EQ", + "path": "0" + }, + "377": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 1057, + 1132 + ], + "op": "ISZERO", + "path": "0" + }, + "378": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 1057, + 1132 + ], + "op": "PUSH2", + "path": "0", + "value": "0x17F" + }, + "381": { + "branch": 24, + "fn": "Foo._original_Foo_Bar", + "offset": [ + 1057, + 1132 + ], + "op": "JUMPI", + "path": "0" + }, + "382": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 1085, + 1098 + ], + "op": "INVALID", + "path": "0", + "statement": 12 + }, + "383": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 1057, + 1132 + ], + "op": "JUMPDEST", + "path": "0" + }, + "384": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 1145, + 1146 + ], + "op": "PUSH1", + "path": "0", + "value": "0x0" + }, + "386": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 1145, + 1146 + ], + "op": "SLOAD", + "path": "0" + }, + "387": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 1150, + 1153 + ], + "op": "PUSH1", + "path": "0", + "value": "0xBE" + }, + "389": { + "branch": 25, + "fn": "Foo._original_Foo_Bar", + "offset": [ + 1145, + 1153 + ], + "op": "EQ", + "path": "0" + }, + "390": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 1141, + 1216 + ], + "op": "ISZERO", + "path": "0" + }, + "391": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 1141, + 1216 + ], + "op": "PUSH2", + "path": "0", + "value": "0x18C" + }, + "394": { + "branch": 25, + "fn": "Foo._original_Foo_Bar", + "offset": [ + 1141, + 1216 + ], + "op": "JUMPI", + "path": "0" + }, + "395": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 1169, + 1182 + ], + "op": "INVALID", + "path": "0", + "statement": 13 + }, + "396": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 1141, + 1216 + ], + "op": "JUMPDEST", + "path": "0" + }, + "397": { + "op": "POP" + }, + "398": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 1232, + 1233 + ], + "op": "PUSH1", + "path": "0", + "statement": 14, + "value": "0x0" + }, + "400": { + "fn": "Foo._original_Foo_Bar", + "offset": [ + 326, + 1240 + ], + "op": "SWAP1", + "path": "0" + }, + "401": { + "fn": "Foo._original_Foo_Bar", + "jump": "o", + "offset": [ + 326, + 1240 + ], + "op": "JUMP", + "path": "0" + } + }, + "sha1": "f5847f356bb154708ea3a08bb3f3f69696886b0c", + "source": "pragma solidity <0.8.0;\n\ncontract Foo {\n event AssertionFailed(string message);\n\n int256 private x;\n\n function Bar() public returns (int256 RET_0) {\n RET_0 = _original_Foo_Bar();\n if (!(x == 19)) {\n emit AssertionFailed(\"0: This should fail\");\n assert(false);\n }\n }\n\n function _original_Foo_Bar() private view returns (int256) {\n if (x == 10) {\n assert(false);\n return 1;\n }\n if (x == 30) {\n assert(false);\n return 3;\n }\n if (x == 50) {\n assert(false);\n return 5;\n }\n if (x == 70) {\n assert(false);\n return 7;\n }\n if (x == 90) {\n assert(false);\n return 9;\n }\n if (x == 110) {\n assert(false);\n return 11;\n }\n if (x == 130) {\n assert(false);\n return 13;\n }\n if (x == 150) {\n assert(false);\n return 15;\n }\n if (x == 170) {\n assert(false);\n return 17;\n }\n if (x == 190) {\n assert(false);\n return 19;\n }\n return 0;\n }\n\n function SetNext(bool b) public {\n x = (2 * x) + (b ? 1 : 0);\n }\n}", + "sourceMap": "25:1297:0:-:0;;;;;;;;;;;;;;;;;;;", + "sourcePath": "contracts/sample.sol", + "type": "contract" +} diff --git a/tests/testdata/faas-new-campaign-request.json b/tests/testdata/faas-new-campaign-request.json new file mode 100644 index 0000000..ae41ace --- /dev/null +++ b/tests/testdata/faas-new-campaign-request.json @@ -0,0 +1,2924 @@ +{ + "parameters": { + "discovery-probability-threshold": 0.0, + "num-cores": 1, + "assertion-checking-mode": 1 + }, + "name": "brownie_test_yqzeu", + "corpus": { + "address-under-test": "0x7277646075fa72737e1F6114654C5d9949a67dF2", + "steps": [ + { + "hash": "0x5b2213faa860f042be3d68c782ee5a1f45aea9505f874a1370a0c3163e13f3f8", + "nonce": "0x0", + "blockHash": "0x12effde2c3cb82e381e7e4232d3bf810920df83710faf07940a1c510a96d1740", + "blockNumber": "0x1", + "transactionIndex": "0x0", + "from": "0xe6559ce865436c9206c6a971ed34658a57e51f17", + "to": "", + "value": "0x0", + "gas": "0x6691b7", + "gasPrice": "0x0", + "input": "0x608060405234801561001057600080fd5b506101c8806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063b0a378b01461003b578063df5b722714610055575b600080fd5b610043610076565b60408051918252519081900360200190f35b6100746004803603602081101561006b57600080fd5b503515156100e7565b005b6000610080610109565b90506000546013146100e457604080516020808252601390820152720c0e88151a1a5cc81cda1bdd5b190819985a5b606a1b8183015290517fb42604cb105a16c8f6db8a41e6b00c0c1b4826465e8bc504b3eb3e88b3e6a4a09181900360600190a1fe5b90565b806100f35760006100f6565b60015b60ff166000546002020160008190555050565b60008054600a141561011757fe5b600054601e141561012457fe5b6000546032141561013157fe5b6000546046141561013e57fe5b600054605a141561014b57fe5b600054606e141561015857fe5b6000546082141561016557fe5b6000546096141561017257fe5b60005460aa141561017f57fe5b60005460be141561018c57fe5b5060009056fea2646970667358221220d15c0974595ed5c9a5da68377d16635bfa92f13a2af22bf0b52f63632505f04664736f6c634300060c0033", + "v": "0x25", + "r": "0x8cb33aaf88705ef9b626e3b641c356c50c478912fb02ccddef9ab053fc83827b", + "s": "0x62e58b06e7c1decaedbdb8bfcdbddf69c56c5bfce6f27187ac587492686efd77" + } + ], + "other-addresses-under-test": [] + }, + "sources": { + "contracts/sample.sol": { + "fileIndex": "0", + "source": "pragma solidity <0.8.0;\n\ncontract Foo {\n event AssertionFailed(string message);\n\n int256 private x;\n\n function Bar() public returns (int256 RET_0) {\n RET_0 = _original_Foo_Bar();\n if (!(x == 19)) {\n emit AssertionFailed(\"0: This should fail\");\n assert(false);\n }\n }\n\n function _original_Foo_Bar() private view returns (int256) {\n if (x == 10) {\n assert(false);\n return 1;\n }\n if (x == 30) {\n assert(false);\n return 3;\n }\n if (x == 50) {\n assert(false);\n return 5;\n }\n if (x == 70) {\n assert(false);\n return 7;\n }\n if (x == 90) {\n assert(false);\n return 9;\n }\n if (x == 110) {\n assert(false);\n return 11;\n }\n if (x == 130) {\n assert(false);\n return 13;\n }\n if (x == 150) {\n assert(false);\n return 15;\n }\n if (x == 170) {\n assert(false);\n return 17;\n }\n if (x == 190) {\n assert(false);\n return 19;\n }\n return 0;\n }\n\n function SetNext(bool b) public {\n x = (2 * x) + (b ? 1 : 0);\n }\n}", + "ast": { + "absolutePath": "contracts/sample.sol", + "exportedSymbols": { + "Foo": [ + 171 + ] + }, + "id": 172, + "license": null, + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 1, + "literals": [ + "solidity", + "<", + "0.8", + ".0" + ], + "nodeType": "PragmaDirective", + "src": "0:23:0" + }, + { + "abstract": false, + "baseContracts": [], + "contractDependencies": [], + "contractKind": "contract", + "documentation": null, + "fullyImplemented": true, + "id": 171, + "linearizedBaseContracts": [ + 171 + ], + "name": "Foo", + "nodeType": "ContractDefinition", + "nodes": [ + { + "anonymous": false, + "documentation": null, + "id": 5, + "name": "AssertionFailed", + "nodeType": "EventDefinition", + "parameters": { + "id": 4, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3, + "indexed": false, + "mutability": "mutable", + "name": "message", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 5, + "src": "66:14:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string" + }, + "typeName": { + "id": 2, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "66:6:0", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "65:16:0" + }, + "src": "44:38:0" + }, + { + "constant": false, + "id": 7, + "mutability": "mutable", + "name": "x", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 171, + "src": "88:16:0", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 6, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "88:6:0", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "value": null, + "visibility": "private" + }, + { + "body": { + "id": 32, + "nodeType": "Block", + "src": "156:164:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 15, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 12, + "name": "RET_0", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 10, + "src": "166:5:0", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 13, + "name": "_original_Foo_Bar", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 151, + "src": "174:17:0", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_int256_$", + "typeString": "function () view returns (int256)" + } + }, + "id": 14, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "174:19:0", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "src": "166:27:0", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "id": 16, + "nodeType": "ExpressionStatement", + "src": "166:27:0" + }, + { + "condition": { + "argumentTypes": null, + "id": 21, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "!", + "prefix": true, + "src": "207:10:0", + "subExpression": { + "argumentTypes": null, + "components": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 19, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 17, + "name": "x", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7, + "src": "209:1:0", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "hexValue": "3139", + "id": 18, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "214:2:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_19_by_1", + "typeString": "int_const 19" + }, + "value": "19" + }, + "src": "209:7:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "id": 20, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "208:9:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 31, + "nodeType": "IfStatement", + "src": "203:111:0", + "trueBody": { + "id": 30, + "nodeType": "Block", + "src": "219:95:0", + "statements": [ + { + "eventCall": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "303a20546869732073686f756c64206661696c", + "id": 23, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "254:21:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_7379ea5b6329927764dc2a90425e24f5f69809aa582db010111d15cc830e8a08", + "typeString": "literal_string \"0: This should fail\"" + }, + "value": "0: This should fail" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_stringliteral_7379ea5b6329927764dc2a90425e24f5f69809aa582db010111d15cc830e8a08", + "typeString": "literal_string \"0: This should fail\"" + } + ], + "id": 22, + "name": "AssertionFailed", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5, + "src": "238:15:0", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_string_memory_ptr_$returns$__$", + "typeString": "function (string memory)" + } + }, + "id": 24, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "238:38:0", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 25, + "nodeType": "EmitStatement", + "src": "233:43:0" + }, + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "66616c7365", + "id": 27, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "297:5:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "false" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "id": 26, + "name": "assert", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -3, + "src": "290:6:0", + "typeDescriptions": { + "typeIdentifier": "t_function_assert_pure$_t_bool_$returns$__$", + "typeString": "function (bool) pure" + } + }, + "id": 28, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "290:13:0", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 29, + "nodeType": "ExpressionStatement", + "src": "290:13:0" + } + ] + } + } + ] + }, + "documentation": null, + "functionSelector": "b0a378b0", + "id": 33, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "Bar", + "nodeType": "FunctionDefinition", + "overrides": null, + "parameters": { + "id": 8, + "nodeType": "ParameterList", + "parameters": [], + "src": "123:2:0" + }, + "returnParameters": { + "id": 11, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 10, + "mutability": "mutable", + "name": "RET_0", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 33, + "src": "142:12:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 9, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "142:6:0", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "141:14:0" + }, + "scope": 171, + "src": "111:209:0", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "public" + }, + { + "body": { + "id": 150, + "nodeType": "Block", + "src": "385:855:0", + "statements": [ + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 40, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 38, + "name": "x", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7, + "src": "399:1:0", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "hexValue": "3130", + "id": 39, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "404:2:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_10_by_1", + "typeString": "int_const 10" + }, + "value": "10" + }, + "src": "399:7:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 48, + "nodeType": "IfStatement", + "src": "395:73:0", + "trueBody": { + "id": 47, + "nodeType": "Block", + "src": "408:60:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "66616c7365", + "id": 42, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "429:5:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "false" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "id": 41, + "name": "assert", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -3, + "src": "422:6:0", + "typeDescriptions": { + "typeIdentifier": "t_function_assert_pure$_t_bool_$returns$__$", + "typeString": "function (bool) pure" + } + }, + "id": 43, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "422:13:0", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 44, + "nodeType": "ExpressionStatement", + "src": "422:13:0" + }, + { + "expression": { + "argumentTypes": null, + "hexValue": "31", + "id": 45, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "456:1:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "functionReturnParameters": 37, + "id": 46, + "nodeType": "Return", + "src": "449:8:0" + } + ] + } + }, + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 51, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 49, + "name": "x", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7, + "src": "481:1:0", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "hexValue": "3330", + "id": 50, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "486:2:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_30_by_1", + "typeString": "int_const 30" + }, + "value": "30" + }, + "src": "481:7:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 59, + "nodeType": "IfStatement", + "src": "477:73:0", + "trueBody": { + "id": 58, + "nodeType": "Block", + "src": "490:60:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "66616c7365", + "id": 53, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "511:5:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "false" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "id": 52, + "name": "assert", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -3, + "src": "504:6:0", + "typeDescriptions": { + "typeIdentifier": "t_function_assert_pure$_t_bool_$returns$__$", + "typeString": "function (bool) pure" + } + }, + "id": 54, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "504:13:0", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 55, + "nodeType": "ExpressionStatement", + "src": "504:13:0" + }, + { + "expression": { + "argumentTypes": null, + "hexValue": "33", + "id": 56, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "538:1:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_3_by_1", + "typeString": "int_const 3" + }, + "value": "3" + }, + "functionReturnParameters": 37, + "id": 57, + "nodeType": "Return", + "src": "531:8:0" + } + ] + } + }, + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 62, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 60, + "name": "x", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7, + "src": "563:1:0", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "hexValue": "3530", + "id": 61, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "568:2:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_50_by_1", + "typeString": "int_const 50" + }, + "value": "50" + }, + "src": "563:7:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 70, + "nodeType": "IfStatement", + "src": "559:73:0", + "trueBody": { + "id": 69, + "nodeType": "Block", + "src": "572:60:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "66616c7365", + "id": 64, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "593:5:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "false" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "id": 63, + "name": "assert", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -3, + "src": "586:6:0", + "typeDescriptions": { + "typeIdentifier": "t_function_assert_pure$_t_bool_$returns$__$", + "typeString": "function (bool) pure" + } + }, + "id": 65, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "586:13:0", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 66, + "nodeType": "ExpressionStatement", + "src": "586:13:0" + }, + { + "expression": { + "argumentTypes": null, + "hexValue": "35", + "id": 67, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "620:1:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_5_by_1", + "typeString": "int_const 5" + }, + "value": "5" + }, + "functionReturnParameters": 37, + "id": 68, + "nodeType": "Return", + "src": "613:8:0" + } + ] + } + }, + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 73, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 71, + "name": "x", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7, + "src": "645:1:0", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "hexValue": "3730", + "id": 72, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "650:2:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_70_by_1", + "typeString": "int_const 70" + }, + "value": "70" + }, + "src": "645:7:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 81, + "nodeType": "IfStatement", + "src": "641:73:0", + "trueBody": { + "id": 80, + "nodeType": "Block", + "src": "654:60:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "66616c7365", + "id": 75, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "675:5:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "false" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "id": 74, + "name": "assert", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -3, + "src": "668:6:0", + "typeDescriptions": { + "typeIdentifier": "t_function_assert_pure$_t_bool_$returns$__$", + "typeString": "function (bool) pure" + } + }, + "id": 76, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "668:13:0", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 77, + "nodeType": "ExpressionStatement", + "src": "668:13:0" + }, + { + "expression": { + "argumentTypes": null, + "hexValue": "37", + "id": 78, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "702:1:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_7_by_1", + "typeString": "int_const 7" + }, + "value": "7" + }, + "functionReturnParameters": 37, + "id": 79, + "nodeType": "Return", + "src": "695:8:0" + } + ] + } + }, + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 84, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 82, + "name": "x", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7, + "src": "727:1:0", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "hexValue": "3930", + "id": 83, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "732:2:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_90_by_1", + "typeString": "int_const 90" + }, + "value": "90" + }, + "src": "727:7:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 92, + "nodeType": "IfStatement", + "src": "723:73:0", + "trueBody": { + "id": 91, + "nodeType": "Block", + "src": "736:60:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "66616c7365", + "id": 86, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "757:5:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "false" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "id": 85, + "name": "assert", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -3, + "src": "750:6:0", + "typeDescriptions": { + "typeIdentifier": "t_function_assert_pure$_t_bool_$returns$__$", + "typeString": "function (bool) pure" + } + }, + "id": 87, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "750:13:0", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 88, + "nodeType": "ExpressionStatement", + "src": "750:13:0" + }, + { + "expression": { + "argumentTypes": null, + "hexValue": "39", + "id": 89, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "784:1:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_9_by_1", + "typeString": "int_const 9" + }, + "value": "9" + }, + "functionReturnParameters": 37, + "id": 90, + "nodeType": "Return", + "src": "777:8:0" + } + ] + } + }, + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 95, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 93, + "name": "x", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7, + "src": "809:1:0", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "hexValue": "313130", + "id": 94, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "814:3:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_110_by_1", + "typeString": "int_const 110" + }, + "value": "110" + }, + "src": "809:8:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 103, + "nodeType": "IfStatement", + "src": "805:75:0", + "trueBody": { + "id": 102, + "nodeType": "Block", + "src": "819:61:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "66616c7365", + "id": 97, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "840:5:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "false" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "id": 96, + "name": "assert", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -3, + "src": "833:6:0", + "typeDescriptions": { + "typeIdentifier": "t_function_assert_pure$_t_bool_$returns$__$", + "typeString": "function (bool) pure" + } + }, + "id": 98, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "833:13:0", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 99, + "nodeType": "ExpressionStatement", + "src": "833:13:0" + }, + { + "expression": { + "argumentTypes": null, + "hexValue": "3131", + "id": 100, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "867:2:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_11_by_1", + "typeString": "int_const 11" + }, + "value": "11" + }, + "functionReturnParameters": 37, + "id": 101, + "nodeType": "Return", + "src": "860:9:0" + } + ] + } + }, + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 106, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 104, + "name": "x", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7, + "src": "893:1:0", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "hexValue": "313330", + "id": 105, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "898:3:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_130_by_1", + "typeString": "int_const 130" + }, + "value": "130" + }, + "src": "893:8:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 114, + "nodeType": "IfStatement", + "src": "889:75:0", + "trueBody": { + "id": 113, + "nodeType": "Block", + "src": "903:61:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "66616c7365", + "id": 108, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "924:5:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "false" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "id": 107, + "name": "assert", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -3, + "src": "917:6:0", + "typeDescriptions": { + "typeIdentifier": "t_function_assert_pure$_t_bool_$returns$__$", + "typeString": "function (bool) pure" + } + }, + "id": 109, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "917:13:0", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 110, + "nodeType": "ExpressionStatement", + "src": "917:13:0" + }, + { + "expression": { + "argumentTypes": null, + "hexValue": "3133", + "id": 111, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "951:2:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_13_by_1", + "typeString": "int_const 13" + }, + "value": "13" + }, + "functionReturnParameters": 37, + "id": 112, + "nodeType": "Return", + "src": "944:9:0" + } + ] + } + }, + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 117, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 115, + "name": "x", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7, + "src": "977:1:0", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "hexValue": "313530", + "id": 116, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "982:3:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_150_by_1", + "typeString": "int_const 150" + }, + "value": "150" + }, + "src": "977:8:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 125, + "nodeType": "IfStatement", + "src": "973:75:0", + "trueBody": { + "id": 124, + "nodeType": "Block", + "src": "987:61:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "66616c7365", + "id": 119, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1008:5:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "false" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "id": 118, + "name": "assert", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -3, + "src": "1001:6:0", + "typeDescriptions": { + "typeIdentifier": "t_function_assert_pure$_t_bool_$returns$__$", + "typeString": "function (bool) pure" + } + }, + "id": 120, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "1001:13:0", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 121, + "nodeType": "ExpressionStatement", + "src": "1001:13:0" + }, + { + "expression": { + "argumentTypes": null, + "hexValue": "3135", + "id": 122, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1035:2:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_15_by_1", + "typeString": "int_const 15" + }, + "value": "15" + }, + "functionReturnParameters": 37, + "id": 123, + "nodeType": "Return", + "src": "1028:9:0" + } + ] + } + }, + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 128, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 126, + "name": "x", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7, + "src": "1061:1:0", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "hexValue": "313730", + "id": 127, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1066:3:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_170_by_1", + "typeString": "int_const 170" + }, + "value": "170" + }, + "src": "1061:8:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 136, + "nodeType": "IfStatement", + "src": "1057:75:0", + "trueBody": { + "id": 135, + "nodeType": "Block", + "src": "1071:61:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "66616c7365", + "id": 130, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1092:5:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "false" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "id": 129, + "name": "assert", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -3, + "src": "1085:6:0", + "typeDescriptions": { + "typeIdentifier": "t_function_assert_pure$_t_bool_$returns$__$", + "typeString": "function (bool) pure" + } + }, + "id": 131, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "1085:13:0", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 132, + "nodeType": "ExpressionStatement", + "src": "1085:13:0" + }, + { + "expression": { + "argumentTypes": null, + "hexValue": "3137", + "id": 133, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1119:2:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_17_by_1", + "typeString": "int_const 17" + }, + "value": "17" + }, + "functionReturnParameters": 37, + "id": 134, + "nodeType": "Return", + "src": "1112:9:0" + } + ] + } + }, + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 139, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 137, + "name": "x", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7, + "src": "1145:1:0", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "hexValue": "313930", + "id": 138, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1150:3:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_190_by_1", + "typeString": "int_const 190" + }, + "value": "190" + }, + "src": "1145:8:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 147, + "nodeType": "IfStatement", + "src": "1141:75:0", + "trueBody": { + "id": 146, + "nodeType": "Block", + "src": "1155:61:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "66616c7365", + "id": 141, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "bool", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1176:5:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "value": "false" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "id": 140, + "name": "assert", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -3, + "src": "1169:6:0", + "typeDescriptions": { + "typeIdentifier": "t_function_assert_pure$_t_bool_$returns$__$", + "typeString": "function (bool) pure" + } + }, + "id": 142, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "1169:13:0", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 143, + "nodeType": "ExpressionStatement", + "src": "1169:13:0" + }, + { + "expression": { + "argumentTypes": null, + "hexValue": "3139", + "id": 144, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1203:2:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_19_by_1", + "typeString": "int_const 19" + }, + "value": "19" + }, + "functionReturnParameters": 37, + "id": 145, + "nodeType": "Return", + "src": "1196:9:0" + } + ] + } + }, + { + "expression": { + "argumentTypes": null, + "hexValue": "30", + "id": 148, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1232:1:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "functionReturnParameters": 37, + "id": 149, + "nodeType": "Return", + "src": "1225:8:0" + } + ] + }, + "documentation": null, + "id": 151, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "_original_Foo_Bar", + "nodeType": "FunctionDefinition", + "overrides": null, + "parameters": { + "id": 34, + "nodeType": "ParameterList", + "parameters": [], + "src": "352:2:0" + }, + "returnParameters": { + "id": 37, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 36, + "mutability": "mutable", + "name": "", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 151, + "src": "377:6:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 35, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "377:6:0", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "376:8:0" + }, + "scope": 171, + "src": "326:914:0", + "stateMutability": "view", + "virtual": false, + "visibility": "private" + }, + { + "body": { + "id": 169, + "nodeType": "Block", + "src": "1278:42:0", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 167, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 156, + "name": "x", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7, + "src": "1288:1:0", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 166, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "components": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 159, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "hexValue": "32", + "id": 157, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1293:1:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_2_by_1", + "typeString": "int_const 2" + }, + "value": "2" + }, + "nodeType": "BinaryOperation", + "operator": "*", + "rightExpression": { + "argumentTypes": null, + "id": 158, + "name": "x", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7, + "src": "1297:1:0", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "src": "1293:5:0", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "id": 160, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "1292:7:0", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "argumentTypes": null, + "components": [ + { + "argumentTypes": null, + "condition": { + "argumentTypes": null, + "id": 161, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 153, + "src": "1303:1:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseExpression": { + "argumentTypes": null, + "hexValue": "30", + "id": 163, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1311:1:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "id": 164, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "Conditional", + "src": "1303:9:0", + "trueExpression": { + "argumentTypes": null, + "hexValue": "31", + "id": 162, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1307:1:0", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + } + ], + "id": 165, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "1302:11:0", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "src": "1292:21:0", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "src": "1288:25:0", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "id": 168, + "nodeType": "ExpressionStatement", + "src": "1288:25:0" + } + ] + }, + "documentation": null, + "functionSelector": "df5b7227", + "id": 170, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "SetNext", + "nodeType": "FunctionDefinition", + "overrides": null, + "parameters": { + "id": 154, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 153, + "mutability": "mutable", + "name": "b", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 170, + "src": "1263:6:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 152, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "1263:4:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "1262:8:0" + }, + "returnParameters": { + "id": 155, + "nodeType": "ParameterList", + "parameters": [], + "src": "1278:0:0" + }, + "scope": 171, + "src": "1246:74:0", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "public" + } + ], + "scope": 172, + "src": "25:1297:0" + } + ], + "src": "0:1322:0" + } + } + }, + "contracts": [ + { + "sourcePaths": { + "0": "contracts/sample.sol" + }, + "deployedSourceMap": "25:1297:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;111:209;;;:::i;:::-;;;;;;;;;;;;;;;;1246:74;;;;;;;;;;;;;;;;-1:-1:-1;1246:74:0;;;;:::i;:::-;;111:209;142:12;174:19;:17;:19::i;:::-;166:27;;209:1;;214:2;209:7;203:111;;238:38;;;;;;;;;;;;-1:-1:-1;;;238:38:0;;;;;;;;;;;;;;;290:13;;111:209;:::o;1246:74::-;1303:1;:9;;1311:1;1303:9;;;1307:1;1303:9;1292:21;;1297:1;;1293;:5;1292:21;1288:1;:25;;;;1246:74;:::o;326:914::-;377:6;399:1;;404:2;399:7;395:73;;;422:13;395:73;481:1;;486:2;481:7;477:73;;;504:13;477:73;563:1;;568:2;563:7;559:73;;;586:13;559:73;645:1;;650:2;645:7;641:73;;;668:13;641:73;727:1;;732:2;727:7;723:73;;;750:13;723:73;809:1;;814:3;809:8;805:75;;;833:13;805:75;893:1;;898:3;893:8;889:75;;;917:13;889:75;977:1;;982:3;977:8;973:75;;;1001:13;973:75;1061:1;;1066:3;1061:8;1057:75;;;1085:13;1057:75;1145:1;;1150:3;1145:8;1141:75;;;1169:13;1141:75;-1:-1:-1;1232:1:0;326:914;:::o", + "deployedBytecode": "608060405234801561001057600080fd5b50600436106100365760003560e01c8063b0a378b01461003b578063df5b722714610055575b600080fd5b610043610076565b60408051918252519081900360200190f35b6100746004803603602081101561006b57600080fd5b503515156100e7565b005b6000610080610109565b90506000546013146100e457604080516020808252601390820152720c0e88151a1a5cc81cda1bdd5b190819985a5b606a1b8183015290517fb42604cb105a16c8f6db8a41e6b00c0c1b4826465e8bc504b3eb3e88b3e6a4a09181900360600190a1fe5b90565b806100f35760006100f6565b60015b60ff166000546002020160008190555050565b60008054600a141561011757fe5b600054601e141561012457fe5b6000546032141561013157fe5b6000546046141561013e57fe5b600054605a141561014b57fe5b600054606e141561015857fe5b6000546082141561016557fe5b6000546096141561017257fe5b60005460aa141561017f57fe5b60005460be141561018c57fe5b5060009056fea2646970667358221220d15c0974595ed5c9a5da68377d16635bfa92f13a2af22bf0b52f63632505f04664736f6c634300060c0033", + "sourceMap": "25:1297:0:-:0;;;;;;;;;;;;;;;;;;;", + "bytecode": "608060405234801561001057600080fd5b506101c8806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063b0a378b01461003b578063df5b722714610055575b600080fd5b610043610076565b60408051918252519081900360200190f35b6100746004803603602081101561006b57600080fd5b503515156100e7565b005b6000610080610109565b90506000546013146100e457604080516020808252601390820152720c0e88151a1a5cc81cda1bdd5b190819985a5b606a1b8183015290517fb42604cb105a16c8f6db8a41e6b00c0c1b4826465e8bc504b3eb3e88b3e6a4a09181900360600190a1fe5b90565b806100f35760006100f6565b60015b60ff166000546002020160008190555050565b60008054600a141561011757fe5b600054601e141561012457fe5b6000546032141561013157fe5b6000546046141561013e57fe5b600054605a141561014b57fe5b600054606e141561015857fe5b6000546082141561016557fe5b6000546096141561017257fe5b60005460aa141561017f57fe5b60005460be141561018c57fe5b5060009056fea2646970667358221220d15c0974595ed5c9a5da68377d16635bfa92f13a2af22bf0b52f63632505f04664736f6c634300060c0033", + "contractName": "Foo", + "mainSourceFile": "contracts/sample.sol" + } + ], + "instrumentation_metadata": { + "instrToOriginalMap": [ + [ + "0:23:0", + "0:23:0" + ], + [ + "25:1297:0", + "24:852:0" + ], + [ + "88:16:0", + "41:16:0" + ], + [ + "88:6:0", + "41:6:0" + ], + [ + "326:914:0", + "114:693:0" + ], + [ + "352:2:0", + "126:2:0" + ], + [ + "376:8:0", + "149:8:0" + ], + [ + "377:6:0", + "150:6:0" + ], + [ + "377:6:0", + "150:6:0" + ], + [ + "385:855:0", + "158:649:0" + ], + [ + "395:73:0", + "164:57:0" + ], + [ + "399:7:0", + "168:7:0" + ], + [ + "399:1:0", + "168:1:0" + ], + [ + "404:2:0", + "173:2:0" + ], + [ + "408:60:0", + "177:44:0" + ], + [ + "422:13:0", + "185:13:0" + ], + [ + "422:13:0", + "185:13:0" + ], + [ + "422:6:0", + "185:6:0" + ], + [ + "429:5:0", + "192:5:0" + ], + [ + "449:8:0", + "206:8:0" + ], + [ + "456:1:0", + "213:1:0" + ], + [ + "477:73:0", + "226:57:0" + ], + [ + "481:7:0", + "230:7:0" + ], + [ + "481:1:0", + "230:1:0" + ], + [ + "486:2:0", + "235:2:0" + ], + [ + "490:60:0", + "239:44:0" + ], + [ + "504:13:0", + "247:13:0" + ], + [ + "504:13:0", + "247:13:0" + ], + [ + "504:6:0", + "247:6:0" + ], + [ + "511:5:0", + "254:5:0" + ], + [ + "531:8:0", + "268:8:0" + ], + [ + "538:1:0", + "275:1:0" + ], + [ + "559:73:0", + "288:57:0" + ], + [ + "563:7:0", + "292:7:0" + ], + [ + "563:1:0", + "292:1:0" + ], + [ + "568:2:0", + "297:2:0" + ], + [ + "572:60:0", + "301:44:0" + ], + [ + "586:13:0", + "309:13:0" + ], + [ + "586:13:0", + "309:13:0" + ], + [ + "586:6:0", + "309:6:0" + ], + [ + "593:5:0", + "316:5:0" + ], + [ + "613:8:0", + "330:8:0" + ], + [ + "620:1:0", + "337:1:0" + ], + [ + "641:73:0", + "350:57:0" + ], + [ + "645:7:0", + "354:7:0" + ], + [ + "645:1:0", + "354:1:0" + ], + [ + "650:2:0", + "359:2:0" + ], + [ + "654:60:0", + "363:44:0" + ], + [ + "668:13:0", + "371:13:0" + ], + [ + "668:13:0", + "371:13:0" + ], + [ + "668:6:0", + "371:6:0" + ], + [ + "675:5:0", + "378:5:0" + ], + [ + "695:8:0", + "392:8:0" + ], + [ + "702:1:0", + "399:1:0" + ], + [ + "723:73:0", + "412:57:0" + ], + [ + "727:7:0", + "416:7:0" + ], + [ + "727:1:0", + "416:1:0" + ], + [ + "732:2:0", + "421:2:0" + ], + [ + "736:60:0", + "425:44:0" + ], + [ + "750:13:0", + "433:13:0" + ], + [ + "750:13:0", + "433:13:0" + ], + [ + "750:6:0", + "433:6:0" + ], + [ + "757:5:0", + "440:5:0" + ], + [ + "777:8:0", + "454:8:0" + ], + [ + "784:1:0", + "461:1:0" + ], + [ + "805:75:0", + "474:59:0" + ], + [ + "809:8:0", + "478:8:0" + ], + [ + "809:1:0", + "478:1:0" + ], + [ + "814:3:0", + "483:3:0" + ], + [ + "819:61:0", + "488:45:0" + ], + [ + "833:13:0", + "496:13:0" + ], + [ + "833:13:0", + "496:13:0" + ], + [ + "833:6:0", + "496:6:0" + ], + [ + "840:5:0", + "503:5:0" + ], + [ + "860:9:0", + "517:9:0" + ], + [ + "867:2:0", + "524:2:0" + ], + [ + "889:75:0", + "538:59:0" + ], + [ + "893:8:0", + "542:8:0" + ], + [ + "893:1:0", + "542:1:0" + ], + [ + "898:3:0", + "547:3:0" + ], + [ + "903:61:0", + "552:45:0" + ], + [ + "917:13:0", + "560:13:0" + ], + [ + "917:13:0", + "560:13:0" + ], + [ + "917:6:0", + "560:6:0" + ], + [ + "924:5:0", + "567:5:0" + ], + [ + "944:9:0", + "581:9:0" + ], + [ + "951:2:0", + "588:2:0" + ], + [ + "973:75:0", + "602:59:0" + ], + [ + "977:8:0", + "606:8:0" + ], + [ + "977:1:0", + "606:1:0" + ], + [ + "982:3:0", + "611:3:0" + ], + [ + "987:61:0", + "616:45:0" + ], + [ + "1001:13:0", + "624:13:0" + ], + [ + "1001:13:0", + "624:13:0" + ], + [ + "1001:6:0", + "624:6:0" + ], + [ + "1008:5:0", + "631:5:0" + ], + [ + "1028:9:0", + "645:9:0" + ], + [ + "1035:2:0", + "652:2:0" + ], + [ + "1057:75:0", + "666:59:0" + ], + [ + "1061:8:0", + "670:8:0" + ], + [ + "1061:1:0", + "670:1:0" + ], + [ + "1066:3:0", + "675:3:0" + ], + [ + "1071:61:0", + "680:45:0" + ], + [ + "1085:13:0", + "688:13:0" + ], + [ + "1085:13:0", + "688:13:0" + ], + [ + "1085:6:0", + "688:6:0" + ], + [ + "1092:5:0", + "695:5:0" + ], + [ + "1112:9:0", + "709:9:0" + ], + [ + "1119:2:0", + "716:2:0" + ], + [ + "1141:75:0", + "730:59:0" + ], + [ + "1145:8:0", + "734:8:0" + ], + [ + "1145:1:0", + "734:1:0" + ], + [ + "1150:3:0", + "739:3:0" + ], + [ + "1155:61:0", + "744:45:0" + ], + [ + "1169:13:0", + "752:13:0" + ], + [ + "1169:13:0", + "752:13:0" + ], + [ + "1169:6:0", + "752:6:0" + ], + [ + "1176:5:0", + "759:5:0" + ], + [ + "1196:9:0", + "773:9:0" + ], + [ + "1203:2:0", + "780:2:0" + ], + [ + "1225:8:0", + "794:8:0" + ], + [ + "1232:1:0", + "801:1:0" + ], + [ + "1246:74:0", + "810:64:0" + ], + [ + "1262:8:0", + "826:8:0" + ], + [ + "1263:6:0", + "827:6:0" + ], + [ + "1263:4:0", + "827:4:0" + ], + [ + "1278:42:0", + "842:32:0" + ], + [ + "1288:25:0", + "848:21:0" + ], + [ + "1288:25:0", + "848:21:0" + ], + [ + "1288:1:0", + "848:1:0" + ], + [ + "1292:21:0", + "852:17:0" + ], + [ + "1293:5:0", + "852:3:0" + ], + [ + "1293:1:0", + "852:1:0" + ], + [ + "1297:1:0", + "854:1:0" + ], + [ + "1302:11:0", + "858:11:0" + ], + [ + "1303:9:0", + "859:9:0" + ], + [ + "1303:1:0", + "859:1:0" + ], + [ + "1307:1:0", + "863:1:0" + ], + [ + "1311:1:0", + "867:1:0" + ], + [ + "207:10:0", + "65:46:0" + ] + ], + "otherInstrumentation": [ + "111:38:1", + "142:12:0", + "166:27:0" + ], + "propertyMap": [ + { + "id": 0, + "contract": "Foo", + "filename": "contracts/sample.sol", + "propertySource": "103:7:0", + "annotationSource": "65:46:0", + "target": "function", + "targetName": "Bar", + "debugEventSignature": "", + "message": "This should fail", + "instrumentationRanges": [ + "233:43:0", + "203:111:0" + ], + "checkRanges": [ + "207:10:0" + ] + } + ], + "originalSourceList": [ + "contracts/sample.sol.original" + ], + "instrSourceList": [ + "contracts/sample.sol.instrumented", + "/Users/boss/git/mythx/truffle-projects/brownie-test/contracts/__scribble_ReentrancyUtils.sol" + ] + } +} diff --git a/tests/testdata/faas-new-campaign-response.json b/tests/testdata/faas-new-campaign-response.json new file mode 100644 index 0000000..a51bbda --- /dev/null +++ b/tests/testdata/faas-new-campaign-response.json @@ -0,0 +1,10 @@ +{ + "name": "brownie_test_yqzeu", + "multiContract": true, + "project": "00000000-0000-0000-0000-000000000000", + "corpus": "720f76a1-3be1-4aaa-862f-9e3d28e352e5", + "numSources": 1, + "status": "idle", + "submittedAt": "2021-03-30T16:17:18.389281", + "id": "560ba03a-8744-4da6-aeaa-a62568ccbf44" +} diff --git a/tests/testdata/ganache-all-blocks.json b/tests/testdata/ganache-all-blocks.json new file mode 100644 index 0000000..c6c1219 --- /dev/null +++ b/tests/testdata/ganache-all-blocks.json @@ -0,0 +1,64 @@ +[ + { + "number": "0x0", + "hash": "0x5fb06a0cfea7d897030d5d122507c02125bae6152547ec9a857ab33923fb1026", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x0000000000000000", + "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "transactionsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "stateRoot": "0x858b97ef98a11ed050a9b3e6a90e96edeca9d85d069d761cf460715d52481d19", + "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "miner": "0x0000000000000000000000000000000000000000", + "difficulty": "0x0", + "totalDifficulty": "0x0", + "extraData": "0x", + "size": "0x3e8", + "gasLimit": "0x6691b7", + "gasUsed": "0x0", + "timestamp": "0x60620b4f", + "transactions": [], + "uncles": [] + }, + { + "number": "0x1", + "hash": "0x12effde2c3cb82e381e7e4232d3bf810920df83710faf07940a1c510a96d1740", + "parentHash": "0x5fb06a0cfea7d897030d5d122507c02125bae6152547ec9a857ab33923fb1026", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x0000000000000000", + "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "transactionsRoot": "0xff2033a74277b53e99166be8add2e2023e944ffb0ca7ed79d3c9abbdb44def0b", + "stateRoot": "0x772badb796e4ac7d6acea3a09e968a7df24680762d9a0c9ef9ce731b4b8b88e0", + "receiptsRoot": "0xa982981c23d14b222a3d58b77205421a87004e6e2fd05c93a648f9dd350ea907", + "miner": "0x0000000000000000000000000000000000000000", + "difficulty": "0x0", + "totalDifficulty": "0x0", + "extraData": "0x", + "size": "0x3e8", + "gasLimit": "0x6691b7", + "gasUsed": "0x25069", + "timestamp": "0x60620b86", + "transactions": + [ + { + "hash": "0x5b2213faa860f042be3d68c782ee5a1f45aea9505f874a1370a0c3163e13f3f8", + "nonce": "0x0", + "blockHash": "0x12effde2c3cb82e381e7e4232d3bf810920df83710faf07940a1c510a96d1740", + "blockNumber": "0x1", + "transactionIndex": "0x0", + "from": "0xe6559ce865436c9206c6a971ed34658a57e51f17", + "to": null, + "value": "0x0", + "gas": "0x6691b7", + "gasPrice": "0x0", + "input": "0x608060405234801561001057600080fd5b506101c8806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063b0a378b01461003b578063df5b722714610055575b600080fd5b610043610076565b60408051918252519081900360200190f35b6100746004803603602081101561006b57600080fd5b503515156100e7565b005b6000610080610109565b90506000546013146100e457604080516020808252601390820152720c0e88151a1a5cc81cda1bdd5b190819985a5b606a1b8183015290517fb42604cb105a16c8f6db8a41e6b00c0c1b4826465e8bc504b3eb3e88b3e6a4a09181900360600190a1fe5b90565b806100f35760006100f6565b60015b60ff166000546002020160008190555050565b60008054600a141561011757fe5b600054601e141561012457fe5b6000546032141561013157fe5b6000546046141561013e57fe5b600054605a141561014b57fe5b600054606e141561015857fe5b6000546082141561016557fe5b6000546096141561017257fe5b60005460aa141561017f57fe5b60005460be141561018c57fe5b5060009056fea2646970667358221220d15c0974595ed5c9a5da68377d16635bfa92f13a2af22bf0b52f63632505f04664736f6c634300060c0033", + "v": "0x25", + "r": "0x8cb33aaf88705ef9b626e3b641c356c50c478912fb02ccddef9ab053fc83827b", + "s": "0x62e58b06e7c1decaedbdb8bfcdbddf69c56c5bfce6f27187ac587492686efd77" + } + ], + "uncles": [] + } +] From 61238e378341fb241dba46225f5e38f8de8f1d4c Mon Sep 17 00:00:00 2001 From: Joao Santos Date: Thu, 1 Apr 2021 12:31:10 +0100 Subject: [PATCH 23/41] fix: tests for python >3.6 --- .mythx.yml | 2 +- mythx_cli/analyze/scribble.py | 4 +- mythx_cli/analyze/truffle.py | 2 +- mythx_cli/cli.py | 2 +- mythx_cli/fuzz/exceptions.py | 29 +++++++++ mythx_cli/fuzz/faas.py | 48 +++++++++----- mythx_cli/fuzz/ide/__init__.py | 2 +- mythx_cli/fuzz/ide/brownie.py | 39 ++++++----- mythx_cli/fuzz/ide/generic.py | 13 ++-- mythx_cli/fuzz/rpc.py | 52 +++++++++------ mythx_cli/fuzz/run.py | 85 ++++++++++++++++-------- mythx_cli/util.py | 8 ++- setup.py | 3 - tests/common.py | 5 +- tests/test_fuzz.py | 116 ++++++++++++++++++++------------- 15 files changed, 266 insertions(+), 144 deletions(-) diff --git a/.mythx.yml b/.mythx.yml index daefc82..30ab5bd 100644 --- a/.mythx.yml +++ b/.mythx.yml @@ -4,4 +4,4 @@ fuzz: campaign_name_prefix: "brownie_test" rpc_url: "http://localhost:9898" faas_url: "http://localhost:9899" - build_directory: /private/var/folders/w9/36q5pfw94rz6bh0062p2j8p40000gn/T/pytest-of-boss/pytest-100/test_rpc_not_running0/build/contracts \ No newline at end of file + build_directory: /private/var/folders/w9/36q5pfw94rz6bh0062p2j8p40000gn/T/pytest-of-boss/pytest-105/test_fuzz_run_deployedSourceMa1/build/contracts \ No newline at end of file diff --git a/mythx_cli/analyze/scribble.py b/mythx_cli/analyze/scribble.py index 7e92a3d..8b5cdb1 100644 --- a/mythx_cli/analyze/scribble.py +++ b/mythx_cli/analyze/scribble.py @@ -122,7 +122,7 @@ def instrument_solc_in_place( scribble_path, "--arm", "--output-mode=files", - f"--instrumentation-metadata-file={SCRIBBLE_ARMING_META_FILE}" + f"--instrumentation-metadata-file={SCRIBBLE_ARMING_META_FILE}", ] if remappings: @@ -193,7 +193,7 @@ def disarm_solc_in_place( @staticmethod def get_arming_instr_meta(): if os.path.exists(SCRIBBLE_ARMING_META_FILE): - with open(SCRIBBLE_ARMING_META_FILE, 'r') as f: + with open(SCRIBBLE_ARMING_META_FILE, "r") as f: return json.load(f) return None diff --git a/mythx_cli/analyze/truffle.py b/mythx_cli/analyze/truffle.py index 5956848..f89be7c 100644 --- a/mythx_cli/analyze/truffle.py +++ b/mythx_cli/analyze/truffle.py @@ -42,7 +42,7 @@ def __init__(self, target: Path): self.dependency_map = self.build_dependency_map() def find_truffle_artifacts( - self + self, ) -> Union[Tuple[List[str], List[str]], Tuple[None, None]]: """Look for a Truffle build folder and return all relevant JSON artifacts. diff --git a/mythx_cli/cli.py b/mythx_cli/cli.py index 8bb63c7..d8447f3 100644 --- a/mythx_cli/cli.py +++ b/mythx_cli/cli.py @@ -194,7 +194,7 @@ def cli( ctx.obj["client"] = Client( username=username, password=password, middlewares=[toolname_mw] ) - #elif sys.argv[1] not in ("fuzz",): + # elif sys.argv[1] not in ("fuzz",): elif "fuzz" not in sys.argv: # fuzz subcommand is exempt from API auth raise click.UsageError( diff --git a/mythx_cli/fuzz/exceptions.py b/mythx_cli/fuzz/exceptions.py index 1fd2328..8679aa3 100644 --- a/mythx_cli/fuzz/exceptions.py +++ b/mythx_cli/fuzz/exceptions.py @@ -2,34 +2,49 @@ # FaaS Client Errors # + class FaaSError(Exception): """Base class for FaaS module exceptions""" + def __init__(self, message): self.message = message + pass + # HTTP Requests + class RequestError(FaaSError): """Exception raised for errors with the http connection to the faas""" + pass + class BadStatusCode(RequestError): """Exception raised for http responses with a bad status code""" + pass + # Data Formats + class PayloadError(FaaSError): """Exception raised for errors extracting data from the provided payload""" + pass + class ScribbleMetaError(FaaSError): """Exception raised for errors getting the Scribble Metadata""" + pass + class CreateFaaSCampaignError(FaaSError): """Exception raised for errors creating the FaaS Campaign""" + pass @@ -37,32 +52,46 @@ class CreateFaaSCampaignError(FaaSError): # Brownie Job Errors # + class BrownieError(Exception): """Base class for Brownie Job exceptions""" + def __init__(self, message): self.message = message + pass + class BuildArtifactsError(BrownieError): """Exception raised for errors fetching the build artifacts""" + pass + class SourceError(BrownieError): """Exception raised for errors the source and AST of a source file""" + pass + class PayloadError(BrownieError): """Exception raised for errors assembling the FaaS payload""" + pass + # # RPC client # + class RPCCallError(FaaSError): """Exception raised when there is an error calling the RPC endpoint""" + pass + class SeedStateError(FaaSError): """Exception raised when there is an error generating the seed state""" + pass diff --git a/mythx_cli/fuzz/faas.py b/mythx_cli/fuzz/faas.py index 9ae6af0..716a796 100644 --- a/mythx_cli/fuzz/faas.py +++ b/mythx_cli/fuzz/faas.py @@ -1,20 +1,27 @@ import json import logging import random -from mythx_cli.analyze.scribble import ScribbleMixin -from .exceptions import RequestError, BadStatusCode, PayloadError, ScribbleMetaError, CreateFaaSCampaignError +import string + import click import requests -import string + +from mythx_cli.analyze.scribble import ScribbleMixin + +from .exceptions import ( + BadStatusCode, + CreateFaaSCampaignError, + PayloadError, + RequestError, + ScribbleMetaError, +) LOGGER = logging.getLogger("mythx-cli") -headers = { - 'Content-Type': 'application/json' -} +headers = {"Content-Type": "application/json"} -class FaasClient(): +class FaasClient: """ A client to interact with the FaaS API. This object receives solidity compilation artifacts and a Harvey Seed state, generates a payload that the faas @@ -29,7 +36,7 @@ def __init__(self, faas_url, campaign_name_prefix, project_type): def generate_campaign_name(self): """Return a random name with the provided prefix self.campaign_name_prefix.""" letters = string.ascii_lowercase - random_string = ''.join(random.choice(letters) for i in range(5)) + random_string = "".join(random.choice(letters) for i in range(5)) return str(self.campaign_name_prefix + "_" + random_string) def start_faas_campaign(self, payload): @@ -39,7 +46,9 @@ def start_faas_campaign(self, payload): response = requests.post(req_url, json=payload, headers=headers) response_data = response.json() if response.status_code != requests.codes.ok: - raise BadStatusCode(f"Got http status code {response.status_code} for request {req_url}") + raise BadStatusCode( + f"Got http status code {response.status_code} for request {req_url}" + ) return response_data["id"] except Exception as e: raise RequestError(f"Error starting FaaS campaign.") @@ -63,16 +72,21 @@ def create_faas_campaign(self, campaign_data, seed_state): :return: Campaign ID """ try: - if self.project_type != 'brownie': - raise click.exceptions.UsageError("Currently only Brownie projects are supported") + if self.project_type != "brownie": + raise click.exceptions.UsageError( + "Currently only Brownie projects are supported" + ) try: api_payload = {"parameters": {}} api_payload["name"] = self.generate_campaign_name() - api_payload["parameters"]["discovery-probability-threshold"] = seed_state[ - "discovery-probability-threshold"] + api_payload["parameters"][ + "discovery-probability-threshold" + ] = seed_state["discovery-probability-threshold"] api_payload["parameters"]["num-cores"] = seed_state["num-cores"] - api_payload["parameters"]["assertion-checking-mode"] = seed_state["assertion-checking-mode"] + api_payload["parameters"]["assertion-checking-mode"] = seed_state[ + "assertion-checking-mode" + ] api_payload["corpus"] = seed_state["analysis-setup"] api_payload["sources"] = campaign_data.payload["sources"] api_payload["contracts"] = campaign_data.payload["contracts"] @@ -85,10 +99,12 @@ def create_faas_campaign(self, campaign_data, seed_state): if instr_meta is not None: api_payload["instrumentation_metadata"] = instr_meta except Exception as e: - raise ScribbleMetaError(f"Error getting Scribble arming metadata.") from e + raise ScribbleMetaError( + f"Error getting Scribble arming metadata." + ) from e campaign_id = self.start_faas_campaign(api_payload) return campaign_id - except (PayloadError,ScribbleMetaError ) as e: + except (PayloadError, ScribbleMetaError) as e: raise CreateFaaSCampaignError(f"Error creating the FaaS campaign:") diff --git a/mythx_cli/fuzz/ide/__init__.py b/mythx_cli/fuzz/ide/__init__.py index d475e4a..e22e88b 100644 --- a/mythx_cli/fuzz/ide/__init__.py +++ b/mythx_cli/fuzz/ide/__init__.py @@ -1,2 +1,2 @@ -from mythx_cli.fuzz.ide.generic import IDEArtifacts from mythx_cli.fuzz.ide.brownie import BrownieJob +from mythx_cli.fuzz.ide.generic import IDEArtifacts diff --git a/mythx_cli/fuzz/ide/brownie.py b/mythx_cli/fuzz/ide/brownie.py index 300748a..91939d2 100644 --- a/mythx_cli/fuzz/ide/brownie.py +++ b/mythx_cli/fuzz/ide/brownie.py @@ -1,14 +1,19 @@ -from pathlib import Path import json -import os import logging -from mythx_cli.fuzz.exceptions import BrownieError, BuildArtifactsError, SourceError, PayloadError - -from ...util import sol_files_by_directory +import os from pathlib import Path from typing import Dict, List + +from mythx_cli.fuzz.exceptions import ( + BrownieError, + BuildArtifactsError, + PayloadError, + SourceError, +) from mythx_cli.fuzz.ide.generic import IDEArtifacts, JobBuilder +from ...util import sol_files_by_directory + LOGGER = logging.getLogger("mythx-cli") @@ -44,15 +49,17 @@ def fetch_data(self, build_files_by_source_file): for contract in contracts: # We get the build items from brownie and rename them into the properties used by the FaaS try: - result_contracts[source_file] += [{ - "sourcePaths": contract["allSourcePaths"], - "deployedSourceMap": contract["deployedSourceMap"], - "deployedBytecode": contract["deployedBytecode"], - "sourceMap": contract["sourceMap"], - "bytecode": contract["bytecode"], - "contractName": contract["contractName"], - "mainSourceFile": contract["sourcePath"], - }] + result_contracts[source_file] += [ + { + "sourcePaths": contract["allSourcePaths"], + "deployedSourceMap": contract["deployedSourceMap"], + "deployedBytecode": contract["deployedBytecode"], + "sourceMap": contract["sourceMap"], + "bytecode": contract["bytecode"], + "contractName": contract["contractName"], + "mainSourceFile": contract["sourcePath"], + } + ] except KeyError as e: raise BuildArtifactsError( f"Build artifact did not contain expected key. Contract: {contract}: \n{e}" @@ -102,13 +109,13 @@ def _get_build_artifacts(build_dir) -> Dict: if not build_dir.is_dir(): raise BuildArtifactsError("Build directory doesn't exist") - for child in build_dir.glob('**/*'): + for child in build_dir.glob("**/*"): if not child.is_file(): continue if not child.name.endswith(".json"): continue - data = json.loads(child.read_text('utf-8')) + data = json.loads(child.read_text("utf-8")) source_path = data["sourcePath"] if source_path not in build_files_by_source_file: diff --git a/mythx_cli/fuzz/ide/generic.py b/mythx_cli/fuzz/ide/generic.py index d3cadf0..00159e6 100644 --- a/mythx_cli/fuzz/ide/generic.py +++ b/mythx_cli/fuzz/ide/generic.py @@ -1,5 +1,5 @@ -from typing import Dict from abc import ABC, abstractmethod +from typing import Dict class IDEArtifacts(ABC): @@ -39,8 +39,9 @@ def __init__(self, artifacts: IDEArtifacts): def payload(self): sources = self._artifacts.sources - contracts = [c for contracts_for_file in self._artifacts.contracts.values() for c in contracts_for_file] - return { - "contracts": contracts, - "sources": sources - } + contracts = [ + c + for contracts_for_file in self._artifacts.contracts.values() + for c in contracts_for_file + ] + return {"contracts": contracts, "sources": sources} diff --git a/mythx_cli/fuzz/rpc.py b/mythx_cli/fuzz/rpc.py index 1b4fb29..db6f7d3 100644 --- a/mythx_cli/fuzz/rpc.py +++ b/mythx_cli/fuzz/rpc.py @@ -1,49 +1,58 @@ -from pathlib import Path import json -import os import logging +import os +from pathlib import Path import click import requests from requests import RequestException from .exceptions import RPCCallError + LOGGER = logging.getLogger("mythx-cli") -headers = { - 'Content-Type': 'application/json' -} +headers = {"Content-Type": "application/json"} time_limit_seconds = 3000 NUM_BLOCKS_UPPER_LIMIT = 9999 -class RPCClient(): + +class RPCClient: def __init__(self, rpc_url: str, number_of_cores: int): self.rpc_url = rpc_url self.number_of_cores = number_of_cores - def call(self, method: str, params: str): """Make an rpc call to the RPC endpoint :return: Result property of the RPC response """ try: - payload = "{\"jsonrpc\":\"2.0\",\"method\":\"" + method + "\",\"params\":" + params + ",\"id\":1}" - response = (requests.request("POST", self.rpc_url, headers=headers, data=payload)).json() + payload = ( + '{"jsonrpc":"2.0","method":"' + + method + + '","params":' + + params + + ',"id":1}' + ) + response = ( + requests.request("POST", self.rpc_url, headers=headers, data=payload) + ).json() return response["result"] except RequestException as e: - raise RPCCallError(f"HTTP error calling RPC method {method} with parameters: {params}" - f"\nAre you sure the RPC is running at {self.rpc_url}?") + raise RPCCallError( + f"HTTP error calling RPC method {method} with parameters: {params}" + f"\nAre you sure the RPC is running at {self.rpc_url}?" + ) def contract_exists(self, contract_address): - return self.call("eth_getCode", "[\"" + contract_address + "\",\"latest\"]") + return self.call("eth_getCode", '["' + contract_address + '","latest"]') def get_block(self, latest: bool = False, block_number: int = -1): block_value = "latest" if latest else str(block_number) if not latest: block_value = hex(block_number) - block = self.call("eth_getBlockByNumber", "[\"" + block_value + "\", true]") + block = self.call("eth_getBlockByNumber", '["' + block_value + '", true]') if block is None: return None else: @@ -64,14 +73,14 @@ def get_all_blocks(self): if num_of_blocks > NUM_BLOCKS_UPPER_LIMIT: raise click.exceptions.UsageError( "Number of blocks existing on the ethereum node running at" - + str(self.rpc_url) + "can not exceed 10000. Did you pass the correct RPC url?" + + str(self.rpc_url) + + "can not exceed 10000. Did you pass the correct RPC url?" ) blocks = [] for i in range(0, num_of_blocks, 1): blocks.append(self.get_block(block_number=i)) return blocks - def get_seed_state(self, address: str, other_addresses: [str]): """Get a seed state for the target contract to be used by Harvey""" try: @@ -83,10 +92,13 @@ def get_seed_state(self, address: str, other_addresses: [str]): if value is None: transaction[key] = "" processed_transactions.append(transaction) - setup = dict({ - "address-under-test": address, - "steps": processed_transactions, - "other-addresses-under-test": other_addresses}) + setup = dict( + { + "address-under-test": address, + "steps": processed_transactions, + "other-addresses-under-test": other_addresses, + } + ) return dict( { "time-limit-secs": time_limit_seconds, @@ -94,7 +106,7 @@ def get_seed_state(self, address: str, other_addresses: [str]): "discovery-probability-threshold": 0.0, "assertion-checking-mode": 1, "emit-mythx-report": True, - "num-cores": self.number_of_cores + "num-cores": self.number_of_cores, } ) except Exception as e: diff --git a/mythx_cli/fuzz/run.py b/mythx_cli/fuzz/run.py index 568d833..f0652bc 100644 --- a/mythx_cli/fuzz/run.py +++ b/mythx_cli/fuzz/run.py @@ -2,41 +2,44 @@ import random import string -import requests import click +import requests + from mythx_cli.fuzz.ide.brownie import BrownieJob + from .exceptions import RPCCallError from .faas import FaasClient from .rpc import RPCClient LOGGER = logging.getLogger("mythx-cli") -headers = { - 'Content-Type': 'application/json' -} +headers = {"Content-Type": "application/json"} time_limit_seconds = 3000 def start_faas_campaign(payload, faas_url): - response = (requests.request("POST", faas_url + "/api/campaigns?start_immediately=true", headers=headers, - data=payload)).json() + response = ( + requests.request( + "POST", + faas_url + "/api/campaigns?start_immediately=true", + headers=headers, + data=payload, + ) + ).json() return response["id"] def generate_campaign_name(prefix: str): letters = string.ascii_lowercase - random_string = ''.join(random.choice(letters) for i in range(5)) + random_string = "".join(random.choice(letters) for i in range(5)) return str(prefix + "_" + random_string) @click.command("run") @click.argument("target", default=None, nargs=-1, required=False) @click.option( - "-a", - "--address", - type=click.STRING, - help="Address of the main contract to analyze", + "-a", "--address", type=click.STRING, help="Address of the main contract to analyze" ) @click.option( "-m", @@ -69,8 +72,7 @@ def fuzz_run(ctx, address, more_addresses, target): "rpc_url": "http://localhost:7545", "faas_url": "http://localhost:8080", "harvey_num_cores": 2, - "campaign_name_prefix": "untitled" - + "campaign_name_prefix": "untitled", } config_options = analyze_config.keys() # Mandatory config parameters verification @@ -96,39 +98,66 @@ def fuzz_run(ctx, address, more_addresses, target): # Optional config parameters # Here we parse the config parameters from the config file and use defaults for non available values contract_address = analyze_config["deployed_contract_address"] - rpc_url = analyze_config["rpc_url"] if 'rpc_url' in config_options else default_config["rpc_url"] - faas_url = analyze_config["faas_url"] if 'faas_url' in config_options else default_config["faas_url"] - number_of_cores = analyze_config["number_of_cores"] if 'number_of_cores' in config_options else default_config[ - "harvey_num_cores"] - campaign_name_prefix = analyze_config["campaign_name_prefix"] if "campaign_name_prefix" in config_options else \ - default_config["campaign_name_prefix"] + rpc_url = ( + analyze_config["rpc_url"] + if "rpc_url" in config_options + else default_config["rpc_url"] + ) + faas_url = ( + analyze_config["faas_url"] + if "faas_url" in config_options + else default_config["faas_url"] + ) + number_of_cores = ( + analyze_config["number_of_cores"] + if "number_of_cores" in config_options + else default_config["harvey_num_cores"] + ) + campaign_name_prefix = ( + analyze_config["campaign_name_prefix"] + if "campaign_name_prefix" in config_options + else default_config["campaign_name_prefix"] + ) try: rpc_client = RPCClient(rpc_url, number_of_cores) - contract_code_response = rpc_client.contract_exists( contract_address) + contract_code_response = rpc_client.contract_exists(contract_address) except RPCCallError as e: - raise click.exceptions.UsageError(f"RPC endpoint." - f"\n{e}") + raise click.exceptions.UsageError(f"RPC endpoint." f"\n{e}") if not contract_code_response: LOGGER.warning(f"Contract code not found") - raise click.exceptions.ClickException(f"Unable to find a contract deployed at {contract_address}.") + raise click.exceptions.ClickException( + f"Unable to find a contract deployed at {contract_address}." + ) if more_addresses is None: other_addresses = [] else: - other_addresses = more_addresses.split(',') + other_addresses = more_addresses.split(",") # We get the seed state from the provided rpc endpoint seed_state = rpc_client.get_seed_state(contract_address, other_addresses) brownie_artifacts = BrownieJob(target, analyze_config["build_directory"]) brownie_artifacts.generate_payload() - faas_client = FaasClient(faas_url=faas_url, campaign_name_prefix=campaign_name_prefix, project_type="brownie") + faas_client = FaasClient( + faas_url=faas_url, + campaign_name_prefix=campaign_name_prefix, + project_type="brownie", + ) try: - campaign_id = faas_client.create_faas_campaign(campaign_data=brownie_artifacts, seed_state=seed_state) - click.echo("You can view campaign here: " + faas_url + "/campaigns/" + str(campaign_id)) + campaign_id = faas_client.create_faas_campaign( + campaign_data=brownie_artifacts, seed_state=seed_state + ) + click.echo( + "You can view campaign here: " + faas_url + "/campaigns/" + str(campaign_id) + ) except Exception as e: LOGGER.warning(f"Could not submit campaign to the FaaS") - raise click.exceptions.UsageError(f"Unable to submit the campaign to the faas. Are you sure the service is running on {faas_url} ?") + raise click.exceptions.UsageError( + f"Unable to submit the campaign to the faas. Are you sure the service is running on {faas_url} ?" + ) + + pass diff --git a/mythx_cli/util.py b/mythx_cli/util.py index b65e76e..66a30d7 100644 --- a/mythx_cli/util.py +++ b/mythx_cli/util.py @@ -1,7 +1,7 @@ import logging import os from collections import defaultdict -from typing import Any, List, Optional, Tuple, AnyStr +from typing import Any, AnyStr, List, Optional, Tuple import click from mythx_models.response import AnalysisInputResponse, DetectedIssuesResponse @@ -261,11 +261,13 @@ def sol_files_by_directory(target_path: AnyStr) -> List: """ sol_files = [] # We start by checking if the target_path is potentially a .sol file - if target_path.endswith('.sol'): + if target_path.endswith(".sol"): # If .sol file we check if the target exists or if it's a user input error if not os.path.isfile(target_path): raise click.exceptions.UsageError( - "Could not find " + str(target_path) + ". Did you pass the correct directory?" + "Could not find " + + str(target_path) + + ". Did you pass the correct directory?" ) else: # If it's a valid .sol file there is no need to search further and we just append it to our diff --git a/setup.py b/setup.py index d7f8061..11437a9 100644 --- a/setup.py +++ b/setup.py @@ -25,17 +25,14 @@ "Development Status :: 4 - Beta", "License :: OSI Approved :: MIT License", "Natural Language :: English", - "Intended Audience :: Developers", "Intended Audience :: Education", "Intended Audience :: Information Technology", - "Topic :: Security", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: Software Development :: Quality Assurance", "Topic :: Terminals :: Terminal Emulators/X Terminals", "Topic :: Utilities", - "Typing :: Typed", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.6", diff --git a/tests/common.py b/tests/common.py index 0910f65..28c481c 100644 --- a/tests/common.py +++ b/tests/common.py @@ -34,6 +34,7 @@ def get_test_case(path: str, obj=None, raw=False): AST = get_test_case("testdata/test-ast.json") + @contextmanager def mock_faas_context(): # with patch("mythx_cli.fuzz.rpc.RPCClient.get_all_blocks", new=) as get_all_blocks_patch, patch( @@ -44,7 +45,9 @@ def mock_faas_context(): # contract_exists_patch.return_value = True with patch("mythx_cli.fuzz.rpc.RPCClient") as RPCClient_mock: instance = RPCClient_mock.return_value - instance.get_all_blocks.return_value = get_test_case("testdata/ganache-all-blocks.json") + instance.get_all_blocks.return_value = get_test_case( + "testdata/ganache-all-blocks.json" + ) instance.contract_exists.return_value = True yield diff --git a/tests/test_fuzz.py b/tests/test_fuzz.py index b027340..cd0949c 100644 --- a/tests/test_fuzz.py +++ b/tests/test_fuzz.py @@ -1,18 +1,18 @@ -import pytest -from click.testing import CliRunner +import json import os +from unittest.mock import patch +import pytest import requests +from click.testing import CliRunner from requests import RequestException from mythx_cli.cli import cli -import json -from unittest.mock import patch - from mythx_cli.fuzz.exceptions import RequestError -from .common import get_test_case, mock_context, mock_faas_context -from mythx_cli.fuzz.rpc import RPCClient from mythx_cli.fuzz.faas import FaasClient +from mythx_cli.fuzz.rpc import RPCClient + +from .common import get_test_case, mock_context, mock_faas_context BROWNIE_ARTIFACT = get_test_case("testdata/brownie-artifact.json") GANACHE_URL = "http://localhost:9898" @@ -42,18 +42,18 @@ def setup_brownie_project(base_path, compiled=True, switch_dir=False): def generate_config_file(base_path="", not_include=[]): config_file = "fuzz:" - if 'deployed_contract_address' not in not_include: + if "deployed_contract_address" not in not_include: config_file += '\n deployed_contract_address: "0x7277646075fa72737e1F6114654C5d9949a67dF2"' - if 'number_of_cores' not in not_include: - config_file += '\n number_of_cores: 1' - if 'campaign_name_prefix' not in not_include: + if "number_of_cores" not in not_include: + config_file += "\n number_of_cores: 1" + if "campaign_name_prefix" not in not_include: config_file += '\n campaign_name_prefix: "brownie_test"' - if 'rpc_url' not in not_include: + if "rpc_url" not in not_include: config_file += f'\n rpc_url: "{GANACHE_URL}"' - if 'faas_url' not in not_include: + if "faas_url" not in not_include: config_file += f'\n faas_url: "{FAAS_URL}"' - if 'build_directory' not in not_include: - config_file += f'\n build_directory: {base_path}/build/contracts' + if "build_directory" not in not_include: + config_file += f"\n build_directory: {base_path}/build/contracts" return config_file @@ -64,7 +64,9 @@ def test_fuzz_no_build_dir(tmp_path): conf_f.write(generate_config_file(not_include=["build_directory"])) result = runner.invoke(cli, ["fuzz", "run", "contracts"]) - assert "Error: build_directory not found on .mythx.yaml config file" in result.output + assert ( + "Error: build_directory not found on .mythx.yaml config file" in result.output + ) assert result.exit_code != 0 @@ -74,7 +76,10 @@ def test_fuzz_no_deployed_address(tmp_path): conf_f.write(generate_config_file(not_include=["deployed_contract_address"])) result = runner.invoke(cli, ["fuzz", "run", "contracts"]) - assert "Error: deployed_contract_address not found on .mythx.yaml config file." in result.output + assert ( + "Error: deployed_contract_address not found on .mythx.yaml config file." + in result.output + ) assert result.exit_code != 0 @@ -89,16 +94,19 @@ def test_fuzz_no_target(tmp_path): def test_fuzz_no_contract_at_address(tmp_path): - setup_brownie_project( - tmp_path, compiled=False, switch_dir=False - ) + setup_brownie_project(tmp_path, compiled=False, switch_dir=False) with open(".mythx.yml", "w+") as conf_f: conf_f.write(generate_config_file(base_path=tmp_path)) - with patch.object(RPCClient, 'contract_exists') as contract_exists_mock, patch.object( - RPCClient, 'get_all_blocks') as get_all_blocks_mock: - get_all_blocks_mock.return_value = get_test_case("testdata/ganache-all-blocks.json") + with patch.object( + RPCClient, "contract_exists" + ) as contract_exists_mock, patch.object( + RPCClient, "get_all_blocks" + ) as get_all_blocks_mock: + get_all_blocks_mock.return_value = get_test_case( + "testdata/ganache-all-blocks.json" + ) contract_exists_mock.return_value = False runner = CliRunner() @@ -109,31 +117,41 @@ def test_fuzz_no_contract_at_address(tmp_path): def test_faas_not_running(tmp_path): - setup_brownie_project( - tmp_path, compiled=False, switch_dir=False - ) + setup_brownie_project(tmp_path, compiled=False, switch_dir=False) with open(".mythx.yml", "w+") as conf_f: conf_f.write(generate_config_file(base_path=tmp_path)) - with patch.object(RPCClient, 'contract_exists') as contract_exists_mock, patch.object( - RPCClient, 'get_all_blocks') as get_all_blocks_mock, patch.object( - FaasClient, 'start_faas_campaign') as start_faas_campaign_mock: - get_all_blocks_mock.return_value = get_test_case("testdata/ganache-all-blocks.json") + with patch.object( + RPCClient, "contract_exists" + ) as contract_exists_mock, patch.object( + RPCClient, "get_all_blocks" + ) as get_all_blocks_mock, patch.object( + FaasClient, "start_faas_campaign" + ) as start_faas_campaign_mock: + get_all_blocks_mock.return_value = get_test_case( + "testdata/ganache-all-blocks.json" + ) contract_exists_mock.return_value = True - start_faas_campaign_mock.side_effect = RequestError(f"Error starting FaaS campaign.") + start_faas_campaign_mock.side_effect = RequestError( + f"Error starting FaaS campaign." + ) runner = CliRunner() result = runner.invoke(cli, ["fuzz", "run", f"{tmp_path}/contracts"]) - assert "Error: Unable to submit the campaign to the faas. Are you sure the service is running on" in result.output + assert ( + "Error: Unable to submit the campaign to the faas. Are you sure the service is running on" + in result.output + ) assert result.exit_code != 0 + def test_rpc_not_running(tmp_path): with open(".mythx.yml", "w+") as conf_f: conf_f.write(generate_config_file(base_path=tmp_path)) - with patch.object(requests, 'request') as requests_mock: + with patch.object(requests, "request") as requests_mock: requests_mock.side_effect = RequestException() runner = CliRunner() @@ -143,7 +161,6 @@ def test_rpc_not_running(tmp_path): assert result.exit_code != 0 - @pytest.mark.parametrize( "keyword", ( @@ -162,21 +179,25 @@ def test_rpc_not_running(tmp_path): "bytecode", "deployedBytecode", "sourceMap", - "deployedSourceMap" + "deployedSourceMap", ), ) def test_fuzz_run(tmp_path, keyword): - setup_brownie_project( - tmp_path, compiled=False, switch_dir=False - ) + setup_brownie_project(tmp_path, compiled=False, switch_dir=False) with open(".mythx.yml", "w+") as conf_f: conf_f.write(generate_config_file(base_path=tmp_path)) - with patch.object(RPCClient, 'contract_exists') as contract_exists_mock, patch.object( - RPCClient, 'get_all_blocks') as get_all_blocks_mock, patch.object( - FaasClient, 'start_faas_campaign') as start_faas_campaign_mock: - get_all_blocks_mock.return_value = get_test_case("testdata/ganache-all-blocks.json") + with patch.object( + RPCClient, "contract_exists" + ) as contract_exists_mock, patch.object( + RPCClient, "get_all_blocks" + ) as get_all_blocks_mock, patch.object( + FaasClient, "start_faas_campaign" + ) as start_faas_campaign_mock: + get_all_blocks_mock.return_value = get_test_case( + "testdata/ganache-all-blocks.json" + ) contract_exists_mock.return_value = True campaign_id = "560ba03a-8744-4da6-aeaa-a62568ccbf44" start_faas_campaign_mock.return_value = campaign_id @@ -184,14 +205,19 @@ def test_fuzz_run(tmp_path, keyword): runner = CliRunner() result = runner.invoke(cli, ["fuzz", "run", f"{tmp_path}/contracts"]) - contract_exists_mock.assert_called_with("0x7277646075fa72737e1F6114654C5d9949a67dF2") + contract_exists_mock.assert_called_with( + "0x7277646075fa72737e1F6114654C5d9949a67dF2" + ) contract_exists_mock.assert_called_once() get_all_blocks_mock.assert_called_once() start_faas_campaign_mock.assert_called_once() called_with = start_faas_campaign_mock.call_args - assert f"You can view campaign here: {FAAS_URL}/campaigns/{campaign_id}" in result.output + assert ( + f"You can view campaign here: {FAAS_URL}/campaigns/{campaign_id}" + in result.output + ) - request_payload = json.dumps(called_with.args[0]) + request_payload = json.dumps(called_with[0]) assert keyword in request_payload assert result.exit_code == 0 From d2852486b6a8979564291d423b18c52417c2304d Mon Sep 17 00:00:00 2001 From: Joao Santos Date: Tue, 6 Apr 2021 12:17:48 +0100 Subject: [PATCH 24/41] fix: make targets an array on the config file test: increase test coverage of fuzz run command --- .mythx.yml | 4 +++- mythx_cli/fuzz/run.py | 23 ++--------------------- tests/test_fuzz.py | 41 +++++++++++++++++++++++++++++++++++++---- 3 files changed, 42 insertions(+), 26 deletions(-) diff --git a/.mythx.yml b/.mythx.yml index 30ab5bd..20d3578 100644 --- a/.mythx.yml +++ b/.mythx.yml @@ -4,4 +4,6 @@ fuzz: campaign_name_prefix: "brownie_test" rpc_url: "http://localhost:9898" faas_url: "http://localhost:9899" - build_directory: /private/var/folders/w9/36q5pfw94rz6bh0062p2j8p40000gn/T/pytest-of-boss/pytest-105/test_fuzz_run_deployedSourceMa1/build/contracts \ No newline at end of file + build_directory: /private/var/folders/w9/36q5pfw94rz6bh0062p2j8p40000gn/T/pytest-of-boss/pytest-20/test_faas_target_config_file0/build/contracts + targets: + - "/private/var/folders/w9/36q5pfw94rz6bh0062p2j8p40000gn/T/pytest-of-boss/pytest-20/test_faas_target_config_file0/contracts" \ No newline at end of file diff --git a/mythx_cli/fuzz/run.py b/mythx_cli/fuzz/run.py index f0652bc..110ff15 100644 --- a/mythx_cli/fuzz/run.py +++ b/mythx_cli/fuzz/run.py @@ -17,25 +17,6 @@ time_limit_seconds = 3000 - -def start_faas_campaign(payload, faas_url): - response = ( - requests.request( - "POST", - faas_url + "/api/campaigns?start_immediately=true", - headers=headers, - data=payload, - ) - ).json() - return response["id"] - - -def generate_campaign_name(prefix: str): - letters = string.ascii_lowercase - random_string = "".join(random.choice(letters) for i in range(5)) - return str(prefix + "_" + random_string) - - @click.command("run") @click.argument("target", default=None, nargs=-1, required=False) @click.option( @@ -86,7 +67,7 @@ def fuzz_run(ctx, address, more_addresses, target): "deployed_contract_address not found on .mythx.yaml config file." "You need to provide the address where your main contract is deployed on the .mythx.yaml" ) - if not target and "target" not in config_options: + if not target and "targets" not in config_options: raise click.exceptions.UsageError( "Target not provided. You need to provide a target as the last parameter of the fuzz run command." "\nYou can also set the target on the `fuzz` key of your .mythx.yaml config file." @@ -94,7 +75,7 @@ def fuzz_run(ctx, address, more_addresses, target): " for more information." ) if not target: - target = [analyze_config["target"]] + target = analyze_config["targets"] # Optional config parameters # Here we parse the config parameters from the config file and use defaults for non available values contract_address = analyze_config["deployed_contract_address"] diff --git a/tests/test_fuzz.py b/tests/test_fuzz.py index cd0949c..1579f3c 100644 --- a/tests/test_fuzz.py +++ b/tests/test_fuzz.py @@ -54,7 +54,8 @@ def generate_config_file(base_path="", not_include=[]): config_file += f'\n faas_url: "{FAAS_URL}"' if "build_directory" not in not_include: config_file += f"\n build_directory: {base_path}/build/contracts" - + if "targets" not in not_include: + config_file += f'\n targets:\n - "{base_path}/contracts"' return config_file @@ -86,13 +87,12 @@ def test_fuzz_no_deployed_address(tmp_path): def test_fuzz_no_target(tmp_path): runner = CliRunner() with open(".mythx.yml", "w+") as conf_f: - conf_f.write(generate_config_file()) + conf_f.write(generate_config_file(not_include=["targets"])) result = runner.invoke(cli, ["fuzz", "run"]) assert "Error: Target not provided." in result.output assert result.exit_code != 0 - def test_fuzz_no_contract_at_address(tmp_path): setup_brownie_project(tmp_path, compiled=False, switch_dir=False) @@ -115,7 +115,6 @@ def test_fuzz_no_contract_at_address(tmp_path): assert "Error: Unable to find a contract deployed" in result.output assert result.exit_code != 0 - def test_faas_not_running(tmp_path): setup_brownie_project(tmp_path, compiled=False, switch_dir=False) @@ -146,6 +145,40 @@ def test_faas_not_running(tmp_path): ) assert result.exit_code != 0 +def test_faas_target_config_file(tmp_path): + """Here we reuse the test_faas_not_running logic to check that the target is being read + from the config file. This is possible because the faas not running error is triggered + after the Target check. If the target was not available, a different error would be thrown + and the test would fail""" + setup_brownie_project(tmp_path, compiled=False, switch_dir=False) + + with open(".mythx.yml", "w+") as conf_f: + conf_f.write(generate_config_file(base_path=tmp_path)) + + with patch.object( + RPCClient, "contract_exists" + ) as contract_exists_mock, patch.object( + RPCClient, "get_all_blocks" + ) as get_all_blocks_mock, patch.object( + FaasClient, "start_faas_campaign" + ) as start_faas_campaign_mock: + get_all_blocks_mock.return_value = get_test_case( + "testdata/ganache-all-blocks.json" + ) + contract_exists_mock.return_value = True + start_faas_campaign_mock.side_effect = RequestError( + f"Error starting FaaS campaign." + ) + + runner = CliRunner() + # we call the run command without the target parameter. + result = runner.invoke(cli, ["fuzz", "run"]) + + assert ( + "Error: Unable to submit the campaign to the faas. Are you sure the service is running on" + in result.output + ) + assert result.exit_code != 0 def test_rpc_not_running(tmp_path): with open(".mythx.yml", "w+") as conf_f: From d23321d295c66966dc6f439cf20900891851b865 Mon Sep 17 00:00:00 2001 From: Joao Santos Date: Tue, 6 Apr 2021 13:19:34 +0100 Subject: [PATCH 25/41] test: add tests for fuzz Carm and disarm commands --- .mythx.yml | 4 ++-- tests/test_fuzz.py | 29 +++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/.mythx.yml b/.mythx.yml index 20d3578..1c00995 100644 --- a/.mythx.yml +++ b/.mythx.yml @@ -4,6 +4,6 @@ fuzz: campaign_name_prefix: "brownie_test" rpc_url: "http://localhost:9898" faas_url: "http://localhost:9899" - build_directory: /private/var/folders/w9/36q5pfw94rz6bh0062p2j8p40000gn/T/pytest-of-boss/pytest-20/test_faas_target_config_file0/build/contracts + build_directory: /private/var/folders/w9/36q5pfw94rz6bh0062p2j8p40000gn/T/pytest-of-boss/pytest-34/test_fuzz_arm0/build/contracts targets: - - "/private/var/folders/w9/36q5pfw94rz6bh0062p2j8p40000gn/T/pytest-of-boss/pytest-20/test_faas_target_config_file0/contracts" \ No newline at end of file + - "/private/var/folders/w9/36q5pfw94rz6bh0062p2j8p40000gn/T/pytest-of-boss/pytest-34/test_fuzz_arm0/contracts" \ No newline at end of file diff --git a/tests/test_fuzz.py b/tests/test_fuzz.py index 1579f3c..cbba38b 100644 --- a/tests/test_fuzz.py +++ b/tests/test_fuzz.py @@ -11,6 +11,7 @@ from mythx_cli.fuzz.exceptions import RequestError from mythx_cli.fuzz.faas import FaasClient from mythx_cli.fuzz.rpc import RPCClient +from mythx_cli.analyze.scribble import ScribbleMixin from .common import get_test_case, mock_context, mock_faas_context @@ -93,6 +94,7 @@ def test_fuzz_no_target(tmp_path): assert "Error: Target not provided." in result.output assert result.exit_code != 0 + def test_fuzz_no_contract_at_address(tmp_path): setup_brownie_project(tmp_path, compiled=False, switch_dir=False) @@ -115,6 +117,7 @@ def test_fuzz_no_contract_at_address(tmp_path): assert "Error: Unable to find a contract deployed" in result.output assert result.exit_code != 0 + def test_faas_not_running(tmp_path): setup_brownie_project(tmp_path, compiled=False, switch_dir=False) @@ -145,6 +148,7 @@ def test_faas_not_running(tmp_path): ) assert result.exit_code != 0 + def test_faas_target_config_file(tmp_path): """Here we reuse the test_faas_not_running logic to check that the target is being read from the config file. This is possible because the faas not running error is triggered @@ -180,6 +184,7 @@ def test_faas_target_config_file(tmp_path): ) assert result.exit_code != 0 + def test_rpc_not_running(tmp_path): with open(".mythx.yml", "w+") as conf_f: conf_f.write(generate_config_file(base_path=tmp_path)) @@ -262,3 +267,27 @@ def test_fuzz_subcommands_present(keyword): result = runner.invoke(cli, ["fuzz", "--help"]) assert keyword in result.output + +@patch('mythx_cli.analyze.scribble.ScribbleMixin.instrument_solc_in_place') +def test_fuzz_arm(mock, tmp_path): + setup_brownie_project(tmp_path, compiled=False, switch_dir=False) + + runner = CliRunner() + result = runner.invoke(cli, ["fuzz", "arm", f"{tmp_path}/contracts/sample.sol"]) + + mock.assert_called() + mock.assert_called_with(file_list=(f"{tmp_path}/contracts/sample.sol",), scribble_path='scribble', remappings=[], solc_version=None) + assert result.exit_code == 0 + + +@patch('mythx_cli.analyze.scribble.ScribbleMixin.disarm_solc_in_place') +def test_fuzz_disarm(mock, tmp_path): + setup_brownie_project(tmp_path, compiled=False, switch_dir=False) + + runner = CliRunner() + result = runner.invoke(cli, ["fuzz", "disarm", f"{tmp_path}/contracts/sample.sol"]) + + mock.assert_called() + mock.assert_called_with(file_list=(f"{tmp_path}/contracts/sample.sol",), scribble_path='scribble', remappings=[], solc_version=None) + assert result.exit_code == 0 + From b84b3c2d817af9aa16499461d1f69d233525816c Mon Sep 17 00:00:00 2001 From: Joao Santos Date: Tue, 6 Apr 2021 13:20:28 +0100 Subject: [PATCH 26/41] remove unused code --- tests/test_fuzz.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/tests/test_fuzz.py b/tests/test_fuzz.py index cbba38b..376c930 100644 --- a/tests/test_fuzz.py +++ b/tests/test_fuzz.py @@ -11,16 +11,15 @@ from mythx_cli.fuzz.exceptions import RequestError from mythx_cli.fuzz.faas import FaasClient from mythx_cli.fuzz.rpc import RPCClient -from mythx_cli.analyze.scribble import ScribbleMixin -from .common import get_test_case, mock_context, mock_faas_context +from .common import get_test_case BROWNIE_ARTIFACT = get_test_case("testdata/brownie-artifact.json") GANACHE_URL = "http://localhost:9898" FAAS_URL = "http://localhost:9899" -def setup_brownie_project(base_path, compiled=True, switch_dir=False): +def setup_brownie_project(base_path, switch_dir=False): # switch to temp dir if requested if switch_dir: os.chdir(str(base_path)) From 83bedd4840f6e96ae6300447f50c9b86754a0dd1 Mon Sep 17 00:00:00 2001 From: Joao Santos Date: Tue, 6 Apr 2021 15:18:25 +0100 Subject: [PATCH 27/41] test: fix broken test --- mythx_cli/fuzz/run.py | 1 + tests/test_fuzz.py | 32 +++++++++++++++++++++----------- 2 files changed, 22 insertions(+), 11 deletions(-) diff --git a/mythx_cli/fuzz/run.py b/mythx_cli/fuzz/run.py index 110ff15..e27560a 100644 --- a/mythx_cli/fuzz/run.py +++ b/mythx_cli/fuzz/run.py @@ -17,6 +17,7 @@ time_limit_seconds = 3000 + @click.command("run") @click.argument("target", default=None, nargs=-1, required=False) @click.option( diff --git a/tests/test_fuzz.py b/tests/test_fuzz.py index 376c930..bccf1b9 100644 --- a/tests/test_fuzz.py +++ b/tests/test_fuzz.py @@ -95,7 +95,7 @@ def test_fuzz_no_target(tmp_path): def test_fuzz_no_contract_at_address(tmp_path): - setup_brownie_project(tmp_path, compiled=False, switch_dir=False) + setup_brownie_project(tmp_path, switch_dir=False) with open(".mythx.yml", "w+") as conf_f: conf_f.write(generate_config_file(base_path=tmp_path)) @@ -118,7 +118,7 @@ def test_fuzz_no_contract_at_address(tmp_path): def test_faas_not_running(tmp_path): - setup_brownie_project(tmp_path, compiled=False, switch_dir=False) + setup_brownie_project(tmp_path, switch_dir=False) with open(".mythx.yml", "w+") as conf_f: conf_f.write(generate_config_file(base_path=tmp_path)) @@ -153,7 +153,7 @@ def test_faas_target_config_file(tmp_path): from the config file. This is possible because the faas not running error is triggered after the Target check. If the target was not available, a different error would be thrown and the test would fail""" - setup_brownie_project(tmp_path, compiled=False, switch_dir=False) + setup_brownie_project(tmp_path, switch_dir=False) with open(".mythx.yml", "w+") as conf_f: conf_f.write(generate_config_file(base_path=tmp_path)) @@ -220,7 +220,7 @@ def test_rpc_not_running(tmp_path): ), ) def test_fuzz_run(tmp_path, keyword): - setup_brownie_project(tmp_path, compiled=False, switch_dir=False) + setup_brownie_project(tmp_path, switch_dir=False) with open(".mythx.yml", "w+") as conf_f: conf_f.write(generate_config_file(base_path=tmp_path)) @@ -267,26 +267,36 @@ def test_fuzz_subcommands_present(keyword): assert keyword in result.output -@patch('mythx_cli.analyze.scribble.ScribbleMixin.instrument_solc_in_place') + +@patch("mythx_cli.analyze.scribble.ScribbleMixin.instrument_solc_in_place") def test_fuzz_arm(mock, tmp_path): - setup_brownie_project(tmp_path, compiled=False, switch_dir=False) + setup_brownie_project(tmp_path, switch_dir=False) runner = CliRunner() result = runner.invoke(cli, ["fuzz", "arm", f"{tmp_path}/contracts/sample.sol"]) mock.assert_called() - mock.assert_called_with(file_list=(f"{tmp_path}/contracts/sample.sol",), scribble_path='scribble', remappings=[], solc_version=None) + mock.assert_called_with( + file_list=(f"{tmp_path}/contracts/sample.sol",), + scribble_path="scribble", + remappings=[], + solc_version=None, + ) assert result.exit_code == 0 -@patch('mythx_cli.analyze.scribble.ScribbleMixin.disarm_solc_in_place') +@patch("mythx_cli.analyze.scribble.ScribbleMixin.disarm_solc_in_place") def test_fuzz_disarm(mock, tmp_path): - setup_brownie_project(tmp_path, compiled=False, switch_dir=False) + setup_brownie_project(tmp_path, switch_dir=False) runner = CliRunner() result = runner.invoke(cli, ["fuzz", "disarm", f"{tmp_path}/contracts/sample.sol"]) mock.assert_called() - mock.assert_called_with(file_list=(f"{tmp_path}/contracts/sample.sol",), scribble_path='scribble', remappings=[], solc_version=None) + mock.assert_called_with( + file_list=(f"{tmp_path}/contracts/sample.sol",), + scribble_path="scribble", + remappings=[], + solc_version=None, + ) assert result.exit_code == 0 - From 9bc0f81d4497b77014d3946acffead7e3b98c673 Mon Sep 17 00:00:00 2001 From: blitz-1306 Date: Wed, 7 Apr 2021 10:37:22 +0500 Subject: [PATCH 28/41] Tweak instrumentation metadata entry in payload to follow API format changes. Tweak error messages to be properly displayed and mention valid .mythx,yml config file name. --- mythx_cli/fuzz/faas.py | 2 +- mythx_cli/fuzz/run.py | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/mythx_cli/fuzz/faas.py b/mythx_cli/fuzz/faas.py index 716a796..dfbaa40 100644 --- a/mythx_cli/fuzz/faas.py +++ b/mythx_cli/fuzz/faas.py @@ -97,7 +97,7 @@ def create_faas_campaign(self, campaign_data, seed_state): instr_meta = ScribbleMixin.get_arming_instr_meta() if instr_meta is not None: - api_payload["instrumentation_metadata"] = instr_meta + api_payload["instrumentationMetadata"] = instr_meta except Exception as e: raise ScribbleMetaError( f"Error getting Scribble arming metadata." diff --git a/mythx_cli/fuzz/run.py b/mythx_cli/fuzz/run.py index e27560a..2692e3d 100644 --- a/mythx_cli/fuzz/run.py +++ b/mythx_cli/fuzz/run.py @@ -60,18 +60,18 @@ def fuzz_run(ctx, address, more_addresses, target): # Mandatory config parameters verification if "build_directory" not in config_options: raise click.exceptions.UsageError( - "build_directory not found on .mythx.yaml config file" - "You need to provide your project's build directory in the .mythx.yaml config file" + "build_directory not found on .mythx.yml config file" + "\nYou need to provide your project's build directory in the .mythx.yml config file" ) if "deployed_contract_address" not in config_options: raise click.exceptions.UsageError( - "deployed_contract_address not found on .mythx.yaml config file." - "You need to provide the address where your main contract is deployed on the .mythx.yaml" + "deployed_contract_address not found on .mythx.yml config file." + "\nYou need to provide the address where your main contract is deployed on the .mythx.yml" ) if not target and "targets" not in config_options: raise click.exceptions.UsageError( "Target not provided. You need to provide a target as the last parameter of the fuzz run command." - "\nYou can also set the target on the `fuzz` key of your .mythx.yaml config file." + "\nYou can also set the target on the `fuzz` key of your .mythx.yml config file." "\nSee https://mythx-cli.readthedocs.io/en/latest/advanced-usage.html#configuration-using-mythx-yml" " for more information." ) From 0788e6aca374a081e23ae3f7c83c203cbe358f95 Mon Sep 17 00:00:00 2001 From: blitz-1306 Date: Wed, 7 Apr 2021 10:41:58 +0500 Subject: [PATCH 29/41] Fix affected tests --- tests/test_fuzz.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_fuzz.py b/tests/test_fuzz.py index bccf1b9..992cc34 100644 --- a/tests/test_fuzz.py +++ b/tests/test_fuzz.py @@ -66,7 +66,7 @@ def test_fuzz_no_build_dir(tmp_path): result = runner.invoke(cli, ["fuzz", "run", "contracts"]) assert ( - "Error: build_directory not found on .mythx.yaml config file" in result.output + "Error: build_directory not found on .mythx.yml config file" in result.output ) assert result.exit_code != 0 @@ -78,7 +78,7 @@ def test_fuzz_no_deployed_address(tmp_path): result = runner.invoke(cli, ["fuzz", "run", "contracts"]) assert ( - "Error: deployed_contract_address not found on .mythx.yaml config file." + "Error: deployed_contract_address not found on .mythx.yml config file." in result.output ) assert result.exit_code != 0 From 889c51fbf335bad104bb194d13dcec0ee53ea924 Mon Sep 17 00:00:00 2001 From: Joao Santos Date: Wed, 14 Apr 2021 17:27:45 +0100 Subject: [PATCH 30/41] qa: code tidy ups --- mythx_cli/analyze/command.py | 1 - mythx_cli/analyze/truffle.py | 2 +- mythx_cli/cli.py | 1 - mythx_cli/fuzz/arm.py | 4 +++- mythx_cli/fuzz/disarm.py | 4 +++- mythx_cli/fuzz/faas.py | 27 +++++++++++++++------------ mythx_cli/fuzz/rpc.py | 5 +---- tests/common.py | 6 ------ tests/test_fuzz.py | 4 +--- 9 files changed, 24 insertions(+), 30 deletions(-) diff --git a/mythx_cli/analyze/command.py b/mythx_cli/analyze/command.py index 5098949..ae06863 100644 --- a/mythx_cli/analyze/command.py +++ b/mythx_cli/analyze/command.py @@ -331,7 +331,6 @@ def analyze( swc_whitelist=swc_whitelist, ) # extend response with job UUID to keep formatter logic isolated - # resp.uuid = uuid issues_list.append((uuid, resp, inp)) LOGGER.debug( diff --git a/mythx_cli/analyze/truffle.py b/mythx_cli/analyze/truffle.py index f89be7c..5956848 100644 --- a/mythx_cli/analyze/truffle.py +++ b/mythx_cli/analyze/truffle.py @@ -42,7 +42,7 @@ def __init__(self, target: Path): self.dependency_map = self.build_dependency_map() def find_truffle_artifacts( - self, + self ) -> Union[Tuple[List[str], List[str]], Tuple[None, None]]: """Look for a Truffle build folder and return all relevant JSON artifacts. diff --git a/mythx_cli/cli.py b/mythx_cli/cli.py index d8447f3..ce495bf 100644 --- a/mythx_cli/cli.py +++ b/mythx_cli/cli.py @@ -194,7 +194,6 @@ def cli( ctx.obj["client"] = Client( username=username, password=password, middlewares=[toolname_mw] ) - # elif sys.argv[1] not in ("fuzz",): elif "fuzz" not in sys.argv: # fuzz subcommand is exempt from API auth raise click.UsageError( diff --git a/mythx_cli/fuzz/arm.py b/mythx_cli/fuzz/arm.py index 8cbe553..dc0ac21 100644 --- a/mythx_cli/fuzz/arm.py +++ b/mythx_cli/fuzz/arm.py @@ -58,7 +58,9 @@ def fuzz_arm( solc_version = solc_version or analyze_config.get("solc") or None remap_import = remap_import or analyze_config.get("remappings") or [] scribble_path = scribble_path or analyze_config.get("scribble-path") or "scribble" - targets = targets or analyze_config.get("targets") or None + + fuzz_config = ctx.get("fuzz") + targets = targets or fuzz_config.get("targets") or None ScribbleMixin.instrument_solc_in_place( file_list=targets, diff --git a/mythx_cli/fuzz/disarm.py b/mythx_cli/fuzz/disarm.py index a7fda4e..cbeac08 100644 --- a/mythx_cli/fuzz/disarm.py +++ b/mythx_cli/fuzz/disarm.py @@ -58,7 +58,9 @@ def fuzz_disarm( solc_version = solc_version or analyze_config.get("solc") or None remap_import = remap_import or analyze_config.get("remappings") or [] scribble_path = scribble_path or analyze_config.get("scribble-path") or "scribble" - targets = targets or analyze_config.get("targets") or None + + fuzz_config = ctx.get("fuzz") + targets = targets or fuzz_config.get("targets") or None ScribbleMixin.disarm_solc_in_place( file_list=targets, diff --git a/mythx_cli/fuzz/faas.py b/mythx_cli/fuzz/faas.py index dfbaa40..ab2f657 100644 --- a/mythx_cli/fuzz/faas.py +++ b/mythx_cli/fuzz/faas.py @@ -78,18 +78,21 @@ def create_faas_campaign(self, campaign_data, seed_state): ) try: - api_payload = {"parameters": {}} - api_payload["name"] = self.generate_campaign_name() - api_payload["parameters"][ - "discovery-probability-threshold" - ] = seed_state["discovery-probability-threshold"] - api_payload["parameters"]["num-cores"] = seed_state["num-cores"] - api_payload["parameters"]["assertion-checking-mode"] = seed_state[ - "assertion-checking-mode" - ] - api_payload["corpus"] = seed_state["analysis-setup"] - api_payload["sources"] = campaign_data.payload["sources"] - api_payload["contracts"] = campaign_data.payload["contracts"] + api_payload_params = { + "discovery-probability-threshold": seed_state[ + "discovery-probability-threshold" + ], + "num-cores": seed_state["num-cores"], + "assertion-checking-mode": seed_state["assertion-checking-mode"], + } + + api_payload = { + "parameters": api_payload_params, + "name": self.generate_campaign_name(), + "corpus": seed_state["analysis-setup"], + "sources": campaign_data.payload["sources"], + "contracts": campaign_data.payload["contracts"], + } except Exception: raise PayloadError(f"Error extracting data from payload") diff --git a/mythx_cli/fuzz/rpc.py b/mythx_cli/fuzz/rpc.py index db6f7d3..098c786 100644 --- a/mythx_cli/fuzz/rpc.py +++ b/mythx_cli/fuzz/rpc.py @@ -53,10 +53,7 @@ def get_block(self, latest: bool = False, block_number: int = -1): block_value = hex(block_number) block = self.call("eth_getBlockByNumber", '["' + block_value + '", true]') - if block is None: - return None - else: - return block + return block def get_all_blocks(self): """ Get all blocks from the node running at rpc_url diff --git a/tests/common.py b/tests/common.py index 28c481c..9417438 100644 --- a/tests/common.py +++ b/tests/common.py @@ -37,12 +37,6 @@ def get_test_case(path: str, obj=None, raw=False): @contextmanager def mock_faas_context(): - # with patch("mythx_cli.fuzz.rpc.RPCClient.get_all_blocks", new=) as get_all_blocks_patch, patch( - # "mythx_cli.fuzz.rpc.RPCClient.contract_exists" - # ) as contract_exists_patch: - # print("-->patching blocks") - # get_all_blocks_patch.return_value = get_test_case("testdata/ganache-all-blocks.json") - # contract_exists_patch.return_value = True with patch("mythx_cli.fuzz.rpc.RPCClient") as RPCClient_mock: instance = RPCClient_mock.return_value instance.get_all_blocks.return_value = get_test_case( diff --git a/tests/test_fuzz.py b/tests/test_fuzz.py index 992cc34..d8fa8ac 100644 --- a/tests/test_fuzz.py +++ b/tests/test_fuzz.py @@ -65,9 +65,7 @@ def test_fuzz_no_build_dir(tmp_path): conf_f.write(generate_config_file(not_include=["build_directory"])) result = runner.invoke(cli, ["fuzz", "run", "contracts"]) - assert ( - "Error: build_directory not found on .mythx.yml config file" in result.output - ) + assert "Error: build_directory not found on .mythx.yml config file" in result.output assert result.exit_code != 0 From 037091db6f7398b891e604171ded47a10176849f Mon Sep 17 00:00:00 2001 From: Nuradil Date: Thu, 29 Apr 2021 16:29:44 +0600 Subject: [PATCH 31/41] Hardhat integration --- .mythx.yml | 4 +- mythx_cli/fuzz/faas.py | 5 - mythx_cli/fuzz/ide/hardhat.py | 91 + mythx_cli/fuzz/run.py | 55 +- tests/{test_fuzz.py => test_fuzz_brownie.py} | 5 +- tests/test_fuzz_hardhat.py | 301 + .../testdata/hardhat-build-info-artifact.json | 35098 ++++++++++++++++ 7 files changed, 35540 insertions(+), 19 deletions(-) rename tests/{test_fuzz.py => test_fuzz_brownie.py} (98%) create mode 100644 tests/test_fuzz_hardhat.py create mode 100644 tests/testdata/hardhat-build-info-artifact.json diff --git a/.mythx.yml b/.mythx.yml index 1c00995..aae8eea 100644 --- a/.mythx.yml +++ b/.mythx.yml @@ -4,6 +4,6 @@ fuzz: campaign_name_prefix: "brownie_test" rpc_url: "http://localhost:9898" faas_url: "http://localhost:9899" - build_directory: /private/var/folders/w9/36q5pfw94rz6bh0062p2j8p40000gn/T/pytest-of-boss/pytest-34/test_fuzz_arm0/build/contracts + build_directory: /private/var/folders/11/8t_b_rxn4q1ddcyxnsvnkq080000gn/T/pytest-of-nuradil/pytest-15/test_fuzz_run_deployedSourceMa1/build targets: - - "/private/var/folders/w9/36q5pfw94rz6bh0062p2j8p40000gn/T/pytest-of-boss/pytest-34/test_fuzz_arm0/contracts" \ No newline at end of file + - "/private/var/folders/11/8t_b_rxn4q1ddcyxnsvnkq080000gn/T/pytest-of-nuradil/pytest-15/test_fuzz_run_deployedSourceMa1/contracts" \ No newline at end of file diff --git a/mythx_cli/fuzz/faas.py b/mythx_cli/fuzz/faas.py index ab2f657..1a4ebaa 100644 --- a/mythx_cli/fuzz/faas.py +++ b/mythx_cli/fuzz/faas.py @@ -72,11 +72,6 @@ def create_faas_campaign(self, campaign_data, seed_state): :return: Campaign ID """ try: - if self.project_type != "brownie": - raise click.exceptions.UsageError( - "Currently only Brownie projects are supported" - ) - try: api_payload_params = { "discovery-probability-threshold": seed_state[ diff --git a/mythx_cli/fuzz/ide/hardhat.py b/mythx_cli/fuzz/ide/hardhat.py index e69de29..47b45a2 100644 --- a/mythx_cli/fuzz/ide/hardhat.py +++ b/mythx_cli/fuzz/ide/hardhat.py @@ -0,0 +1,91 @@ +import json + +from mythx_cli.fuzz.ide.generic import IDEArtifacts, JobBuilder +from typing import List +from ...util import sol_files_by_directory +from pathlib import Path +from mythx_cli.fuzz.exceptions import BuildArtifactsError + + +class HardhatArtifacts(IDEArtifacts): + def __init__(self, build_dir=None, targets=None): + self._include = [] + if targets: + include = [] + for target in targets: + include.extend(sol_files_by_directory(target)) + self._include = include + + self._build_dir = Path(build_dir) or Path("./artifacts") + self._contracts, self._sources = self.fetch_data() + + @property + def contracts(self): + return self._contracts + + @property + def sources(self): + return self._sources + + def fetch_data(self): + result_contracts = {} + result_sources = {} + + for file_path in self._include: + if file_path in result_contracts: + continue + + file_name = Path(file_path).stem + file_artifact_path: Path = self._build_dir.joinpath(file_path).joinpath(f"{file_name}.json") + file_debug_path: Path = self._build_dir.joinpath(file_path).joinpath(f"{file_name}.dbg.json") + if not file_artifact_path.exists() or not file_debug_path.exists(): + raise BuildArtifactsError("Could not find target artifacts") + + with file_artifact_path.open("r") as file: + file_artifact = json.load(file) + with file_debug_path.open("r") as file: + file_debug_artifact = json.load(file) + build_info_name = Path(file_debug_artifact["buildInfo"]).name + with self._build_dir.joinpath(f"build-info/{build_info_name}") as file: + build_info = json.load(file) + + result_contracts[file_path] = [] + + contracts = build_info["output"]["contracts"][file_path] + + for contract, data in contracts: + if data["evm"]["bytecode"]["object"] == "": + continue + result_contracts[file_path] += [ + { + "sourcePaths": list(build_info["output"]["contracts"].keys()), + "deployedSourceMap": data["evm"]["deployedBytecode"]["sourceMap"], + "deployedBytecode": data["evm"]["deployedBytecode"]["object"], + "sourceMap": data["evm"]["bytecode"]["sourceMap"], + "bytecode": data["evm"]["bytecode"]["object"], + "contractName": file_artifact["contractName"], + "mainSourceFile": file_artifact["sourceName"], + } + ] + + for source_file_dep, data in build_info["output"]["sources"].items(): + if source_file_dep in result_sources.keys(): + continue + + result_sources[source_file_dep] = { + "fileIndex": data["id"], + "source": build_info["input"]["sources"][source_file_dep]["content"], + "ast": data["ast"], + } + + return result_contracts, result_sources + + +class HardhatJob: + def __init__(self, target: List[str], build_dir: Path): + artifacts = HardhatArtifacts(build_dir, targets=target) + self._jb = JobBuilder(artifacts) + self.payload = None + + def generate_payload(self): + self.payload = self._jb.payload() diff --git a/mythx_cli/fuzz/run.py b/mythx_cli/fuzz/run.py index 2692e3d..fd4045c 100644 --- a/mythx_cli/fuzz/run.py +++ b/mythx_cli/fuzz/run.py @@ -1,15 +1,14 @@ import logging -import random -import string - import click -import requests from mythx_cli.fuzz.ide.brownie import BrownieJob - +from mythx_cli.fuzz.ide.hardhat import HardhatJob from .exceptions import RPCCallError from .faas import FaasClient from .rpc import RPCClient +from enum import Enum +from pathlib import Path +import os LOGGER = logging.getLogger("mythx-cli") @@ -18,6 +17,27 @@ time_limit_seconds = 3000 +class IDE(Enum): + BROWNIE = 'brownie' + HARDHAT = 'hardhat' + TRUFFLE = 'truffle' + SOLIDITY = 'solidity' + + +def determine_ide(build_directory) -> IDE: + root_dir = Path(build_directory).parent + files = list(os.walk(root_dir))[0][2] + if 'brownie-config.yaml' in files: + return IDE.BROWNIE + if 'hardhat.config.ts' in files: + return IDE.HARDHAT + if 'hardhat.config.js' in files: + return IDE.HARDHAT + if 'truffle-config.js' in files: + return IDE.TRUFFLE + return IDE.SOLIDITY + + @click.command("run") @click.argument("target", default=None, nargs=-1, required=False) @click.option( @@ -120,17 +140,32 @@ def fuzz_run(ctx, address, more_addresses, target): # We get the seed state from the provided rpc endpoint seed_state = rpc_client.get_seed_state(contract_address, other_addresses) - brownie_artifacts = BrownieJob(target, analyze_config["build_directory"]) - brownie_artifacts.generate_payload() + + ide = determine_ide(analyze_config["build_directory"]) + + if ide == IDE.BROWNIE: + artifacts = BrownieJob(target, analyze_config["build_directory"]) + artifacts.generate_payload() + elif ide == IDE.HARDHAT: + artifacts = HardhatJob(target, analyze_config["build_directory"]) + artifacts.generate_payload() + elif ide == IDE.TRUFFLE: + raise click.exceptions.UsageError( + f"Projects using Truffle IDE is not supported right now" + ) + else: + raise click.exceptions.UsageError( + f"Projects using plain solidity files is not supported right now" + ) faas_client = FaasClient( faas_url=faas_url, campaign_name_prefix=campaign_name_prefix, - project_type="brownie", + project_type=ide, ) try: campaign_id = faas_client.create_faas_campaign( - campaign_data=brownie_artifacts, seed_state=seed_state + campaign_data=artifacts, seed_state=seed_state ) click.echo( "You can view campaign here: " + faas_url + "/campaigns/" + str(campaign_id) @@ -141,5 +176,3 @@ def fuzz_run(ctx, address, more_addresses, target): f"Unable to submit the campaign to the faas. Are you sure the service is running on {faas_url} ?" ) - -pass diff --git a/tests/test_fuzz.py b/tests/test_fuzz_brownie.py similarity index 98% rename from tests/test_fuzz.py rename to tests/test_fuzz_brownie.py index d8fa8ac..87d33dd 100644 --- a/tests/test_fuzz.py +++ b/tests/test_fuzz_brownie.py @@ -28,6 +28,9 @@ def setup_brownie_project(base_path, switch_dir=False): os.makedirs(str(base_path / "build/contracts/")) os.makedirs(str(base_path / "contracts/")) + with open(base_path / "brownie-config.yaml", "w+") as config_f: + json.dump("sample", config_f) + # patch brownie artifact with temp path BROWNIE_ARTIFACT["allSourcePaths"][0] = f"{base_path}/contracts/sample.sol" BROWNIE_ARTIFACT["sourcePath"] = f"{base_path}/contracts/sample.sol" @@ -53,7 +56,7 @@ def generate_config_file(base_path="", not_include=[]): if "faas_url" not in not_include: config_file += f'\n faas_url: "{FAAS_URL}"' if "build_directory" not in not_include: - config_file += f"\n build_directory: {base_path}/build/contracts" + config_file += f"\n build_directory: {base_path}/build" if "targets" not in not_include: config_file += f'\n targets:\n - "{base_path}/contracts"' return config_file diff --git a/tests/test_fuzz_hardhat.py b/tests/test_fuzz_hardhat.py new file mode 100644 index 0000000..c069800 --- /dev/null +++ b/tests/test_fuzz_hardhat.py @@ -0,0 +1,301 @@ +import json +import os +from unittest.mock import patch + +import pytest +import requests +from click.testing import CliRunner +from requests import RequestException + +from mythx_cli.cli import cli +from mythx_cli.fuzz.exceptions import RequestError +from mythx_cli.fuzz.faas import FaasClient +from mythx_cli.fuzz.rpc import RPCClient + +from .common import get_test_case + +BROWNIE_ARTIFACT = get_test_case("testdata/brownie-artifact.json") +GANACHE_URL = "http://localhost:9898" +FAAS_URL = "http://localhost:9899" + + +def setup_hardhat_project(base_path, switch_dir=False): + # switch to temp dir if requested + if switch_dir: + os.chdir(str(base_path)) + + # add hardhat project structure + os.makedirs(str(base_path / "artifacts/contracts/")) + os.makedirs(str(base_path / "artifacts/build-info/")) + os.makedirs(str(base_path / "contracts/")) + + # patch brownie artifact with temp path + BROWNIE_ARTIFACT["allSourcePaths"][0] = f"{base_path}/contracts/sample.sol" + BROWNIE_ARTIFACT["sourcePath"] = f"{base_path}/contracts/sample.sol" + + # add sample brownie artifact + with open(base_path / "build/contracts/Foo.json", "w+") as artifact_f: + json.dump(BROWNIE_ARTIFACT, artifact_f) + with open(base_path / "contracts/sample.sol", "w+") as sol_f: + sol_f.write("sol code here") + + +def generate_config_file(base_path="", not_include=[]): + config_file = "fuzz:" + + if "deployed_contract_address" not in not_include: + config_file += '\n deployed_contract_address: "0x7277646075fa72737e1F6114654C5d9949a67dF2"' + if "number_of_cores" not in not_include: + config_file += "\n number_of_cores: 1" + if "campaign_name_prefix" not in not_include: + config_file += '\n campaign_name_prefix: "brownie_test"' + if "rpc_url" not in not_include: + config_file += f'\n rpc_url: "{GANACHE_URL}"' + if "faas_url" not in not_include: + config_file += f'\n faas_url: "{FAAS_URL}"' + if "build_directory" not in not_include: + config_file += f"\n build_directory: {base_path}/build/artifacts" + if "targets" not in not_include: + config_file += f'\n targets:\n - "{base_path}/contracts"' + return config_file + + +def test_fuzz_no_build_dir(tmp_path): + runner = CliRunner() + with open(".mythx.yml", "w+") as conf_f: + conf_f.write(generate_config_file(not_include=["build_directory"])) + + result = runner.invoke(cli, ["fuzz", "run", "contracts"]) + assert "Error: build_directory not found on .mythx.yml config file" in result.output + assert result.exit_code != 0 + + +def test_fuzz_no_deployed_address(tmp_path): + runner = CliRunner() + with open(".mythx.yml", "w+") as conf_f: + conf_f.write(generate_config_file(not_include=["deployed_contract_address"])) + + result = runner.invoke(cli, ["fuzz", "run", "contracts"]) + assert ( + "Error: deployed_contract_address not found on .mythx.yml config file." + in result.output + ) + assert result.exit_code != 0 + + +def test_fuzz_no_target(tmp_path): + runner = CliRunner() + with open(".mythx.yml", "w+") as conf_f: + conf_f.write(generate_config_file(not_include=["targets"])) + + result = runner.invoke(cli, ["fuzz", "run"]) + assert "Error: Target not provided." in result.output + assert result.exit_code != 0 + + +def test_fuzz_no_contract_at_address(tmp_path): + setup_brownie_project(tmp_path, switch_dir=False) + + with open(".mythx.yml", "w+") as conf_f: + conf_f.write(generate_config_file(base_path=tmp_path)) + + with patch.object( + RPCClient, "contract_exists" + ) as contract_exists_mock, patch.object( + RPCClient, "get_all_blocks" + ) as get_all_blocks_mock: + get_all_blocks_mock.return_value = get_test_case( + "testdata/ganache-all-blocks.json" + ) + contract_exists_mock.return_value = False + + runner = CliRunner() + result = runner.invoke(cli, ["fuzz", "run", f"{tmp_path}/contracts"]) + + assert "Error: Unable to find a contract deployed" in result.output + assert result.exit_code != 0 + + +def test_faas_not_running(tmp_path): + setup_brownie_project(tmp_path, switch_dir=False) + + with open(".mythx.yml", "w+") as conf_f: + conf_f.write(generate_config_file(base_path=tmp_path)) + + with patch.object( + RPCClient, "contract_exists" + ) as contract_exists_mock, patch.object( + RPCClient, "get_all_blocks" + ) as get_all_blocks_mock, patch.object( + FaasClient, "start_faas_campaign" + ) as start_faas_campaign_mock: + get_all_blocks_mock.return_value = get_test_case( + "testdata/ganache-all-blocks.json" + ) + contract_exists_mock.return_value = True + start_faas_campaign_mock.side_effect = RequestError( + f"Error starting FaaS campaign." + ) + + runner = CliRunner() + result = runner.invoke(cli, ["fuzz", "run", f"{tmp_path}/contracts"]) + + assert ( + "Error: Unable to submit the campaign to the faas. Are you sure the service is running on" + in result.output + ) + assert result.exit_code != 0 + + +def test_faas_target_config_file(tmp_path): + """Here we reuse the test_faas_not_running logic to check that the target is being read + from the config file. This is possible because the faas not running error is triggered + after the Target check. If the target was not available, a different error would be thrown + and the test would fail""" + setup_brownie_project(tmp_path, switch_dir=False) + + with open(".mythx.yml", "w+") as conf_f: + conf_f.write(generate_config_file(base_path=tmp_path)) + + with patch.object( + RPCClient, "contract_exists" + ) as contract_exists_mock, patch.object( + RPCClient, "get_all_blocks" + ) as get_all_blocks_mock, patch.object( + FaasClient, "start_faas_campaign" + ) as start_faas_campaign_mock: + get_all_blocks_mock.return_value = get_test_case( + "testdata/ganache-all-blocks.json" + ) + contract_exists_mock.return_value = True + start_faas_campaign_mock.side_effect = RequestError( + f"Error starting FaaS campaign." + ) + + runner = CliRunner() + # we call the run command without the target parameter. + result = runner.invoke(cli, ["fuzz", "run"]) + + assert ( + "Error: Unable to submit the campaign to the faas. Are you sure the service is running on" + in result.output + ) + assert result.exit_code != 0 + + +def test_rpc_not_running(tmp_path): + with open(".mythx.yml", "w+") as conf_f: + conf_f.write(generate_config_file(base_path=tmp_path)) + + with patch.object(requests, "request") as requests_mock: + requests_mock.side_effect = RequestException() + + runner = CliRunner() + result = runner.invoke(cli, ["fuzz", "run", f"{tmp_path}/contracts"]) + + assert "HTTP error calling RPC method eth_getCode with parameters" in result.output + assert result.exit_code != 0 + + +@pytest.mark.parametrize( + "keyword", + ( + "parameters", + "name", + "corpus", + "sources", + "contracts", + "address-under-test", + "source", + "fileIndex", + "sourcePaths", + "deployedSourceMap", + "mainSourceFile", + "contractName", + "bytecode", + "deployedBytecode", + "sourceMap", + "deployedSourceMap", + ), +) +def test_fuzz_run(tmp_path, keyword): + setup_brownie_project(tmp_path, switch_dir=False) + + with open(".mythx.yml", "w+") as conf_f: + conf_f.write(generate_config_file(base_path=tmp_path)) + + with patch.object( + RPCClient, "contract_exists" + ) as contract_exists_mock, patch.object( + RPCClient, "get_all_blocks" + ) as get_all_blocks_mock, patch.object( + FaasClient, "start_faas_campaign" + ) as start_faas_campaign_mock: + get_all_blocks_mock.return_value = get_test_case( + "testdata/ganache-all-blocks.json" + ) + contract_exists_mock.return_value = True + campaign_id = "560ba03a-8744-4da6-aeaa-a62568ccbf44" + start_faas_campaign_mock.return_value = campaign_id + + runner = CliRunner() + result = runner.invoke(cli, ["fuzz", "run", f"{tmp_path}/contracts"]) + + contract_exists_mock.assert_called_with( + "0x7277646075fa72737e1F6114654C5d9949a67dF2" + ) + contract_exists_mock.assert_called_once() + get_all_blocks_mock.assert_called_once() + start_faas_campaign_mock.assert_called_once() + called_with = start_faas_campaign_mock.call_args + assert ( + f"You can view campaign here: {FAAS_URL}/campaigns/{campaign_id}" + in result.output + ) + + request_payload = json.dumps(called_with[0]) + assert keyword in request_payload + assert result.exit_code == 0 + + +@pytest.mark.parametrize("keyword", ("run", "disarm", "arm", "run")) +def test_fuzz_subcommands_present(keyword): + runner = CliRunner() + + result = runner.invoke(cli, ["fuzz", "--help"]) + + assert keyword in result.output + + +@patch("mythx_cli.analyze.scribble.ScribbleMixin.instrument_solc_in_place") +def test_fuzz_arm(mock, tmp_path): + setup_brownie_project(tmp_path, switch_dir=False) + + runner = CliRunner() + result = runner.invoke(cli, ["fuzz", "arm", f"{tmp_path}/contracts/sample.sol"]) + + mock.assert_called() + mock.assert_called_with( + file_list=(f"{tmp_path}/contracts/sample.sol",), + scribble_path="scribble", + remappings=[], + solc_version=None, + ) + assert result.exit_code == 0 + + +@patch("mythx_cli.analyze.scribble.ScribbleMixin.disarm_solc_in_place") +def test_fuzz_disarm(mock, tmp_path): + setup_brownie_project(tmp_path, switch_dir=False) + + runner = CliRunner() + result = runner.invoke(cli, ["fuzz", "disarm", f"{tmp_path}/contracts/sample.sol"]) + + mock.assert_called() + mock.assert_called_with( + file_list=(f"{tmp_path}/contracts/sample.sol",), + scribble_path="scribble", + remappings=[], + solc_version=None, + ) + assert result.exit_code == 0 diff --git a/tests/testdata/hardhat-build-info-artifact.json b/tests/testdata/hardhat-build-info-artifact.json new file mode 100644 index 0000000..26fdedd --- /dev/null +++ b/tests/testdata/hardhat-build-info-artifact.json @@ -0,0 +1,35098 @@ +{ + "id": "b78e6e91d6666dbbf407d4a383cd8177", + "_format": "hh-sol-build-info-1", + "solcVersion": "0.6.12", + "solcLongVersion": "0.6.12+commit.27d51765", + "input": { + "language": "Solidity", + "sources": { + "contracts/interfaces/IMasterChef.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.6.12;\npragma experimental ABIEncoderV2;\nimport \"@boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol\";\n\ninterface IMasterChef {\n using BoringERC20 for IERC20;\n struct UserInfo {\n uint256 amount; // How many LP tokens the user has provided.\n uint256 rewardDebt; // Reward debt. See explanation below.\n }\n\n struct PoolInfo {\n IERC20 lpToken; // Address of LP token contract.\n uint256 allocPoint; // How many allocation points assigned to this pool. SUSHI to distribute per block.\n uint256 lastRewardBlock; // Last block number that SUSHI distribution occurs.\n uint256 accSushiPerShare; // Accumulated SUSHI per share, times 1e12. See below.\n }\n\n function poolInfo(uint256 pid) external view returns (IMasterChef.PoolInfo memory);\n function totalAllocPoint() external view returns (uint256);\n function deposit(uint256 _pid, uint256 _amount) external;\n}\n" + }, + "@boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\r\npragma solidity 0.6.12;\r\n\r\nimport \"../interfaces/IERC20.sol\";\r\n\r\nlibrary BoringERC20 {\r\n function safeSymbol(IERC20 token) internal view returns(string memory) {\r\n (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(0x95d89b41));\r\n return success && data.length > 0 ? abi.decode(data, (string)) : \"???\";\r\n }\r\n\r\n function safeName(IERC20 token) internal view returns(string memory) {\r\n (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(0x06fdde03));\r\n return success && data.length > 0 ? abi.decode(data, (string)) : \"???\";\r\n }\r\n\r\n function safeDecimals(IERC20 token) internal view returns (uint8) {\r\n (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(0x313ce567));\r\n return success && data.length == 32 ? abi.decode(data, (uint8)) : 18;\r\n }\r\n\r\n function safeTransfer(IERC20 token, address to, uint256 amount) internal {\r\n (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(0xa9059cbb, to, amount));\r\n require(success && (data.length == 0 || abi.decode(data, (bool))), \"BoringERC20: Transfer failed\");\r\n }\r\n\r\n function safeTransferFrom(IERC20 token, address from, address to, uint256 amount) internal {\r\n (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(0x23b872dd, from, to, amount));\r\n require(success && (data.length == 0 || abi.decode(data, (bool))), \"BoringERC20: TransferFrom failed\");\r\n }\r\n}" + }, + "contracts/MasterChefV2.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity 0.6.12;\npragma experimental ABIEncoderV2;\n\nimport \"@boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol\";\nimport \"@boringcrypto/boring-solidity/contracts/BoringBatchable.sol\";\nimport \"@boringcrypto/boring-solidity/contracts/BoringOwnable.sol\";\nimport \"./libraries/SignedSafeMath.sol\";\nimport \"./interfaces/IRewarder.sol\";\nimport \"./interfaces/IMasterChef.sol\";\n\ninterface IMigratorChef {\n // Take the current LP token address and return the new LP token address.\n // Migrator should have full access to the caller's LP token.\n function migrate(IERC20 token) external returns (IERC20);\n}\n\n/// @notice The (older) MasterChef contract gives out a constant number of SUSHI tokens per block.\n/// It is the only address with minting rights for SUSHI.\n/// The idea for this MasterChef V2 (MCV2) contract is therefore to be the owner of a dummy token\n/// that is deposited into the MasterChef V1 (MCV1) contract.\n/// The allocation point for this pool on MCV1 is the total allocation point for all pools that receive double incentives.\ncontract MasterChefV2 is BoringOwnable, BoringBatchable {\n using BoringMath for uint256;\n using BoringMath128 for uint128;\n using BoringERC20 for IERC20;\n using SignedSafeMath for int256;\n\n /// @notice Info of each MCV2 user.\n /// `amount` LP token amount the user has provided.\n /// `rewardDebt` The amount of SUSHI entitled to the user.\n struct UserInfo {\n uint256 amount;\n int256 rewardDebt;\n }\n\n /// @notice Info of each MCV2 pool.\n /// `allocPoint` The amount of allocation points assigned to the pool.\n /// Also known as the amount of SUSHI to distribute per block.\n struct PoolInfo {\n uint128 accSushiPerShare;\n uint64 lastRewardBlock;\n uint64 allocPoint;\n }\n\n /// @notice Address of MCV1 contract.\n IMasterChef public immutable MASTER_CHEF;\n /// @notice Address of SUSHI contract.\n IERC20 public immutable SUSHI;\n /// @notice The index of MCV2 master pool in MCV1.\n uint256 public immutable MASTER_PID;\n // @notice The migrator contract. It has a lot of power. Can only be set through governance (owner).\n IMigratorChef public migrator;\n\n /// @notice Info of each MCV2 pool.\n PoolInfo[] public poolInfo;\n /// @notice Address of the LP token for each MCV2 pool.\n IERC20[] public lpToken;\n /// @notice Address of each `IRewarder` contract in MCV2.\n IRewarder[] public rewarder;\n\n /// @notice Info of each user that stakes LP tokens.\n mapping (uint256 => mapping (address => UserInfo)) public userInfo;\n /// @dev Total allocation points. Must be the sum of all allocation points in all pools.\n uint256 public totalAllocPoint;\n\n uint256 private constant MASTERCHEF_SUSHI_PER_BLOCK = 1e20;\n uint256 private constant ACC_SUSHI_PRECISION = 1e12;\n\n event Deposit(address indexed user, uint256 indexed pid, uint256 amount, address indexed to);\n event Withdraw(address indexed user, uint256 indexed pid, uint256 amount, address indexed to);\n event EmergencyWithdraw(address indexed user, uint256 indexed pid, uint256 amount, address indexed to);\n event Harvest(address indexed user, uint256 indexed pid, uint256 amount);\n event LogPoolAddition(uint256 indexed pid, uint256 allocPoint, IERC20 indexed lpToken, IRewarder indexed rewarder);\n event LogSetPool(uint256 indexed pid, uint256 allocPoint, IRewarder indexed rewarder, bool overwrite);\n event LogUpdatePool(uint256 indexed pid, uint64 lastRewardBlock, uint256 lpSupply, uint256 accSushiPerShare);\n event LogInit();\n\n /// @param _MASTER_CHEF The SushiSwap MCV1 contract address.\n /// @param _sushi The SUSHI token contract address.\n /// @param _MASTER_PID The pool ID of the dummy token on the base MCV1 contract.\n constructor(IMasterChef _MASTER_CHEF, IERC20 _sushi, uint256 _MASTER_PID) public {\n MASTER_CHEF = _MASTER_CHEF;\n SUSHI = _sushi;\n MASTER_PID = _MASTER_PID;\n }\n\n /// @notice Deposits a dummy token to `MASTER_CHEF` MCV1. This is required because MCV1 holds the minting rights for SUSHI.\n /// Any balance of transaction sender in `dummyToken` is transferred.\n /// The allocation point for the pool on MCV1 is the total allocation point for all pools that receive double incentives.\n /// @param dummyToken The address of the ERC-20 token to deposit into MCV1.\n function init(IERC20 dummyToken) external {\n uint256 balance = dummyToken.balanceOf(msg.sender);\n require(balance != 0, \"MasterChefV2: Balance must exceed 0\");\n dummyToken.safeTransferFrom(msg.sender, address(this), balance);\n dummyToken.approve(address(MASTER_CHEF), balance);\n MASTER_CHEF.deposit(MASTER_PID, balance);\n emit LogInit();\n }\n\n /// @notice Returns the number of MCV2 pools.\n function poolLength() public view returns (uint256 pools) {\n pools = poolInfo.length;\n }\n\n /// @notice Add a new LP to the pool. Can only be called by the owner.\n /// DO NOT add the same LP token more than once. Rewards will be messed up if you do.\n /// @param allocPoint AP of the new pool.\n /// @param _lpToken Address of the LP ERC-20 token.\n /// @param _rewarder Address of the rewarder delegate.\n function add(uint256 allocPoint, IERC20 _lpToken, IRewarder _rewarder) public onlyOwner {\n uint256 lastRewardBlock = block.number;\n totalAllocPoint = totalAllocPoint.add(allocPoint);\n lpToken.push(_lpToken);\n rewarder.push(_rewarder);\n\n poolInfo.push(PoolInfo({\n allocPoint: allocPoint.to64(),\n lastRewardBlock: lastRewardBlock.to64(),\n accSushiPerShare: 0\n }));\n emit LogPoolAddition(lpToken.length.sub(1), allocPoint, _lpToken, _rewarder);\n }\n\n /// @notice Update the given pool's SUSHI allocation point and `IRewarder` contract. Can only be called by the owner.\n /// @param _pid The index of the pool. See `poolInfo`.\n /// @param _allocPoint New AP of the pool.\n /// @param _rewarder Address of the rewarder delegate.\n /// @param overwrite True if _rewarder should be `set`. Otherwise `_rewarder` is ignored.\n function set(uint256 _pid, uint256 _allocPoint, IRewarder _rewarder, bool overwrite) public onlyOwner {\n totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add(_allocPoint);\n poolInfo[_pid].allocPoint = _allocPoint.to64();\n if (overwrite) { rewarder[_pid] = _rewarder; }\n emit LogSetPool(_pid, _allocPoint, overwrite ? _rewarder : rewarder[_pid], overwrite);\n }\n\n /// @notice Set the `migrator` contract. Can only be called by the owner.\n /// @param _migrator The contract address to set.\n function setMigrator(IMigratorChef _migrator) public onlyOwner {\n migrator = _migrator;\n }\n\n /// @notice Migrate LP token to another LP contract through the `migrator` contract.\n /// @param _pid The index of the pool. See `poolInfo`.\n function migrate(uint256 _pid) public {\n require(address(migrator) != address(0), \"MasterChefV2: no migrator set\");\n IERC20 _lpToken = lpToken[_pid];\n uint256 bal = _lpToken.balanceOf(address(this));\n _lpToken.approve(address(migrator), bal);\n IERC20 newLpToken = migrator.migrate(_lpToken);\n require(bal == newLpToken.balanceOf(address(this)), \"MasterChefV2: migrated balance must match\");\n lpToken[_pid] = newLpToken;\n }\n\n /// @notice View function to see pending SUSHI on frontend.\n /// @param _pid The index of the pool. See `poolInfo`.\n /// @param _user Address of user.\n /// @return pending SUSHI reward for a given user.\n function pendingSushi(uint256 _pid, address _user) external view returns (uint256 pending) {\n PoolInfo memory pool = poolInfo[_pid];\n UserInfo storage user = userInfo[_pid][_user];\n uint256 accSushiPerShare = pool.accSushiPerShare;\n uint256 lpSupply = lpToken[_pid].balanceOf(address(this));\n if (block.number > pool.lastRewardBlock && lpSupply != 0) {\n uint256 blocks = block.number.sub(pool.lastRewardBlock);\n uint256 sushiReward = blocks.mul(sushiPerBlock()).mul(pool.allocPoint) / totalAllocPoint;\n accSushiPerShare = accSushiPerShare.add(sushiReward.mul(ACC_SUSHI_PRECISION) / lpSupply);\n }\n pending = int256(user.amount.mul(accSushiPerShare) / ACC_SUSHI_PRECISION).sub(user.rewardDebt).toUInt256();\n }\n\n /// @notice Update reward variables for all pools. Be careful of gas spending!\n /// @param pids Pool IDs of all to be updated. Make sure to update all active pools.\n function massUpdatePools(uint256[] calldata pids) external {\n uint256 len = pids.length;\n for (uint256 i = 0; i < len; ++i) {\n updatePool(pids[i]);\n }\n }\n\n /// @notice Calculates and returns the `amount` of SUSHI per block.\n function sushiPerBlock() public view returns (uint256 amount) {\n amount = uint256(MASTERCHEF_SUSHI_PER_BLOCK)\n .mul(MASTER_CHEF.poolInfo(MASTER_PID).allocPoint) / MASTER_CHEF.totalAllocPoint();\n }\n\n /// @notice Update reward variables of the given pool.\n /// @param pid The index of the pool. See `poolInfo`.\n /// @return pool Returns the pool that was updated.\n function updatePool(uint256 pid) public returns (PoolInfo memory pool) {\n pool = poolInfo[pid];\n if (block.number > pool.lastRewardBlock) {\n uint256 lpSupply = lpToken[pid].balanceOf(address(this));\n if (lpSupply > 0) {\n uint256 blocks = block.number.sub(pool.lastRewardBlock);\n uint256 sushiReward = blocks.mul(sushiPerBlock()).mul(pool.allocPoint) / totalAllocPoint;\n pool.accSushiPerShare = pool.accSushiPerShare.add((sushiReward.mul(ACC_SUSHI_PRECISION) / lpSupply).to128());\n }\n pool.lastRewardBlock = block.number.to64();\n poolInfo[pid] = pool;\n emit LogUpdatePool(pid, pool.lastRewardBlock, lpSupply, pool.accSushiPerShare);\n }\n }\n\n /// @notice Deposit LP tokens to MCV2 for SUSHI allocation.\n /// @param pid The index of the pool. See `poolInfo`.\n /// @param amount LP token amount to deposit.\n /// @param to The receiver of `amount` deposit benefit.\n function deposit(uint256 pid, uint256 amount, address to) public {\n PoolInfo memory pool = updatePool(pid);\n UserInfo storage user = userInfo[pid][to];\n\n // Effects\n user.amount = user.amount.add(amount);\n user.rewardDebt = user.rewardDebt.add(int256(amount.mul(pool.accSushiPerShare) / ACC_SUSHI_PRECISION));\n\n // Interactions\n IRewarder _rewarder = rewarder[pid];\n if (address(_rewarder) != address(0)) {\n _rewarder.onSushiReward(pid, to, to, 0, user.amount);\n }\n\n lpToken[pid].safeTransferFrom(msg.sender, address(this), amount);\n\n emit Deposit(msg.sender, pid, amount, to);\n }\n\n /// @notice Withdraw LP tokens from MCV2.\n /// @param pid The index of the pool. See `poolInfo`.\n /// @param amount LP token amount to withdraw.\n /// @param to Receiver of the LP tokens.\n function withdraw(uint256 pid, uint256 amount, address to) public {\n PoolInfo memory pool = updatePool(pid);\n UserInfo storage user = userInfo[pid][msg.sender];\n\n // Effects\n user.rewardDebt = user.rewardDebt.sub(int256(amount.mul(pool.accSushiPerShare) / ACC_SUSHI_PRECISION));\n user.amount = user.amount.sub(amount);\n\n // Interactions\n IRewarder _rewarder = rewarder[pid];\n if (address(_rewarder) != address(0)) {\n _rewarder.onSushiReward(pid, msg.sender, to, 0, user.amount);\n }\n \n lpToken[pid].safeTransfer(to, amount);\n\n emit Withdraw(msg.sender, pid, amount, to);\n }\n\n /// @notice Harvest proceeds for transaction sender to `to`.\n /// @param pid The index of the pool. See `poolInfo`.\n /// @param to Receiver of SUSHI rewards.\n function harvest(uint256 pid, address to) public {\n PoolInfo memory pool = updatePool(pid);\n UserInfo storage user = userInfo[pid][msg.sender];\n int256 accumulatedSushi = int256(user.amount.mul(pool.accSushiPerShare) / ACC_SUSHI_PRECISION);\n uint256 _pendingSushi = accumulatedSushi.sub(user.rewardDebt).toUInt256();\n\n // Effects\n user.rewardDebt = accumulatedSushi;\n\n // Interactions\n if (_pendingSushi != 0) {\n SUSHI.safeTransfer(to, _pendingSushi);\n }\n \n IRewarder _rewarder = rewarder[pid];\n if (address(_rewarder) != address(0)) {\n _rewarder.onSushiReward( pid, msg.sender, to, _pendingSushi, user.amount);\n }\n\n emit Harvest(msg.sender, pid, _pendingSushi);\n }\n \n /// @notice Withdraw LP tokens from MCV2 and harvest proceeds for transaction sender to `to`.\n /// @param pid The index of the pool. See `poolInfo`.\n /// @param amount LP token amount to withdraw.\n /// @param to Receiver of the LP tokens and SUSHI rewards.\n function withdrawAndHarvest(uint256 pid, uint256 amount, address to) public {\n PoolInfo memory pool = updatePool(pid);\n UserInfo storage user = userInfo[pid][msg.sender];\n int256 accumulatedSushi = int256(user.amount.mul(pool.accSushiPerShare) / ACC_SUSHI_PRECISION);\n uint256 _pendingSushi = accumulatedSushi.sub(user.rewardDebt).toUInt256();\n\n // Effects\n user.rewardDebt = accumulatedSushi.sub(int256(amount.mul(pool.accSushiPerShare) / ACC_SUSHI_PRECISION));\n user.amount = user.amount.sub(amount);\n \n // Interactions\n SUSHI.safeTransfer(to, _pendingSushi);\n\n IRewarder _rewarder = rewarder[pid];\n if (address(_rewarder) != address(0)) {\n _rewarder.onSushiReward(pid, msg.sender, to, _pendingSushi, user.amount);\n }\n\n lpToken[pid].safeTransfer(to, amount);\n\n emit Withdraw(msg.sender, pid, amount, to);\n emit Harvest(msg.sender, pid, _pendingSushi);\n }\n\n /// @notice Harvests SUSHI from `MASTER_CHEF` MCV1 and pool `MASTER_PID` to this MCV2 contract.\n function harvestFromMasterChef() public {\n MASTER_CHEF.deposit(MASTER_PID, 0);\n }\n\n /// @notice Withdraw without caring about rewards. EMERGENCY ONLY.\n /// @param pid The index of the pool. See `poolInfo`.\n /// @param to Receiver of the LP tokens.\n function emergencyWithdraw(uint256 pid, address to) public {\n UserInfo storage user = userInfo[pid][msg.sender];\n uint256 amount = user.amount;\n user.amount = 0;\n user.rewardDebt = 0;\n\n IRewarder _rewarder = rewarder[pid];\n if (address(_rewarder) != address(0)) {\n _rewarder.onSushiReward(pid, msg.sender, to, 0, 0);\n }\n\n // Note: transfer can fail or succeed if `amount` is zero.\n lpToken[pid].safeTransfer(to, amount);\n emit EmergencyWithdraw(msg.sender, pid, amount, to);\n }\n}\n" + }, + "contracts/libraries/SignedSafeMath.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity 0.6.12;\n\nlibrary SignedSafeMath {\n int256 constant private _INT256_MIN = -2**255;\n\n /**\n * @dev Returns the multiplication of two signed integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's `*` operator.\n *\n * Requirements:\n *\n * - Multiplication cannot overflow.\n */\n function mul(int256 a, int256 b) internal pure returns (int256) {\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\n // benefit is lost if 'b' is also tested.\n // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\n if (a == 0) {\n return 0;\n }\n\n require(!(a == -1 && b == _INT256_MIN), \"SignedSafeMath: multiplication overflow\");\n\n int256 c = a * b;\n require(c / a == b, \"SignedSafeMath: multiplication overflow\");\n\n return c;\n }\n\n /**\n * @dev Returns the integer division of two signed integers. Reverts on\n * division by zero. The result is rounded towards zero.\n *\n * Counterpart to Solidity's `/` operator. Note: this function uses a\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\n * uses an invalid opcode to revert (consuming all remaining gas).\n *\n * Requirements:\n *\n * - The divisor cannot be zero.\n */\n function div(int256 a, int256 b) internal pure returns (int256) {\n require(b != 0, \"SignedSafeMath: division by zero\");\n require(!(b == -1 && a == _INT256_MIN), \"SignedSafeMath: division overflow\");\n\n int256 c = a / b;\n\n return c;\n }\n\n /**\n * @dev Returns the subtraction of two signed integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's `-` operator.\n *\n * Requirements:\n *\n * - Subtraction cannot overflow.\n */\n function sub(int256 a, int256 b) internal pure returns (int256) {\n int256 c = a - b;\n require((b >= 0 && c <= a) || (b < 0 && c > a), \"SignedSafeMath: subtraction overflow\");\n\n return c;\n }\n\n /**\n * @dev Returns the addition of two signed integers, reverting on\n * overflow.\n *\n * Counterpart to Solidity's `+` operator.\n *\n * Requirements:\n *\n * - Addition cannot overflow.\n */\n function add(int256 a, int256 b) internal pure returns (int256) {\n int256 c = a + b;\n require((b >= 0 && c >= a) || (b < 0 && c < a), \"SignedSafeMath: addition overflow\");\n\n return c;\n }\n\n function toUInt256(int256 a) internal pure returns (uint256) {\n require(a >= 0, \"Integer < 0\");\n return uint256(a);\n }\n}" + }, + "contracts/interfaces/IRewarder.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity 0.6.12;\nimport \"@boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol\";\ninterface IRewarder {\n using BoringERC20 for IERC20;\n function onSushiReward(uint256 pid, address user, address recipient, uint256 sushiAmount, uint256 newLpAmount) external;\n function pendingTokens(uint256 pid, address user, uint256 sushiAmount) external returns (IERC20[] memory, uint256[] memory);\n}\n" + }, + "contracts/mocks/ComplexRewarder.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity 0.6.12;\npragma experimental ABIEncoderV2;\nimport \"../interfaces/IRewarder.sol\";\nimport \"@boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol\";\nimport \"@boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol\";\nimport \"@boringcrypto/boring-solidity/contracts/BoringOwnable.sol\";\nimport \"../MasterChefV2.sol\";\n\n/// @author @0xKeno\ncontract ComplexRewarder is IRewarder, BoringOwnable{\n using BoringMath for uint256;\n using BoringMath128 for uint128;\n using BoringERC20 for IERC20;\n\n IERC20 private immutable rewardToken;\n\n /// @notice Info of each MCV2 user.\n /// `amount` LP token amount the user has provided.\n /// `rewardDebt` The amount of SUSHI entitled to the user.\n struct UserInfo {\n uint256 amount;\n uint256 rewardDebt;\n }\n\n /// @notice Info of each MCV2 pool.\n /// `allocPoint` The amount of allocation points assigned to the pool.\n /// Also known as the amount of SUSHI to distribute per block.\n struct PoolInfo {\n uint128 accSushiPerShare;\n uint64 lastRewardBlock;\n uint64 allocPoint;\n }\n\n /// @notice Info of each pool.\n mapping (uint256 => PoolInfo) public poolInfo;\n\n uint256[] public poolIds;\n\n /// @notice Info of each user that stakes LP tokens.\n mapping (uint256 => mapping (address => UserInfo)) public userInfo;\n /// @dev Total allocation points. Must be the sum of all allocation points in all pools.\n uint256 totalAllocPoint;\n\n uint256 public tokenPerBlock;\n uint256 private constant ACC_TOKEN_PRECISION = 1e12;\n\n address private immutable MASTERCHEF_V2;\n\n event LogOnReward(address indexed user, uint256 indexed pid, uint256 amount, address indexed to);\n event LogPoolAddition(uint256 indexed pid, uint256 allocPoint);\n event LogSetPool(uint256 indexed pid, uint256 allocPoint);\n event LogUpdatePool(uint256 indexed pid, uint64 lastRewardBlock, uint256 lpSupply, uint256 accSushiPerShare);\n event LogInit();\n\n constructor (IERC20 _rewardToken, uint256 _tokenPerBlock, address _MASTERCHEF_V2) public {\n rewardToken = _rewardToken;\n tokenPerBlock = _tokenPerBlock;\n MASTERCHEF_V2 = _MASTERCHEF_V2;\n }\n\n\n function onSushiReward (uint256 pid, address _user, address to, uint256, uint256 lpToken) onlyMCV2 override external {\n PoolInfo memory pool = updatePool(pid);\n UserInfo storage user = userInfo[pid][_user];\n uint256 pending;\n if (user.amount > 0) {\n pending =\n (user.amount.mul(pool.accSushiPerShare) / ACC_TOKEN_PRECISION).sub(\n user.rewardDebt\n );\n rewardToken.safeTransfer(to, pending);\n }\n user.amount = lpToken;\n user.rewardDebt = lpToken.mul(pool.accSushiPerShare) / ACC_TOKEN_PRECISION;\n emit LogOnReward(_user, pid, pending, to);\n }\n \n function pendingTokens(uint256 pid, address user, uint256) override external returns (IERC20[] memory rewardTokens, uint256[] memory rewardAmounts) {\n IERC20[] memory _rewardTokens = new IERC20[](1);\n _rewardTokens[0] = (rewardToken);\n uint256[] memory _rewardAmounts = new uint256[](1);\n _rewardAmounts[0] = pendingToken(pid, user);\n return (_rewardTokens, _rewardAmounts);\n }\n\n modifier onlyMCV2 {\n require(\n msg.sender == MASTERCHEF_V2,\n \"Only MCV2 can call this function.\"\n );\n _;\n }\n\n /// @notice Returns the number of MCV2 pools.\n function poolLength() public view returns (uint256 pools) {\n pools = poolIds.length;\n }\n\n /// @notice Add a new LP to the pool. Can only be called by the owner.\n /// DO NOT add the same LP token more than once. Rewards will be messed up if you do.\n /// @param allocPoint AP of the new pool.\n /// @param _pid Pid on MCV2\n function add(uint256 allocPoint, uint256 _pid) public onlyOwner {\n require(poolInfo[_pid].lastRewardBlock == 0, \"Pool already exists\");\n uint256 lastRewardBlock = block.number;\n totalAllocPoint = totalAllocPoint.add(allocPoint);\n\n poolInfo[_pid] = PoolInfo({\n allocPoint: allocPoint.to64(),\n lastRewardBlock: lastRewardBlock.to64(),\n accSushiPerShare: 0\n });\n poolIds.push(_pid);\n emit LogPoolAddition(_pid, allocPoint);\n }\n\n /// @notice Update the given pool's SUSHI allocation point and `IRewarder` contract. Can only be called by the owner.\n /// @param _pid The index of the pool. See `poolInfo`.\n /// @param _allocPoint New AP of the pool.\n function set(uint256 _pid, uint256 _allocPoint) public onlyOwner {\n totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add(_allocPoint);\n poolInfo[_pid].allocPoint = _allocPoint.to64();\n emit LogSetPool(_pid, _allocPoint);\n }\n\n /// @notice View function to see pending Token\n /// @param _pid The index of the pool. See `poolInfo`.\n /// @param _user Address of user.\n /// @return pending SUSHI reward for a given user.\n function pendingToken(uint256 _pid, address _user) public view returns (uint256 pending) {\n PoolInfo memory pool = poolInfo[_pid];\n UserInfo storage user = userInfo[_pid][_user];\n uint256 accSushiPerShare = pool.accSushiPerShare;\n uint256 lpSupply = MasterChefV2(MASTERCHEF_V2).lpToken(_pid).balanceOf(MASTERCHEF_V2);\n if (block.number > pool.lastRewardBlock && lpSupply != 0) {\n uint256 blocks = block.number.sub(pool.lastRewardBlock);\n uint256 sushiReward = blocks.mul(tokenPerBlock).mul(pool.allocPoint) / totalAllocPoint;\n accSushiPerShare = accSushiPerShare.add(sushiReward.mul(ACC_TOKEN_PRECISION) / lpSupply);\n }\n pending = (user.amount.mul(accSushiPerShare) / ACC_TOKEN_PRECISION).sub(user.rewardDebt);\n }\n\n /// @notice Update reward variables for all pools. Be careful of gas spending!\n /// @param pids Pool IDs of all to be updated. Make sure to update all active pools.\n function massUpdatePools(uint256[] calldata pids) external {\n uint256 len = pids.length;\n for (uint256 i = 0; i < len; ++i) {\n updatePool(pids[i]);\n }\n }\n\n /// @notice Update reward variables of the given pool.\n /// @param pid The index of the pool. See `poolInfo`.\n /// @return pool Returns the pool that was updated.\n function updatePool(uint256 pid) public returns (PoolInfo memory pool) {\n pool = poolInfo[pid];\n if (block.number > pool.lastRewardBlock) {\n uint256 lpSupply = MasterChefV2(MASTERCHEF_V2).lpToken(pid).balanceOf(MASTERCHEF_V2);\n\n if (lpSupply > 0) {\n uint256 blocks = block.number.sub(pool.lastRewardBlock);\n uint256 sushiReward = blocks.mul(tokenPerBlock).mul(pool.allocPoint) / totalAllocPoint;\n pool.accSushiPerShare = pool.accSushiPerShare.add((sushiReward.mul(ACC_TOKEN_PRECISION) / lpSupply).to128());\n }\n pool.lastRewardBlock = block.number.to64();\n poolInfo[pid] = pool;\n emit LogUpdatePool(pid, pool.lastRewardBlock, lpSupply, pool.accSushiPerShare);\n }\n }\n\n}" + } + }, + "settings": { + "optimizer": { + "enabled": true, + "runs": 200 + }, + "outputSelection": { + "*": { + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "devdoc", + "userdoc", + "storageLayout", + "evm.gasEstimates" + ], + "": [ + "ast" + ] + } + }, + "metadata": { + "useLiteralContent": true + } + } + }, + "output": { + "contracts": { + "@boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol": { + "BoringERC20": { + "abi": [], + "devdoc": { + "kind": "dev", + "methods": {}, + "version": 1 + }, + "evm": { + "bytecode": { + "linkReferences": {}, + "object": "60566023600b82828239805160001a607314601657fe5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220c2fe6f51bba98a39f828757f181ad2e5b35badf658bc93bc2e7f7a833dda063764736f6c634300060c0033", + "opcodes": "PUSH1 0x56 PUSH1 0x23 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x16 JUMPI INVALID JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xC2 INVALID PUSH16 0x51BBA98A39F828757F181AD2E5B35BAD 0xF6 PC 0xBC SWAP4 0xBC 0x2E PUSH32 0x7A833DDA063764736F6C634300060C0033000000000000000000000000000000 ", + "sourceMap": "105:1493:3:-:0;;;;;;;;;;;;;;;;;;;;;;;;;" + }, + "deployedBytecode": { + "immutableReferences": {}, + "linkReferences": {}, + "object": "73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220c2fe6f51bba98a39f828757f181ad2e5b35badf658bc93bc2e7f7a833dda063764736f6c634300060c0033", + "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xC2 INVALID PUSH16 0x51BBA98A39F828757F181AD2E5B35BAD 0xF6 PC 0xBC SWAP4 0xBC 0x2E PUSH32 0x7A833DDA063764736F6C634300060C0033000000000000000000000000000000 ", + "sourceMap": "105:1493:3:-:0;;;;;;;;" + }, + "gasEstimates": { + "creation": { + "codeDepositCost": "17200", + "executionCost": "97", + "totalCost": "17297" + }, + "internal": { + "safeDecimals(contract IERC20)": "infinite", + "safeName(contract IERC20)": "infinite", + "safeSymbol(contract IERC20)": "infinite", + "safeTransfer(contract IERC20,address,uint256)": "infinite", + "safeTransferFrom(contract IERC20,address,address,uint256)": "infinite" + } + }, + "methodIdentifiers": {} + }, + "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol\":\"BoringERC20\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@boringcrypto/boring-solidity/contracts/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\npragma solidity 0.6.12;\\r\\n\\r\\ninterface IERC20 {\\r\\n function totalSupply() external view returns (uint256);\\r\\n function balanceOf(address account) external view returns (uint256);\\r\\n function allowance(address owner, address spender) external view returns (uint256);\\r\\n function approve(address spender, uint256 amount) external returns (bool);\\r\\n event Transfer(address indexed from, address indexed to, uint256 value);\\r\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\r\\n\\r\\n // EIP 2612\\r\\n function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;\\r\\n}\",\"keccak256\":\"0x8004f86e4536cca55b8eeb2621fe18e1ee57d779396ddef50bce5bf70fb59867\",\"license\":\"MIT\"},\"@boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\r\\npragma solidity 0.6.12;\\r\\n\\r\\nimport \\\"../interfaces/IERC20.sol\\\";\\r\\n\\r\\nlibrary BoringERC20 {\\r\\n function safeSymbol(IERC20 token) internal view returns(string memory) {\\r\\n (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(0x95d89b41));\\r\\n return success && data.length > 0 ? abi.decode(data, (string)) : \\\"???\\\";\\r\\n }\\r\\n\\r\\n function safeName(IERC20 token) internal view returns(string memory) {\\r\\n (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(0x06fdde03));\\r\\n return success && data.length > 0 ? abi.decode(data, (string)) : \\\"???\\\";\\r\\n }\\r\\n\\r\\n function safeDecimals(IERC20 token) internal view returns (uint8) {\\r\\n (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(0x313ce567));\\r\\n return success && data.length == 32 ? abi.decode(data, (uint8)) : 18;\\r\\n }\\r\\n\\r\\n function safeTransfer(IERC20 token, address to, uint256 amount) internal {\\r\\n (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(0xa9059cbb, to, amount));\\r\\n require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: Transfer failed\\\");\\r\\n }\\r\\n\\r\\n function safeTransferFrom(IERC20 token, address from, address to, uint256 amount) internal {\\r\\n (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(0x23b872dd, from, to, amount));\\r\\n require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: TransferFrom failed\\\");\\r\\n }\\r\\n}\",\"keccak256\":\"0x69f1ccf716991e5d6d64dc0e3bc3828fd1990bc18400d680b1aa1960675daaaa\",\"license\":\"UNLICENSED\"}},\"version\":1}", + "storageLayout": { + "storage": [], + "types": null + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + } + }, + "contracts/MasterChefV2.sol": { + "IMigratorChef": { + "abi": [ + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "token", + "type": "address" + } + ], + "name": "migrate", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "devdoc": { + "kind": "dev", + "methods": {}, + "version": 1 + }, + "evm": { + "bytecode": { + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "gasEstimates": null, + "methodIdentifiers": { + "migrate(address)": "ce5494bb" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"migrate\",\"outputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/MasterChefV2.sol\":\"IMigratorChef\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@boringcrypto/boring-solidity/contracts/BoringBatchable.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\r\\n// Audit on 5-Jan-2021 by Keno and BoringCrypto\\r\\n\\r\\n// P1 - P3: OK\\r\\npragma solidity 0.6.12;\\r\\npragma experimental ABIEncoderV2;\\r\\n// solhint-disable avoid-low-level-calls\\r\\n\\r\\nimport \\\"./libraries/BoringERC20.sol\\\";\\r\\n\\r\\n// T1 - T4: OK\\r\\ncontract BaseBoringBatchable {\\r\\n function _getRevertMsg(bytes memory _returnData) internal pure returns (string memory) {\\r\\n // If the _res length is less than 68, then the transaction failed silently (without a revert message)\\r\\n if (_returnData.length < 68) return \\\"Transaction reverted silently\\\";\\r\\n\\r\\n assembly {\\r\\n // Slice the sighash.\\r\\n _returnData := add(_returnData, 0x04)\\r\\n }\\r\\n return abi.decode(_returnData, (string)); // All that remains is the revert string\\r\\n } \\r\\n \\r\\n // F3 - F9: OK\\r\\n // F1: External is ok here because this is the batch function, adding it to a batch makes no sense\\r\\n // F2: Calls in the batch may be payable, delegatecall operates in the same context, so each call in the batch has access to msg.value\\r\\n // C1 - C21: OK\\r\\n // C3: The length of the loop is fully under user control, so can't be exploited\\r\\n // C7: Delegatecall is only used on the same contract, so it's safe\\r\\n function batch(bytes[] calldata calls, bool revertOnFail) external payable returns(bool[] memory successes, bytes[] memory results) {\\r\\n // Interactions\\r\\n successes = new bool[](calls.length);\\r\\n results = new bytes[](calls.length);\\r\\n for (uint256 i = 0; i < calls.length; i++) {\\r\\n (bool success, bytes memory result) = address(this).delegatecall(calls[i]);\\r\\n require(success || !revertOnFail, _getRevertMsg(result));\\r\\n successes[i] = success;\\r\\n results[i] = result;\\r\\n }\\r\\n }\\r\\n}\\r\\n\\r\\n// T1 - T4: OK\\r\\ncontract BoringBatchable is BaseBoringBatchable {\\r\\n // F1 - F9: OK\\r\\n // F6: Parameters can be used front-run the permit and the user's permit will fail (due to nonce or other revert)\\r\\n // if part of a batch this could be used to grief once as the second call would not need the permit\\r\\n // C1 - C21: OK\\r\\n function permitToken(IERC20 token, address from, address to, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public {\\r\\n // Interactions\\r\\n // X1 - X5\\r\\n token.permit(from, to, amount, deadline, v, r, s);\\r\\n }\\r\\n}\",\"keccak256\":\"0xe0b0316b015447ee28c6b7d96c4347b410a66e5d26e922ef3bcccc22f3b4d590\",\"license\":\"UNLICENSED\"},\"@boringcrypto/boring-solidity/contracts/BoringOwnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\n// Audit on 5-Jan-2021 by Keno and BoringCrypto\\r\\n\\r\\n// P1 - P3: OK\\r\\npragma solidity 0.6.12;\\r\\n\\r\\n// Source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol + Claimable.sol\\r\\n// Edited by BoringCrypto\\r\\n\\r\\n// T1 - T4: OK\\r\\ncontract BoringOwnableData {\\r\\n // V1 - V5: OK\\r\\n address public owner;\\r\\n // V1 - V5: OK\\r\\n address public pendingOwner;\\r\\n}\\r\\n\\r\\n// T1 - T4: OK\\r\\ncontract BoringOwnable is BoringOwnableData {\\r\\n // E1: OK\\r\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\r\\n\\r\\n constructor () public {\\r\\n owner = msg.sender;\\r\\n emit OwnershipTransferred(address(0), msg.sender);\\r\\n }\\r\\n\\r\\n // F1 - F9: OK\\r\\n // C1 - C21: OK\\r\\n function transferOwnership(address newOwner, bool direct, bool renounce) public onlyOwner {\\r\\n if (direct) {\\r\\n // Checks\\r\\n require(newOwner != address(0) || renounce, \\\"Ownable: zero address\\\");\\r\\n\\r\\n // Effects\\r\\n emit OwnershipTransferred(owner, newOwner);\\r\\n owner = newOwner;\\r\\n pendingOwner = address(0);\\r\\n } else {\\r\\n // Effects\\r\\n pendingOwner = newOwner;\\r\\n }\\r\\n }\\r\\n\\r\\n // F1 - F9: OK\\r\\n // C1 - C21: OK\\r\\n function claimOwnership() public {\\r\\n address _pendingOwner = pendingOwner;\\r\\n \\r\\n // Checks\\r\\n require(msg.sender == _pendingOwner, \\\"Ownable: caller != pending owner\\\");\\r\\n\\r\\n // Effects\\r\\n emit OwnershipTransferred(owner, _pendingOwner);\\r\\n owner = _pendingOwner;\\r\\n pendingOwner = address(0);\\r\\n }\\r\\n\\r\\n // M1 - M5: OK\\r\\n // C1 - C21: OK\\r\\n modifier onlyOwner() {\\r\\n require(msg.sender == owner, \\\"Ownable: caller is not the owner\\\");\\r\\n _;\\r\\n }\\r\\n}\",\"keccak256\":\"0xfafb586b248c1c697227f5745397562cfe5be2f04e19fb80fc79fc94e3afaba1\",\"license\":\"MIT\"},\"@boringcrypto/boring-solidity/contracts/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\npragma solidity 0.6.12;\\r\\n\\r\\ninterface IERC20 {\\r\\n function totalSupply() external view returns (uint256);\\r\\n function balanceOf(address account) external view returns (uint256);\\r\\n function allowance(address owner, address spender) external view returns (uint256);\\r\\n function approve(address spender, uint256 amount) external returns (bool);\\r\\n event Transfer(address indexed from, address indexed to, uint256 value);\\r\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\r\\n\\r\\n // EIP 2612\\r\\n function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;\\r\\n}\",\"keccak256\":\"0x8004f86e4536cca55b8eeb2621fe18e1ee57d779396ddef50bce5bf70fb59867\",\"license\":\"MIT\"},\"@boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\r\\npragma solidity 0.6.12;\\r\\n\\r\\nimport \\\"../interfaces/IERC20.sol\\\";\\r\\n\\r\\nlibrary BoringERC20 {\\r\\n function safeSymbol(IERC20 token) internal view returns(string memory) {\\r\\n (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(0x95d89b41));\\r\\n return success && data.length > 0 ? abi.decode(data, (string)) : \\\"???\\\";\\r\\n }\\r\\n\\r\\n function safeName(IERC20 token) internal view returns(string memory) {\\r\\n (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(0x06fdde03));\\r\\n return success && data.length > 0 ? abi.decode(data, (string)) : \\\"???\\\";\\r\\n }\\r\\n\\r\\n function safeDecimals(IERC20 token) internal view returns (uint8) {\\r\\n (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(0x313ce567));\\r\\n return success && data.length == 32 ? abi.decode(data, (uint8)) : 18;\\r\\n }\\r\\n\\r\\n function safeTransfer(IERC20 token, address to, uint256 amount) internal {\\r\\n (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(0xa9059cbb, to, amount));\\r\\n require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: Transfer failed\\\");\\r\\n }\\r\\n\\r\\n function safeTransferFrom(IERC20 token, address from, address to, uint256 amount) internal {\\r\\n (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(0x23b872dd, from, to, amount));\\r\\n require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: TransferFrom failed\\\");\\r\\n }\\r\\n}\",\"keccak256\":\"0x69f1ccf716991e5d6d64dc0e3bc3828fd1990bc18400d680b1aa1960675daaaa\",\"license\":\"UNLICENSED\"},\"@boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\npragma solidity 0.6.12;\\r\\n// a library for performing overflow-safe math, updated with awesomeness from of DappHub (https://github.com/dapphub/ds-math)\\r\\nlibrary BoringMath {\\r\\n function add(uint256 a, uint256 b) internal pure returns (uint256 c) {require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");}\\r\\n function sub(uint256 a, uint256 b) internal pure returns (uint256 c) {require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");}\\r\\n function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {require(b == 0 || (c = a * b)/b == a, \\\"BoringMath: Mul Overflow\\\");}\\r\\n function to128(uint256 a) internal pure returns (uint128 c) {\\r\\n require(a <= uint128(-1), \\\"BoringMath: uint128 Overflow\\\");\\r\\n c = uint128(a);\\r\\n }\\r\\n function to64(uint256 a) internal pure returns (uint64 c) {\\r\\n require(a <= uint64(-1), \\\"BoringMath: uint64 Overflow\\\");\\r\\n c = uint64(a);\\r\\n }\\r\\n function to32(uint256 a) internal pure returns (uint32 c) {\\r\\n require(a <= uint32(-1), \\\"BoringMath: uint32 Overflow\\\");\\r\\n c = uint32(a);\\r\\n }\\r\\n}\\r\\n\\r\\nlibrary BoringMath128 {\\r\\n function add(uint128 a, uint128 b) internal pure returns (uint128 c) {require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");}\\r\\n function sub(uint128 a, uint128 b) internal pure returns (uint128 c) {require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");}\\r\\n}\\r\\n\\r\\nlibrary BoringMath64 {\\r\\n function add(uint64 a, uint64 b) internal pure returns (uint64 c) {require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");}\\r\\n function sub(uint64 a, uint64 b) internal pure returns (uint64 c) {require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");}\\r\\n}\\r\\n\\r\\nlibrary BoringMath32 {\\r\\n function add(uint32 a, uint32 b) internal pure returns (uint32 c) {require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");}\\r\\n function sub(uint32 a, uint32 b) internal pure returns (uint32 c) {require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");}\\r\\n}\",\"keccak256\":\"0x2d0e99483c5618251d4b52e8551918253bf044c63e0d09a2f1f652671f9ff762\",\"license\":\"MIT\"},\"contracts/MasterChefV2.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\nimport \\\"@boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol\\\";\\nimport \\\"@boringcrypto/boring-solidity/contracts/BoringBatchable.sol\\\";\\nimport \\\"@boringcrypto/boring-solidity/contracts/BoringOwnable.sol\\\";\\nimport \\\"./libraries/SignedSafeMath.sol\\\";\\nimport \\\"./interfaces/IRewarder.sol\\\";\\nimport \\\"./interfaces/IMasterChef.sol\\\";\\n\\ninterface IMigratorChef {\\n // Take the current LP token address and return the new LP token address.\\n // Migrator should have full access to the caller's LP token.\\n function migrate(IERC20 token) external returns (IERC20);\\n}\\n\\n/// @notice The (older) MasterChef contract gives out a constant number of SUSHI tokens per block.\\n/// It is the only address with minting rights for SUSHI.\\n/// The idea for this MasterChef V2 (MCV2) contract is therefore to be the owner of a dummy token\\n/// that is deposited into the MasterChef V1 (MCV1) contract.\\n/// The allocation point for this pool on MCV1 is the total allocation point for all pools that receive double incentives.\\ncontract MasterChefV2 is BoringOwnable, BoringBatchable {\\n using BoringMath for uint256;\\n using BoringMath128 for uint128;\\n using BoringERC20 for IERC20;\\n using SignedSafeMath for int256;\\n\\n /// @notice Info of each MCV2 user.\\n /// `amount` LP token amount the user has provided.\\n /// `rewardDebt` The amount of SUSHI entitled to the user.\\n struct UserInfo {\\n uint256 amount;\\n int256 rewardDebt;\\n }\\n\\n /// @notice Info of each MCV2 pool.\\n /// `allocPoint` The amount of allocation points assigned to the pool.\\n /// Also known as the amount of SUSHI to distribute per block.\\n struct PoolInfo {\\n uint128 accSushiPerShare;\\n uint64 lastRewardBlock;\\n uint64 allocPoint;\\n }\\n\\n /// @notice Address of MCV1 contract.\\n IMasterChef public immutable MASTER_CHEF;\\n /// @notice Address of SUSHI contract.\\n IERC20 public immutable SUSHI;\\n /// @notice The index of MCV2 master pool in MCV1.\\n uint256 public immutable MASTER_PID;\\n // @notice The migrator contract. It has a lot of power. Can only be set through governance (owner).\\n IMigratorChef public migrator;\\n\\n /// @notice Info of each MCV2 pool.\\n PoolInfo[] public poolInfo;\\n /// @notice Address of the LP token for each MCV2 pool.\\n IERC20[] public lpToken;\\n /// @notice Address of each `IRewarder` contract in MCV2.\\n IRewarder[] public rewarder;\\n\\n /// @notice Info of each user that stakes LP tokens.\\n mapping (uint256 => mapping (address => UserInfo)) public userInfo;\\n /// @dev Total allocation points. Must be the sum of all allocation points in all pools.\\n uint256 public totalAllocPoint;\\n\\n uint256 private constant MASTERCHEF_SUSHI_PER_BLOCK = 1e20;\\n uint256 private constant ACC_SUSHI_PRECISION = 1e12;\\n\\n event Deposit(address indexed user, uint256 indexed pid, uint256 amount, address indexed to);\\n event Withdraw(address indexed user, uint256 indexed pid, uint256 amount, address indexed to);\\n event EmergencyWithdraw(address indexed user, uint256 indexed pid, uint256 amount, address indexed to);\\n event Harvest(address indexed user, uint256 indexed pid, uint256 amount);\\n event LogPoolAddition(uint256 indexed pid, uint256 allocPoint, IERC20 indexed lpToken, IRewarder indexed rewarder);\\n event LogSetPool(uint256 indexed pid, uint256 allocPoint, IRewarder indexed rewarder, bool overwrite);\\n event LogUpdatePool(uint256 indexed pid, uint64 lastRewardBlock, uint256 lpSupply, uint256 accSushiPerShare);\\n event LogInit();\\n\\n /// @param _MASTER_CHEF The SushiSwap MCV1 contract address.\\n /// @param _sushi The SUSHI token contract address.\\n /// @param _MASTER_PID The pool ID of the dummy token on the base MCV1 contract.\\n constructor(IMasterChef _MASTER_CHEF, IERC20 _sushi, uint256 _MASTER_PID) public {\\n MASTER_CHEF = _MASTER_CHEF;\\n SUSHI = _sushi;\\n MASTER_PID = _MASTER_PID;\\n }\\n\\n /// @notice Deposits a dummy token to `MASTER_CHEF` MCV1. This is required because MCV1 holds the minting rights for SUSHI.\\n /// Any balance of transaction sender in `dummyToken` is transferred.\\n /// The allocation point for the pool on MCV1 is the total allocation point for all pools that receive double incentives.\\n /// @param dummyToken The address of the ERC-20 token to deposit into MCV1.\\n function init(IERC20 dummyToken) external {\\n uint256 balance = dummyToken.balanceOf(msg.sender);\\n require(balance != 0, \\\"MasterChefV2: Balance must exceed 0\\\");\\n dummyToken.safeTransferFrom(msg.sender, address(this), balance);\\n dummyToken.approve(address(MASTER_CHEF), balance);\\n MASTER_CHEF.deposit(MASTER_PID, balance);\\n emit LogInit();\\n }\\n\\n /// @notice Returns the number of MCV2 pools.\\n function poolLength() public view returns (uint256 pools) {\\n pools = poolInfo.length;\\n }\\n\\n /// @notice Add a new LP to the pool. Can only be called by the owner.\\n /// DO NOT add the same LP token more than once. Rewards will be messed up if you do.\\n /// @param allocPoint AP of the new pool.\\n /// @param _lpToken Address of the LP ERC-20 token.\\n /// @param _rewarder Address of the rewarder delegate.\\n function add(uint256 allocPoint, IERC20 _lpToken, IRewarder _rewarder) public onlyOwner {\\n uint256 lastRewardBlock = block.number;\\n totalAllocPoint = totalAllocPoint.add(allocPoint);\\n lpToken.push(_lpToken);\\n rewarder.push(_rewarder);\\n\\n poolInfo.push(PoolInfo({\\n allocPoint: allocPoint.to64(),\\n lastRewardBlock: lastRewardBlock.to64(),\\n accSushiPerShare: 0\\n }));\\n emit LogPoolAddition(lpToken.length.sub(1), allocPoint, _lpToken, _rewarder);\\n }\\n\\n /// @notice Update the given pool's SUSHI allocation point and `IRewarder` contract. Can only be called by the owner.\\n /// @param _pid The index of the pool. See `poolInfo`.\\n /// @param _allocPoint New AP of the pool.\\n /// @param _rewarder Address of the rewarder delegate.\\n /// @param overwrite True if _rewarder should be `set`. Otherwise `_rewarder` is ignored.\\n function set(uint256 _pid, uint256 _allocPoint, IRewarder _rewarder, bool overwrite) public onlyOwner {\\n totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add(_allocPoint);\\n poolInfo[_pid].allocPoint = _allocPoint.to64();\\n if (overwrite) { rewarder[_pid] = _rewarder; }\\n emit LogSetPool(_pid, _allocPoint, overwrite ? _rewarder : rewarder[_pid], overwrite);\\n }\\n\\n /// @notice Set the `migrator` contract. Can only be called by the owner.\\n /// @param _migrator The contract address to set.\\n function setMigrator(IMigratorChef _migrator) public onlyOwner {\\n migrator = _migrator;\\n }\\n\\n /// @notice Migrate LP token to another LP contract through the `migrator` contract.\\n /// @param _pid The index of the pool. See `poolInfo`.\\n function migrate(uint256 _pid) public {\\n require(address(migrator) != address(0), \\\"MasterChefV2: no migrator set\\\");\\n IERC20 _lpToken = lpToken[_pid];\\n uint256 bal = _lpToken.balanceOf(address(this));\\n _lpToken.approve(address(migrator), bal);\\n IERC20 newLpToken = migrator.migrate(_lpToken);\\n require(bal == newLpToken.balanceOf(address(this)), \\\"MasterChefV2: migrated balance must match\\\");\\n lpToken[_pid] = newLpToken;\\n }\\n\\n /// @notice View function to see pending SUSHI on frontend.\\n /// @param _pid The index of the pool. See `poolInfo`.\\n /// @param _user Address of user.\\n /// @return pending SUSHI reward for a given user.\\n function pendingSushi(uint256 _pid, address _user) external view returns (uint256 pending) {\\n PoolInfo memory pool = poolInfo[_pid];\\n UserInfo storage user = userInfo[_pid][_user];\\n uint256 accSushiPerShare = pool.accSushiPerShare;\\n uint256 lpSupply = lpToken[_pid].balanceOf(address(this));\\n if (block.number > pool.lastRewardBlock && lpSupply != 0) {\\n uint256 blocks = block.number.sub(pool.lastRewardBlock);\\n uint256 sushiReward = blocks.mul(sushiPerBlock()).mul(pool.allocPoint) / totalAllocPoint;\\n accSushiPerShare = accSushiPerShare.add(sushiReward.mul(ACC_SUSHI_PRECISION) / lpSupply);\\n }\\n pending = int256(user.amount.mul(accSushiPerShare) / ACC_SUSHI_PRECISION).sub(user.rewardDebt).toUInt256();\\n }\\n\\n /// @notice Update reward variables for all pools. Be careful of gas spending!\\n /// @param pids Pool IDs of all to be updated. Make sure to update all active pools.\\n function massUpdatePools(uint256[] calldata pids) external {\\n uint256 len = pids.length;\\n for (uint256 i = 0; i < len; ++i) {\\n updatePool(pids[i]);\\n }\\n }\\n\\n /// @notice Calculates and returns the `amount` of SUSHI per block.\\n function sushiPerBlock() public view returns (uint256 amount) {\\n amount = uint256(MASTERCHEF_SUSHI_PER_BLOCK)\\n .mul(MASTER_CHEF.poolInfo(MASTER_PID).allocPoint) / MASTER_CHEF.totalAllocPoint();\\n }\\n\\n /// @notice Update reward variables of the given pool.\\n /// @param pid The index of the pool. See `poolInfo`.\\n /// @return pool Returns the pool that was updated.\\n function updatePool(uint256 pid) public returns (PoolInfo memory pool) {\\n pool = poolInfo[pid];\\n if (block.number > pool.lastRewardBlock) {\\n uint256 lpSupply = lpToken[pid].balanceOf(address(this));\\n if (lpSupply > 0) {\\n uint256 blocks = block.number.sub(pool.lastRewardBlock);\\n uint256 sushiReward = blocks.mul(sushiPerBlock()).mul(pool.allocPoint) / totalAllocPoint;\\n pool.accSushiPerShare = pool.accSushiPerShare.add((sushiReward.mul(ACC_SUSHI_PRECISION) / lpSupply).to128());\\n }\\n pool.lastRewardBlock = block.number.to64();\\n poolInfo[pid] = pool;\\n emit LogUpdatePool(pid, pool.lastRewardBlock, lpSupply, pool.accSushiPerShare);\\n }\\n }\\n\\n /// @notice Deposit LP tokens to MCV2 for SUSHI allocation.\\n /// @param pid The index of the pool. See `poolInfo`.\\n /// @param amount LP token amount to deposit.\\n /// @param to The receiver of `amount` deposit benefit.\\n function deposit(uint256 pid, uint256 amount, address to) public {\\n PoolInfo memory pool = updatePool(pid);\\n UserInfo storage user = userInfo[pid][to];\\n\\n // Effects\\n user.amount = user.amount.add(amount);\\n user.rewardDebt = user.rewardDebt.add(int256(amount.mul(pool.accSushiPerShare) / ACC_SUSHI_PRECISION));\\n\\n // Interactions\\n IRewarder _rewarder = rewarder[pid];\\n if (address(_rewarder) != address(0)) {\\n _rewarder.onSushiReward(pid, to, to, 0, user.amount);\\n }\\n\\n lpToken[pid].safeTransferFrom(msg.sender, address(this), amount);\\n\\n emit Deposit(msg.sender, pid, amount, to);\\n }\\n\\n /// @notice Withdraw LP tokens from MCV2.\\n /// @param pid The index of the pool. See `poolInfo`.\\n /// @param amount LP token amount to withdraw.\\n /// @param to Receiver of the LP tokens.\\n function withdraw(uint256 pid, uint256 amount, address to) public {\\n PoolInfo memory pool = updatePool(pid);\\n UserInfo storage user = userInfo[pid][msg.sender];\\n\\n // Effects\\n user.rewardDebt = user.rewardDebt.sub(int256(amount.mul(pool.accSushiPerShare) / ACC_SUSHI_PRECISION));\\n user.amount = user.amount.sub(amount);\\n\\n // Interactions\\n IRewarder _rewarder = rewarder[pid];\\n if (address(_rewarder) != address(0)) {\\n _rewarder.onSushiReward(pid, msg.sender, to, 0, user.amount);\\n }\\n \\n lpToken[pid].safeTransfer(to, amount);\\n\\n emit Withdraw(msg.sender, pid, amount, to);\\n }\\n\\n /// @notice Harvest proceeds for transaction sender to `to`.\\n /// @param pid The index of the pool. See `poolInfo`.\\n /// @param to Receiver of SUSHI rewards.\\n function harvest(uint256 pid, address to) public {\\n PoolInfo memory pool = updatePool(pid);\\n UserInfo storage user = userInfo[pid][msg.sender];\\n int256 accumulatedSushi = int256(user.amount.mul(pool.accSushiPerShare) / ACC_SUSHI_PRECISION);\\n uint256 _pendingSushi = accumulatedSushi.sub(user.rewardDebt).toUInt256();\\n\\n // Effects\\n user.rewardDebt = accumulatedSushi;\\n\\n // Interactions\\n if (_pendingSushi != 0) {\\n SUSHI.safeTransfer(to, _pendingSushi);\\n }\\n \\n IRewarder _rewarder = rewarder[pid];\\n if (address(_rewarder) != address(0)) {\\n _rewarder.onSushiReward( pid, msg.sender, to, _pendingSushi, user.amount);\\n }\\n\\n emit Harvest(msg.sender, pid, _pendingSushi);\\n }\\n \\n /// @notice Withdraw LP tokens from MCV2 and harvest proceeds for transaction sender to `to`.\\n /// @param pid The index of the pool. See `poolInfo`.\\n /// @param amount LP token amount to withdraw.\\n /// @param to Receiver of the LP tokens and SUSHI rewards.\\n function withdrawAndHarvest(uint256 pid, uint256 amount, address to) public {\\n PoolInfo memory pool = updatePool(pid);\\n UserInfo storage user = userInfo[pid][msg.sender];\\n int256 accumulatedSushi = int256(user.amount.mul(pool.accSushiPerShare) / ACC_SUSHI_PRECISION);\\n uint256 _pendingSushi = accumulatedSushi.sub(user.rewardDebt).toUInt256();\\n\\n // Effects\\n user.rewardDebt = accumulatedSushi.sub(int256(amount.mul(pool.accSushiPerShare) / ACC_SUSHI_PRECISION));\\n user.amount = user.amount.sub(amount);\\n \\n // Interactions\\n SUSHI.safeTransfer(to, _pendingSushi);\\n\\n IRewarder _rewarder = rewarder[pid];\\n if (address(_rewarder) != address(0)) {\\n _rewarder.onSushiReward(pid, msg.sender, to, _pendingSushi, user.amount);\\n }\\n\\n lpToken[pid].safeTransfer(to, amount);\\n\\n emit Withdraw(msg.sender, pid, amount, to);\\n emit Harvest(msg.sender, pid, _pendingSushi);\\n }\\n\\n /// @notice Harvests SUSHI from `MASTER_CHEF` MCV1 and pool `MASTER_PID` to this MCV2 contract.\\n function harvestFromMasterChef() public {\\n MASTER_CHEF.deposit(MASTER_PID, 0);\\n }\\n\\n /// @notice Withdraw without caring about rewards. EMERGENCY ONLY.\\n /// @param pid The index of the pool. See `poolInfo`.\\n /// @param to Receiver of the LP tokens.\\n function emergencyWithdraw(uint256 pid, address to) public {\\n UserInfo storage user = userInfo[pid][msg.sender];\\n uint256 amount = user.amount;\\n user.amount = 0;\\n user.rewardDebt = 0;\\n\\n IRewarder _rewarder = rewarder[pid];\\n if (address(_rewarder) != address(0)) {\\n _rewarder.onSushiReward(pid, msg.sender, to, 0, 0);\\n }\\n\\n // Note: transfer can fail or succeed if `amount` is zero.\\n lpToken[pid].safeTransfer(to, amount);\\n emit EmergencyWithdraw(msg.sender, pid, amount, to);\\n }\\n}\\n\",\"keccak256\":\"0x2048c5e7b174e2f8f931045df32b1d56f09f488cfac3c87632b9730e0aba9bc3\",\"license\":\"MIT\"},\"contracts/interfaces/IMasterChef.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\nimport \\\"@boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol\\\";\\n\\ninterface IMasterChef {\\n using BoringERC20 for IERC20;\\n struct UserInfo {\\n uint256 amount; // How many LP tokens the user has provided.\\n uint256 rewardDebt; // Reward debt. See explanation below.\\n }\\n\\n struct PoolInfo {\\n IERC20 lpToken; // Address of LP token contract.\\n uint256 allocPoint; // How many allocation points assigned to this pool. SUSHI to distribute per block.\\n uint256 lastRewardBlock; // Last block number that SUSHI distribution occurs.\\n uint256 accSushiPerShare; // Accumulated SUSHI per share, times 1e12. See below.\\n }\\n\\n function poolInfo(uint256 pid) external view returns (IMasterChef.PoolInfo memory);\\n function totalAllocPoint() external view returns (uint256);\\n function deposit(uint256 _pid, uint256 _amount) external;\\n}\\n\",\"keccak256\":\"0xbbb2138d7b8be86b5d0bed347ab7f6d2d3e66043393abc882ad37a75fdd860d3\",\"license\":\"MIT\"},\"contracts/interfaces/IRewarder.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.6.12;\\nimport \\\"@boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol\\\";\\ninterface IRewarder {\\n using BoringERC20 for IERC20;\\n function onSushiReward(uint256 pid, address user, address recipient, uint256 sushiAmount, uint256 newLpAmount) external;\\n function pendingTokens(uint256 pid, address user, uint256 sushiAmount) external returns (IERC20[] memory, uint256[] memory);\\n}\\n\",\"keccak256\":\"0xf9fa549b5fe5d156c908a3ca612b1acd219666dbadc195d9bea4dd34d3cec94a\",\"license\":\"MIT\"},\"contracts/libraries/SignedSafeMath.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.6.12;\\n\\nlibrary SignedSafeMath {\\n int256 constant private _INT256_MIN = -2**255;\\n\\n /**\\n * @dev Returns the multiplication of two signed integers, reverting on\\n * overflow.\\n *\\n * Counterpart to Solidity's `*` operator.\\n *\\n * Requirements:\\n *\\n * - Multiplication cannot overflow.\\n */\\n function mul(int256 a, int256 b) internal pure returns (int256) {\\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n // benefit is lost if 'b' is also tested.\\n // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n if (a == 0) {\\n return 0;\\n }\\n\\n require(!(a == -1 && b == _INT256_MIN), \\\"SignedSafeMath: multiplication overflow\\\");\\n\\n int256 c = a * b;\\n require(c / a == b, \\\"SignedSafeMath: multiplication overflow\\\");\\n\\n return c;\\n }\\n\\n /**\\n * @dev Returns the integer division of two signed integers. Reverts on\\n * division by zero. The result is rounded towards zero.\\n *\\n * Counterpart to Solidity's `/` operator. Note: this function uses a\\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n * uses an invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function div(int256 a, int256 b) internal pure returns (int256) {\\n require(b != 0, \\\"SignedSafeMath: division by zero\\\");\\n require(!(b == -1 && a == _INT256_MIN), \\\"SignedSafeMath: division overflow\\\");\\n\\n int256 c = a / b;\\n\\n return c;\\n }\\n\\n /**\\n * @dev Returns the subtraction of two signed integers, reverting on\\n * overflow.\\n *\\n * Counterpart to Solidity's `-` operator.\\n *\\n * Requirements:\\n *\\n * - Subtraction cannot overflow.\\n */\\n function sub(int256 a, int256 b) internal pure returns (int256) {\\n int256 c = a - b;\\n require((b >= 0 && c <= a) || (b < 0 && c > a), \\\"SignedSafeMath: subtraction overflow\\\");\\n\\n return c;\\n }\\n\\n /**\\n * @dev Returns the addition of two signed integers, reverting on\\n * overflow.\\n *\\n * Counterpart to Solidity's `+` operator.\\n *\\n * Requirements:\\n *\\n * - Addition cannot overflow.\\n */\\n function add(int256 a, int256 b) internal pure returns (int256) {\\n int256 c = a + b;\\n require((b >= 0 && c >= a) || (b < 0 && c < a), \\\"SignedSafeMath: addition overflow\\\");\\n\\n return c;\\n }\\n\\n function toUInt256(int256 a) internal pure returns (uint256) {\\n require(a >= 0, \\\"Integer < 0\\\");\\n return uint256(a);\\n }\\n}\",\"keccak256\":\"0x4991beb21b224dfcdc3d251e0a60fdc304d4f6b699b2c35d08f3974e5b84c86a\",\"license\":\"MIT\"}},\"version\":1}", + "storageLayout": { + "storage": [], + "types": null + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + }, + "MasterChefV2": { + "abi": [ + { + "inputs": [ + { + "internalType": "contract IMasterChef", + "name": "_MASTER_CHEF", + "type": "address" + }, + { + "internalType": "contract IERC20", + "name": "_sushi", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_MASTER_PID", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "pid", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + } + ], + "name": "Deposit", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "pid", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + } + ], + "name": "EmergencyWithdraw", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "pid", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Harvest", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "LogInit", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "pid", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "allocPoint", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "contract IERC20", + "name": "lpToken", + "type": "address" + }, + { + "indexed": true, + "internalType": "contract IRewarder", + "name": "rewarder", + "type": "address" + } + ], + "name": "LogPoolAddition", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "pid", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "allocPoint", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "contract IRewarder", + "name": "rewarder", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "overwrite", + "type": "bool" + } + ], + "name": "LogSetPool", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "pid", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "lastRewardBlock", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "lpSupply", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "accSushiPerShare", + "type": "uint256" + } + ], + "name": "LogUpdatePool", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "pid", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + } + ], + "name": "Withdraw", + "type": "event" + }, + { + "inputs": [], + "name": "MASTER_CHEF", + "outputs": [ + { + "internalType": "contract IMasterChef", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MASTER_PID", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SUSHI", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "allocPoint", + "type": "uint256" + }, + { + "internalType": "contract IERC20", + "name": "_lpToken", + "type": "address" + }, + { + "internalType": "contract IRewarder", + "name": "_rewarder", + "type": "address" + } + ], + "name": "add", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes[]", + "name": "calls", + "type": "bytes[]" + }, + { + "internalType": "bool", + "name": "revertOnFail", + "type": "bool" + } + ], + "name": "batch", + "outputs": [ + { + "internalType": "bool[]", + "name": "successes", + "type": "bool[]" + }, + { + "internalType": "bytes[]", + "name": "results", + "type": "bytes[]" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "claimOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pid", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + } + ], + "name": "deposit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pid", + "type": "uint256" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + } + ], + "name": "emergencyWithdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pid", + "type": "uint256" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + } + ], + "name": "harvest", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "harvestFromMasterChef", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "dummyToken", + "type": "address" + } + ], + "name": "init", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "lpToken", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "pids", + "type": "uint256[]" + } + ], + "name": "massUpdatePools", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_pid", + "type": "uint256" + } + ], + "name": "migrate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "migrator", + "outputs": [ + { + "internalType": "contract IMigratorChef", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pendingOwner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_pid", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_user", + "type": "address" + } + ], + "name": "pendingSushi", + "outputs": [ + { + "internalType": "uint256", + "name": "pending", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "token", + "type": "address" + }, + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "permitToken", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "poolInfo", + "outputs": [ + { + "internalType": "uint128", + "name": "accSushiPerShare", + "type": "uint128" + }, + { + "internalType": "uint64", + "name": "lastRewardBlock", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "allocPoint", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "poolLength", + "outputs": [ + { + "internalType": "uint256", + "name": "pools", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "rewarder", + "outputs": [ + { + "internalType": "contract IRewarder", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_pid", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_allocPoint", + "type": "uint256" + }, + { + "internalType": "contract IRewarder", + "name": "_rewarder", + "type": "address" + }, + { + "internalType": "bool", + "name": "overwrite", + "type": "bool" + } + ], + "name": "set", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IMigratorChef", + "name": "_migrator", + "type": "address" + } + ], + "name": "setMigrator", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "sushiPerBlock", + "outputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalAllocPoint", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + }, + { + "internalType": "bool", + "name": "direct", + "type": "bool" + }, + { + "internalType": "bool", + "name": "renounce", + "type": "bool" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pid", + "type": "uint256" + } + ], + "name": "updatePool", + "outputs": [ + { + "components": [ + { + "internalType": "uint128", + "name": "accSushiPerShare", + "type": "uint128" + }, + { + "internalType": "uint64", + "name": "lastRewardBlock", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "allocPoint", + "type": "uint64" + } + ], + "internalType": "struct MasterChefV2.PoolInfo", + "name": "pool", + "type": "tuple" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "userInfo", + "outputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "int256", + "name": "rewardDebt", + "type": "int256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pid", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + } + ], + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pid", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + } + ], + "name": "withdrawAndHarvest", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "add(uint256,address,address)": { + "params": { + "_lpToken": "Address of the LP ERC-20 token.", + "_rewarder": "Address of the rewarder delegate.", + "allocPoint": "AP of the new pool." + } + }, + "constructor": { + "params": { + "_MASTER_CHEF": "The SushiSwap MCV1 contract address.", + "_MASTER_PID": "The pool ID of the dummy token on the base MCV1 contract.", + "_sushi": "The SUSHI token contract address." + } + }, + "deposit(uint256,uint256,address)": { + "params": { + "amount": "LP token amount to deposit.", + "pid": "The index of the pool. See `poolInfo`.", + "to": "The receiver of `amount` deposit benefit." + } + }, + "emergencyWithdraw(uint256,address)": { + "params": { + "pid": "The index of the pool. See `poolInfo`.", + "to": "Receiver of the LP tokens." + } + }, + "harvest(uint256,address)": { + "params": { + "pid": "The index of the pool. See `poolInfo`.", + "to": "Receiver of SUSHI rewards." + } + }, + "init(address)": { + "params": { + "dummyToken": "The address of the ERC-20 token to deposit into MCV1." + } + }, + "massUpdatePools(uint256[])": { + "params": { + "pids": "Pool IDs of all to be updated. Make sure to update all active pools." + } + }, + "migrate(uint256)": { + "params": { + "_pid": "The index of the pool. See `poolInfo`." + } + }, + "pendingSushi(uint256,address)": { + "params": { + "_pid": "The index of the pool. See `poolInfo`.", + "_user": "Address of user." + }, + "returns": { + "pending": "SUSHI reward for a given user." + } + }, + "set(uint256,uint256,address,bool)": { + "params": { + "_allocPoint": "New AP of the pool.", + "_pid": "The index of the pool. See `poolInfo`.", + "_rewarder": "Address of the rewarder delegate.", + "overwrite": "True if _rewarder should be `set`. Otherwise `_rewarder` is ignored." + } + }, + "setMigrator(address)": { + "params": { + "_migrator": "The contract address to set." + } + }, + "updatePool(uint256)": { + "params": { + "pid": "The index of the pool. See `poolInfo`." + }, + "returns": { + "pool": "Returns the pool that was updated." + } + }, + "withdraw(uint256,uint256,address)": { + "params": { + "amount": "LP token amount to withdraw.", + "pid": "The index of the pool. See `poolInfo`.", + "to": "Receiver of the LP tokens." + } + }, + "withdrawAndHarvest(uint256,uint256,address)": { + "params": { + "amount": "LP token amount to withdraw.", + "pid": "The index of the pool. See `poolInfo`.", + "to": "Receiver of the LP tokens and SUSHI rewards." + } + } + }, + "stateVariables": { + "totalAllocPoint": { + "details": "Total allocation points. Must be the sum of all allocation points in all pools." + } + }, + "version": 1 + }, + "evm": { + "bytecode": { + "linkReferences": {}, + "object": "60e06040523480156200001157600080fd5b50604051620031b7380380620031b7833981016040819052620000349162000097565b600080546001600160a01b0319163390811782556040519091907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a36001600160601b0319606093841b81166080529190921b1660a05260c052620000f7565b600080600060608486031215620000ac578283fd5b8351620000b981620000de565b6020850151909350620000cc81620000de565b80925050604084015190509250925092565b6001600160a01b0381168114620000f457600080fd5b50565b60805160601c60a05160601c60c05161305b6200015c60003980610d905280611303528061160e5280611cdd5250806108f55280611a075280611e51525080610ccf5280610d6352806112d65280611c065280611cb05280612157525061305b6000f3fe6080604052600436106101d85760003560e01c806361621aaa11610102578063ab560e1011610095578063d1abb90711610064578063d1abb90714610529578063d2423b5114610549578063e30c39781461056a578063edd8b1701461057f576101d8565b8063ab560e10146104bf578063ab7de098146104d4578063b0bcf42a146104f4578063c346253d14610509576101d8565b806388bba42f116100d157806388bba42f1461043c5780638da5cb5b1461045c5780638dbdbe6d1461047157806393f1a40b14610491576101d8565b806361621aaa146103c557806378ed5d1f146103da5780637c516e94146104075780637cd07e4714610427576101d8565b806319ab453c1161017a5780634e71e0c8116101495780634e71e0c81461034e5780634f70b15a1461036357806351eb05a61461037857806357a5b58c146103a5576101d8565b806319ab453c146102ce57806323cf3118146102ee5780632f940c701461030e578063454b06081461032e576101d8565b80631526fe27116101b65780631526fe271461024a57806317caf6f11461027957806318fccc761461028e578063195426ec146102ae576101d8565b8063078dfbe7146101dd578063081e3eda146101ff5780630ad58d2f1461022a575b600080fd5b3480156101e957600080fd5b506101fd6101f83660046125dd565b610594565b005b34801561020b57600080fd5b50610214610683565b6040516102219190612ee9565b60405180910390f35b34801561023657600080fd5b506101fd6102453660046128fc565b610689565b34801561025657600080fd5b5061026a610265366004612867565b610819565b60405161022193929190612ebf565b34801561028557600080fd5b5061021461085b565b34801561029a57600080fd5b506101fd6102a9366004612897565b610861565b3480156102ba57600080fd5b506102146102c9366004612897565b6109fb565b3480156102da57600080fd5b506101fd6102e93660046126cb565b610bf8565b3480156102fa57600080fd5b506101fd6103093660046126cb565b610e19565b34801561031a57600080fd5b506101fd610329366004612897565b610e65565b34801561033a57600080fd5b506101fd610349366004612867565b610f86565b34801561035a57600080fd5b506101fd611232565b34801561036f57600080fd5b506101fd6112bf565b34801561038457600080fd5b50610398610393366004612867565b611362565b6040516102219190612e86565b3480156103b157600080fd5b506101fd6103c0366004612670565b6115dc565b3480156103d157600080fd5b5061021461160c565b3480156103e657600080fd5b506103fa6103f5366004612867565b611630565b60405161022191906129ca565b34801561041357600080fd5b506101fd610422366004612703565b611657565b34801561043357600080fd5b506103fa6116cb565b34801561044857600080fd5b506101fd610457366004612929565b6116da565b34801561046857600080fd5b506103fa611847565b34801561047d57600080fd5b506101fd61048c3660046128fc565b611856565b34801561049d57600080fd5b506104b16104ac366004612897565b6119e1565b604051610221929190612f31565b3480156104cb57600080fd5b506103fa611a05565b3480156104e057600080fd5b506101fd6104ef3660046128c6565b611a29565b34801561050057600080fd5b50610214611c02565b34801561051557600080fd5b506103fa610524366004612867565b611d76565b34801561053557600080fd5b506101fd6105443660046128fc565b611d83565b61055c610557366004612627565b611fb6565b604051610221929190612a5c565b34801561057657600080fd5b506103fa612146565b34801561058b57600080fd5b506103fa612155565b6000546001600160a01b031633146105c75760405162461bcd60e51b81526004016105be90612cfe565b60405180910390fd5b8115610662576001600160a01b0383161515806105e15750805b6105fd5760405162461bcd60e51b81526004016105be90612c18565b600080546040516001600160a01b03808716939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0385166001600160a01b03199182161790915560018054909116905561067e565b600180546001600160a01b0319166001600160a01b0385161790555b505050565b60035490565b610691612575565b61069a84611362565b600085815260066020908152604080832033845290915290208151919250906106ec9064e8d4a51000906106d89087906001600160801b0316612179565b816106df57fe5b60018401549190046121b6565b600182015580546106fd9085612203565b815560058054600091908790811061071157fe5b6000918252602090912001546001600160a01b0316905080156107975781546040516345fb1ba160e11b81526001600160a01b03831691638bf6374291610764918a9133918a9160009190600401612ef2565b600060405180830381600087803b15801561077e57600080fd5b505af1158015610792573d6000803e3d6000fd5b505050505b6107c58486600489815481106107a957fe5b6000918252602090912001546001600160a01b03169190612226565b836001600160a01b031686336001600160a01b03167f8166bf25f8a2b7ed3c85049207da4358d16edbed977d23fa2ee6f0dde3ec2132886040516108099190612ee9565b60405180910390a4505050505050565b6003818154811061082657fe5b6000918252602090912001546001600160801b03811691506001600160401b03600160801b8204811691600160c01b90041683565b60075481565b610869612575565b61087283611362565b6000848152600660209081526040808320338452909152812082518154939450909264e8d4a51000916108ae91906001600160801b0316612179565b816108b557fe5b04905060006108d96108d48460010154846121b690919063ffffffff16565b612314565b600184018390559050801561091c5761091c6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168683612226565b60006005878154811061092b57fe5b6000918252602090912001546001600160a01b0316905080156109b05783546040516345fb1ba160e11b81526001600160a01b03831691638bf637429161097d918b9133918c91899190600401612ef2565b600060405180830381600087803b15801561099757600080fd5b505af11580156109ab573d6000803e3d6000fd5b505050505b86336001600160a01b03167f71bab65ced2e5750775a0613be067df48ef06cf92a496ebf7663ae0660924954846040516109ea9190612ee9565b60405180910390a350505050505050565b6000610a05612575565b60038481548110610a1257fe5b600091825260208083206040805160608101825291909301546001600160801b0380821683526001600160401b03600160801b8304811684860152600160c01b90920490911682850152888552600683528385206001600160a01b0389168652909252918320825160048054949650919492169288908110610a9057fe5b6000918252602090912001546040516370a0823160e01b81526001600160a01b03909116906370a0823190610ac99030906004016129ca565b60206040518083038186803b158015610ae157600080fd5b505afa158015610af5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b19919061287f565b905083602001516001600160401b031643118015610b3657508015155b15610bbf576000610b5d85602001516001600160401b03164361220390919063ffffffff16565b90506000600754610b8d87604001516001600160401b0316610b87610b80611c02565b8690612179565b90612179565b81610b9457fe5b049050610bba83610baa8364e8d4a51000612179565b81610bb157fe5b8691900461233a565b935050505b60018301548354610bed916108d49164e8d4a5100090610bdf9087612179565b81610be657fe5b04906121b6565b979650505050505050565b6040516370a0823160e01b81526000906001600160a01b038316906370a0823190610c279033906004016129ca565b60206040518083038186803b158015610c3f57600080fd5b505afa158015610c53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c77919061287f565b905080610c965760405162461bcd60e51b81526004016105be90612b5d565b610cab6001600160a01b03831633308461235d565b60405163095ea7b360e01b81526001600160a01b0383169063095ea7b390610cf9907f0000000000000000000000000000000000000000000000000000000000000000908590600401612a43565b602060405180830381600087803b158015610d1357600080fd5b505af1158015610d27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4b91906126af565b50604051631c57762b60e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e2bbb15890610dba907f0000000000000000000000000000000000000000000000000000000000000000908590600401612f31565b600060405180830381600087803b158015610dd457600080fd5b505af1158015610de8573d6000803e3d6000fd5b50506040517f98a9bd3b7a617581fc53b1e2992534e0e0cb5091c9d44aa1a7fc978f706caa83925060009150a15050565b6000546001600160a01b03163314610e435760405162461bcd60e51b81526004016105be90612cfe565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b60008281526006602090815260408083203384529091528120805482825560018201839055600580549293919286908110610e9c57fe5b6000918252602090912001546001600160a01b031690508015610f21576040516345fb1ba160e11b81526001600160a01b03821690638bf6374290610eee908890339089906000908190600401612ef2565b600060405180830381600087803b158015610f0857600080fd5b505af1158015610f1c573d6000803e3d6000fd5b505050505b610f338483600488815481106107a957fe5b836001600160a01b031685336001600160a01b03167f2cac5e20e1541d836381527a43f651851e302817b71dc8e810284e69210c1c6b85604051610f779190612ee9565b60405180910390a45050505050565b6002546001600160a01b0316610fae5760405162461bcd60e51b81526004016105be90612d9f565b600060048281548110610fbd57fe5b60009182526020822001546040516370a0823160e01b81526001600160a01b03909116925082906370a0823190610ff89030906004016129ca565b60206040518083038186803b15801561101057600080fd5b505afa158015611024573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611048919061287f565b60025460405163095ea7b360e01b81529192506001600160a01b038085169263095ea7b39261107d9216908590600401612a43565b602060405180830381600087803b15801561109757600080fd5b505af11580156110ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110cf91906126af565b5060025460405163ce5494bb60e01b81526000916001600160a01b03169063ce5494bb906111019086906004016129ca565b602060405180830381600087803b15801561111b57600080fd5b505af115801561112f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061115391906126e7565b6040516370a0823160e01b81529091506001600160a01b038216906370a08231906111829030906004016129ca565b60206040518083038186803b15801561119a57600080fd5b505afa1580156111ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111d2919061287f565b82146111f05760405162461bcd60e51b81526004016105be90612c47565b80600485815481106111fe57fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555050505050565b6001546001600160a01b031633811461125d5760405162461bcd60e51b81526004016105be90612d33565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b039092166001600160a01b0319928316179055600180549091169055565b604051631c57762b60e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e2bbb1589061132e907f000000000000000000000000000000000000000000000000000000000000000090600090600401612f31565b600060405180830381600087803b15801561134857600080fd5b505af115801561135c573d6000803e3d6000fd5b50505050565b61136a612575565b6003828154811061137757fe5b60009182526020918290206040805160608101825292909101546001600160801b03811683526001600160401b03600160801b82048116948401859052600160c01b909104169082015291504311156115d7576000600483815481106113d957fe5b6000918252602090912001546040516370a0823160e01b81526001600160a01b03909116906370a08231906114129030906004016129ca565b60206040518083038186803b15801561142a57600080fd5b505afa15801561143e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611462919061287f565b905080156114fb57600061148c83602001516001600160401b03164361220390919063ffffffff16565b905060006007546114af85604001516001600160401b0316610b87610b80611c02565b816114b657fe5b0490506114ed6114dc846114cf8464e8d4a51000612179565b816114d657fe5b0461244e565b85516001600160801b031690612477565b6001600160801b0316845250505b611504436124a6565b6001600160401b03166020830152600380548391908590811061152357fe5b6000918252602091829020835191018054848401516040958601516001600160801b03199092166001600160801b039094169390931767ffffffffffffffff60801b1916600160801b6001600160401b0394851602176001600160c01b0316600160c01b93909116929092029190911790558301518351915185927f0fc9545022a542541ad085d091fb09a2ab36fee366a4576ab63714ea907ad353926115cd9290918691612f3f565b60405180910390a2505b919050565b8060005b8181101561135c576116038484838181106115f757fe5b90506020020135611362565b506001016115e0565b7f000000000000000000000000000000000000000000000000000000000000000081565b6004818154811061163d57fe5b6000918252602090912001546001600160a01b0316905081565b60405163d505accf60e01b81526001600160a01b0389169063d505accf9061168f908a908a908a908a908a908a908a90600401612a02565b600060405180830381600087803b1580156116a957600080fd5b505af11580156116bd573d6000803e3d6000fd5b505050505050505050505050565b6002546001600160a01b031681565b6000546001600160a01b031633146117045760405162461bcd60e51b81526004016105be90612cfe565b6117438361173d6003878154811061171857fe5b60009182526020909120015460075490600160c01b90046001600160401b0316612203565b9061233a565b60075561174f836124a6565b6003858154811061175c57fe5b9060005260206000200160000160186101000a8154816001600160401b0302191690836001600160401b0316021790555080156117d05781600585815481106117a157fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b806117fc57600584815481106117e257fe5b6000918252602090912001546001600160a01b03166117fe565b815b6001600160a01b0316847f95895a6ab1df54420d241b55243258a33e61b2194db66c1179ec521aae8e18658584604051611839929190612f21565b60405180910390a350505050565b6000546001600160a01b031681565b61185e612575565b61186784611362565b60008581526006602090815260408083206001600160a01b03871684529091529020805491925090611899908561233a565b815581516118d09064e8d4a51000906118bc9087906001600160801b0316612179565b816118c357fe5b60018401549190046124cf565b81600101819055506000600586815481106118e757fe5b6000918252602090912001546001600160a01b03169050801561196d5781546040516345fb1ba160e11b81526001600160a01b03831691638bf637429161193a918a918991829160009190600401612ef2565b600060405180830381600087803b15801561195457600080fd5b505af1158015611968573d6000803e3d6000fd5b505050505b61199d33308760048a8154811061198057fe5b6000918252602090912001546001600160a01b031692919061235d565b836001600160a01b031686336001600160a01b03167f02d7e648dd130fc184d383e55bb126ac4c9c60e8f94bf05acdf557ba2d540b47886040516108099190612ee9565b60066020908152600092835260408084209091529082529020805460019091015482565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000546001600160a01b03163314611a535760405162461bcd60e51b81526004016105be90612cfe565b6007544390611a62908561233a565b6007556004805460018181019092557f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180546001600160a01b038087166001600160a01b03199283161790925560058054938401815560009081527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0909301805492861692909116919091179055604080516060810190915290815260039060208101611b0f846124a6565b6001600160401b03168152602001611b26876124a6565b6001600160401b039081169091528254600181810185556000948552602094859020845192018054958501516040909501518416600160c01b026001600160c01b0395909416600160801b0267ffffffffffffffff60801b196001600160801b039094166001600160801b0319909716969096179290921694909417929092161790556004546001600160a01b038085169290861691611bc591612203565b7f81ee0f8c5c46e2cb41984886f77a84181724abb86c32a5f6de539b07509d45e587604051611bf49190612ee9565b60405180910390a450505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166317caf6f16040518163ffffffff1660e01b815260040160206040518083038186803b158015611c5d57600080fd5b505afa158015611c71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c95919061287f565b604051631526fe2760e01b8152611d69906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690631526fe2790611d05907f000000000000000000000000000000000000000000000000000000000000000090600401612ee9565b60806040518083038186803b158015611d1d57600080fd5b505afa158015611d31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d559190612815565b6020015168056bc75e2d6310000090612179565b81611d7057fe5b04905090565b6005818154811061163d57fe5b611d8b612575565b611d9484611362565b6000858152600660209081526040808320338452909152812082518154939450909264e8d4a5100091611dd091906001600160801b0316612179565b81611dd757fe5b0490506000611df66108d48460010154846121b690919063ffffffff16565b9050611e3164e8d4a51000611e2186600001516001600160801b03168961217990919063ffffffff16565b81611e2857fe5b849190046121b6565b60018401558254611e429087612203565b8355611e786001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168683612226565b600060058881548110611e8757fe5b6000918252602090912001546001600160a01b031690508015611f0c5783546040516345fb1ba160e11b81526001600160a01b03831691638bf6374291611ed9918c9133918c91899190600401612ef2565b600060405180830381600087803b158015611ef357600080fd5b505af1158015611f07573d6000803e3d6000fd5b505050505b611f1e868860048b815481106107a957fe5b856001600160a01b031688336001600160a01b03167f8166bf25f8a2b7ed3c85049207da4358d16edbed977d23fa2ee6f0dde3ec21328a604051611f629190612ee9565b60405180910390a487336001600160a01b03167f71bab65ced2e5750775a0613be067df48ef06cf92a496ebf7663ae066092495484604051611fa49190612ee9565b60405180910390a35050505050505050565b606080836001600160401b0381118015611fcf57600080fd5b50604051908082528060200260200182016040528015611ff9578160200160208202803683370190505b509150836001600160401b038111801561201257600080fd5b5060405190808252806020026020018201604052801561204657816020015b60608152602001906001900390816120315790505b50905060005b8481101561213d57600060603088888581811061206557fe5b90506020028101906120779190612f69565b60405161208592919061299e565b600060405180830381855af49150503d80600081146120c0576040519150601f19603f3d011682016040523d82523d6000602084013e6120c5565b606091505b509150915081806120d4575085155b6120dd82612515565b906120fb5760405162461bcd60e51b81526004016105be9190612af6565b508185848151811061210957fe5b6020026020010190151590811515815250508084848151811061212857fe5b6020908102919091010152505060010161204c565b50935093915050565b6001546001600160a01b031681565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008115806121945750508082028282828161219157fe5b04145b6121b05760405162461bcd60e51b81526004016105be90612e4f565b92915050565b60008183038183128015906121cb5750838113155b806121e057506000831280156121e057508381135b6121fc5760405162461bcd60e51b81526004016105be90612dd6565b9392505050565b808203828111156121b05760405162461bcd60e51b81526004016105be90612b09565b60006060846001600160a01b031663a9059cbb858560405160240161224c929190612a43565b6040516020818303038152906040529060e01b6020820180516001600160e01b03838183161783525050505060405161228591906129ae565b6000604051808303816000865af19150503d80600081146122c2576040519150601f19603f3d011682016040523d82523d6000602084013e6122c7565b606091505b50915091508180156122f15750805115806122f15750808060200190518101906122f191906126af565b61230d5760405162461bcd60e51b81526004016105be90612ba0565b5050505050565b6000808212156123365760405162461bcd60e51b81526004016105be90612b38565b5090565b818101818110156121b05760405162461bcd60e51b81526004016105be90612cc7565b60006060856001600160a01b03166323b872dd868686604051602401612385939291906129de565b6040516020818303038152906040529060e01b6020820180516001600160e01b0383818316178352505050506040516123be91906129ae565b6000604051808303816000865af19150503d80600081146123fb576040519150601f19603f3d011682016040523d82523d6000602084013e612400565b606091505b509150915081801561242a57508051158061242a57508080602001905181019061242a91906126af565b6124465760405162461bcd60e51b81526004016105be90612e1a565b505050505050565b60006001600160801b038211156123365760405162461bcd60e51b81526004016105be90612c90565b8181016001600160801b0380831690821610156121b05760405162461bcd60e51b81526004016105be90612cc7565b60006001600160401b038211156123365760405162461bcd60e51b81526004016105be90612d68565b60008282018183128015906124e45750838112155b806124f957506000831280156124f957508381125b6121fc5760405162461bcd60e51b81526004016105be90612bd7565b606060448251101561255b575060408051808201909152601d81527f5472616e73616374696f6e2072657665727465642073696c656e746c7900000060208201526115d7565b600482019150818060200190518101906121b0919061278a565b604080516060810182526000808252602082018190529181019190915290565b60008083601f8401126125a6578182fd5b5081356001600160401b038111156125bc578182fd5b60208301915083602080830285010111156125d657600080fd5b9250929050565b6000806000606084860312156125f1578283fd5b83356125fc81612fff565b9250602084013561260c81613017565b9150604084013561261c81613017565b809150509250925092565b60008060006040848603121561263b578283fd5b83356001600160401b03811115612650578384fd5b61265c86828701612595565b909450925050602084013561261c81613017565b60008060208385031215612682578182fd5b82356001600160401b03811115612697578283fd5b6126a385828601612595565b90969095509350505050565b6000602082840312156126c0578081fd5b81516121fc81613017565b6000602082840312156126dc578081fd5b81356121fc81612fff565b6000602082840312156126f8578081fd5b81516121fc81612fff565b600080600080600080600080610100898b03121561271f578384fd5b883561272a81612fff565b9750602089013561273a81612fff565b9650604089013561274a81612fff565b9550606089013594506080890135935060a089013560ff8116811461276d578384fd5b979a969950949793969295929450505060c08201359160e0013590565b60006020828403121561279b578081fd5b81516001600160401b03808211156127b1578283fd5b818401915084601f8301126127c4578283fd5b8151818111156127d2578384fd5b6127e5601f8201601f1916602001612fad565b91508082528560208285010111156127fb578384fd5b61280c816020840160208601612fd3565b50949350505050565b600060808284031215612826578081fd5b6128306080612fad565b825161283b81612fff565b808252506020830151602082015260408301516040820152606083015160608201528091505092915050565b600060208284031215612878578081fd5b5035919050565b600060208284031215612890578081fd5b5051919050565b600080604083850312156128a9578182fd5b8235915060208301356128bb81612fff565b809150509250929050565b6000806000606084860312156128da578081fd5b8335925060208401356128ec81612fff565b9150604084013561261c81612fff565b600080600060608486031215612910578081fd5b8335925060208401359150604084013561261c81612fff565b6000806000806080858703121561293e578182fd5b8435935060208501359250604085013561295781612fff565b9150606085013561296781613017565b939692955090935050565b6000815180845261298a816020860160208601612fd3565b601f01601f19169290920160200192915050565b6000828483379101908152919050565b600082516129c0818460208701612fd3565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b6001600160a01b03929092168252602082015260400190565b604080825283519082018190526000906020906060840190828701845b82811015612a97578151151584529284019290840190600101612a79565b50505083810382850152808551612aae8184612ee9565b91508192508381028201848801865b83811015612ae7578583038552612ad5838351612972565b94870194925090860190600101612abd565b50909998505050505050505050565b6000602082526121fc6020830184612972565b602080825260159082015274426f72696e674d6174683a20556e646572666c6f7760581b604082015260600190565b6020808252600b908201526a0496e7465676572203c20360ac1b604082015260600190565b60208082526023908201527f4d61737465724368656656323a2042616c616e6365206d75737420657863656560408201526206420360ec1b606082015260800190565b6020808252601c908201527f426f72696e6745524332303a205472616e73666572206661696c656400000000604082015260600190565b60208082526021908201527f5369676e6564536166654d6174683a206164646974696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252601590820152744f776e61626c653a207a65726f206164647265737360581b604082015260600190565b60208082526029908201527f4d61737465724368656656323a206d696772617465642062616c616e6365206d6040820152680eae6e840dac2e8c6d60bb1b606082015260800190565b6020808252601c908201527f426f72696e674d6174683a2075696e74313238204f766572666c6f7700000000604082015260600190565b60208082526018908201527f426f72696e674d6174683a20416464204f766572666c6f770000000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c657220213d2070656e64696e67206f776e6572604082015260600190565b6020808252601b908201527f426f72696e674d6174683a2075696e743634204f766572666c6f770000000000604082015260600190565b6020808252601d908201527f4d61737465724368656656323a206e6f206d69677261746f7220736574000000604082015260600190565b60208082526024908201527f5369676e6564536166654d6174683a207375627472616374696f6e206f766572604082015263666c6f7760e01b606082015260800190565b6020808252818101527f426f72696e6745524332303a205472616e7366657246726f6d206661696c6564604082015260600190565b60208082526018908201527f426f72696e674d6174683a204d756c204f766572666c6f770000000000000000604082015260600190565b81516001600160801b031681526020808301516001600160401b0390811691830191909152604092830151169181019190915260600190565b6001600160801b039390931683526001600160401b03918216602084015216604082015260600190565b90815260200190565b9485526001600160a01b0393841660208601529190921660408401526060830191909152608082015260a00190565b9182521515602082015260400190565b918252602082015260400190565b6001600160401b0393909316835260208301919091526001600160801b0316604082015260600190565b6000808335601e19843603018112612f7f578283fd5b8301803591506001600160401b03821115612f98578283fd5b6020019150368190038213156125d657600080fd5b6040518181016001600160401b0381118282101715612fcb57600080fd5b604052919050565b60005b83811015612fee578181015183820152602001612fd6565b8381111561135c5750506000910152565b6001600160a01b038116811461301457600080fd5b50565b801515811461301457600080fdfea2646970667358221220814e5dfdee606b9ff8357a8c99c275bc5bee65fd89e04f2e557682da8ccc9f4264736f6c634300060c0033", + "opcodes": "PUSH1 0xE0 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x31B7 CODESIZE SUB DUP1 PUSH3 0x31B7 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH3 0x34 SWAP2 PUSH3 0x97 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND CALLER SWAP1 DUP2 OR DUP3 SSTORE PUSH1 0x40 MLOAD SWAP1 SWAP2 SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP3 SWAP1 LOG3 PUSH1 0x1 PUSH1 0x1 PUSH1 0x60 SHL SUB NOT PUSH1 0x60 SWAP4 DUP5 SHL DUP2 AND PUSH1 0x80 MSTORE SWAP2 SWAP1 SWAP3 SHL AND PUSH1 0xA0 MSTORE PUSH1 0xC0 MSTORE PUSH3 0xF7 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH3 0xAC JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 MLOAD PUSH3 0xB9 DUP2 PUSH3 0xDE JUMP JUMPDEST PUSH1 0x20 DUP6 ADD MLOAD SWAP1 SWAP4 POP PUSH3 0xCC DUP2 PUSH3 0xDE JUMP JUMPDEST DUP1 SWAP3 POP POP PUSH1 0x40 DUP5 ADD MLOAD SWAP1 POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH3 0xF4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x80 MLOAD PUSH1 0x60 SHR PUSH1 0xA0 MLOAD PUSH1 0x60 SHR PUSH1 0xC0 MLOAD PUSH2 0x305B PUSH3 0x15C PUSH1 0x0 CODECOPY DUP1 PUSH2 0xD90 MSTORE DUP1 PUSH2 0x1303 MSTORE DUP1 PUSH2 0x160E MSTORE DUP1 PUSH2 0x1CDD MSTORE POP DUP1 PUSH2 0x8F5 MSTORE DUP1 PUSH2 0x1A07 MSTORE DUP1 PUSH2 0x1E51 MSTORE POP DUP1 PUSH2 0xCCF MSTORE DUP1 PUSH2 0xD63 MSTORE DUP1 PUSH2 0x12D6 MSTORE DUP1 PUSH2 0x1C06 MSTORE DUP1 PUSH2 0x1CB0 MSTORE DUP1 PUSH2 0x2157 MSTORE POP PUSH2 0x305B PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x1D8 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x61621AAA GT PUSH2 0x102 JUMPI DUP1 PUSH4 0xAB560E10 GT PUSH2 0x95 JUMPI DUP1 PUSH4 0xD1ABB907 GT PUSH2 0x64 JUMPI DUP1 PUSH4 0xD1ABB907 EQ PUSH2 0x529 JUMPI DUP1 PUSH4 0xD2423B51 EQ PUSH2 0x549 JUMPI DUP1 PUSH4 0xE30C3978 EQ PUSH2 0x56A JUMPI DUP1 PUSH4 0xEDD8B170 EQ PUSH2 0x57F JUMPI PUSH2 0x1D8 JUMP JUMPDEST DUP1 PUSH4 0xAB560E10 EQ PUSH2 0x4BF JUMPI DUP1 PUSH4 0xAB7DE098 EQ PUSH2 0x4D4 JUMPI DUP1 PUSH4 0xB0BCF42A EQ PUSH2 0x4F4 JUMPI DUP1 PUSH4 0xC346253D EQ PUSH2 0x509 JUMPI PUSH2 0x1D8 JUMP JUMPDEST DUP1 PUSH4 0x88BBA42F GT PUSH2 0xD1 JUMPI DUP1 PUSH4 0x88BBA42F EQ PUSH2 0x43C JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x45C JUMPI DUP1 PUSH4 0x8DBDBE6D EQ PUSH2 0x471 JUMPI DUP1 PUSH4 0x93F1A40B EQ PUSH2 0x491 JUMPI PUSH2 0x1D8 JUMP JUMPDEST DUP1 PUSH4 0x61621AAA EQ PUSH2 0x3C5 JUMPI DUP1 PUSH4 0x78ED5D1F EQ PUSH2 0x3DA JUMPI DUP1 PUSH4 0x7C516E94 EQ PUSH2 0x407 JUMPI DUP1 PUSH4 0x7CD07E47 EQ PUSH2 0x427 JUMPI PUSH2 0x1D8 JUMP JUMPDEST DUP1 PUSH4 0x19AB453C GT PUSH2 0x17A JUMPI DUP1 PUSH4 0x4E71E0C8 GT PUSH2 0x149 JUMPI DUP1 PUSH4 0x4E71E0C8 EQ PUSH2 0x34E JUMPI DUP1 PUSH4 0x4F70B15A EQ PUSH2 0x363 JUMPI DUP1 PUSH4 0x51EB05A6 EQ PUSH2 0x378 JUMPI DUP1 PUSH4 0x57A5B58C EQ PUSH2 0x3A5 JUMPI PUSH2 0x1D8 JUMP JUMPDEST DUP1 PUSH4 0x19AB453C EQ PUSH2 0x2CE JUMPI DUP1 PUSH4 0x23CF3118 EQ PUSH2 0x2EE JUMPI DUP1 PUSH4 0x2F940C70 EQ PUSH2 0x30E JUMPI DUP1 PUSH4 0x454B0608 EQ PUSH2 0x32E JUMPI PUSH2 0x1D8 JUMP JUMPDEST DUP1 PUSH4 0x1526FE27 GT PUSH2 0x1B6 JUMPI DUP1 PUSH4 0x1526FE27 EQ PUSH2 0x24A JUMPI DUP1 PUSH4 0x17CAF6F1 EQ PUSH2 0x279 JUMPI DUP1 PUSH4 0x18FCCC76 EQ PUSH2 0x28E JUMPI DUP1 PUSH4 0x195426EC EQ PUSH2 0x2AE JUMPI PUSH2 0x1D8 JUMP JUMPDEST DUP1 PUSH4 0x78DFBE7 EQ PUSH2 0x1DD JUMPI DUP1 PUSH4 0x81E3EDA EQ PUSH2 0x1FF JUMPI DUP1 PUSH4 0xAD58D2F EQ PUSH2 0x22A JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1E9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1FD PUSH2 0x1F8 CALLDATASIZE PUSH1 0x4 PUSH2 0x25DD JUMP JUMPDEST PUSH2 0x594 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x20B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x214 PUSH2 0x683 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x221 SWAP2 SWAP1 PUSH2 0x2EE9 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x236 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1FD PUSH2 0x245 CALLDATASIZE PUSH1 0x4 PUSH2 0x28FC JUMP JUMPDEST PUSH2 0x689 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x256 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x26A PUSH2 0x265 CALLDATASIZE PUSH1 0x4 PUSH2 0x2867 JUMP JUMPDEST PUSH2 0x819 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x221 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x2EBF JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x285 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x214 PUSH2 0x85B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x29A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1FD PUSH2 0x2A9 CALLDATASIZE PUSH1 0x4 PUSH2 0x2897 JUMP JUMPDEST PUSH2 0x861 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2BA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x214 PUSH2 0x2C9 CALLDATASIZE PUSH1 0x4 PUSH2 0x2897 JUMP JUMPDEST PUSH2 0x9FB JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2DA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1FD PUSH2 0x2E9 CALLDATASIZE PUSH1 0x4 PUSH2 0x26CB JUMP JUMPDEST PUSH2 0xBF8 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2FA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1FD PUSH2 0x309 CALLDATASIZE PUSH1 0x4 PUSH2 0x26CB JUMP JUMPDEST PUSH2 0xE19 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x31A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1FD PUSH2 0x329 CALLDATASIZE PUSH1 0x4 PUSH2 0x2897 JUMP JUMPDEST PUSH2 0xE65 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x33A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1FD PUSH2 0x349 CALLDATASIZE PUSH1 0x4 PUSH2 0x2867 JUMP JUMPDEST PUSH2 0xF86 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x35A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1FD PUSH2 0x1232 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x36F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1FD PUSH2 0x12BF JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x384 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x398 PUSH2 0x393 CALLDATASIZE PUSH1 0x4 PUSH2 0x2867 JUMP JUMPDEST PUSH2 0x1362 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x221 SWAP2 SWAP1 PUSH2 0x2E86 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3B1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1FD PUSH2 0x3C0 CALLDATASIZE PUSH1 0x4 PUSH2 0x2670 JUMP JUMPDEST PUSH2 0x15DC JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3D1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x214 PUSH2 0x160C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3E6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3FA PUSH2 0x3F5 CALLDATASIZE PUSH1 0x4 PUSH2 0x2867 JUMP JUMPDEST PUSH2 0x1630 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x221 SWAP2 SWAP1 PUSH2 0x29CA JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x413 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1FD PUSH2 0x422 CALLDATASIZE PUSH1 0x4 PUSH2 0x2703 JUMP JUMPDEST PUSH2 0x1657 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x433 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3FA PUSH2 0x16CB JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x448 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1FD PUSH2 0x457 CALLDATASIZE PUSH1 0x4 PUSH2 0x2929 JUMP JUMPDEST PUSH2 0x16DA JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x468 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3FA PUSH2 0x1847 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x47D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1FD PUSH2 0x48C CALLDATASIZE PUSH1 0x4 PUSH2 0x28FC JUMP JUMPDEST PUSH2 0x1856 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x49D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x4B1 PUSH2 0x4AC CALLDATASIZE PUSH1 0x4 PUSH2 0x2897 JUMP JUMPDEST PUSH2 0x19E1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x221 SWAP3 SWAP2 SWAP1 PUSH2 0x2F31 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4CB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3FA PUSH2 0x1A05 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4E0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1FD PUSH2 0x4EF CALLDATASIZE PUSH1 0x4 PUSH2 0x28C6 JUMP JUMPDEST PUSH2 0x1A29 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x500 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x214 PUSH2 0x1C02 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x515 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3FA PUSH2 0x524 CALLDATASIZE PUSH1 0x4 PUSH2 0x2867 JUMP JUMPDEST PUSH2 0x1D76 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x535 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1FD PUSH2 0x544 CALLDATASIZE PUSH1 0x4 PUSH2 0x28FC JUMP JUMPDEST PUSH2 0x1D83 JUMP JUMPDEST PUSH2 0x55C PUSH2 0x557 CALLDATASIZE PUSH1 0x4 PUSH2 0x2627 JUMP JUMPDEST PUSH2 0x1FB6 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x221 SWAP3 SWAP2 SWAP1 PUSH2 0x2A5C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x576 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3FA PUSH2 0x2146 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x58B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3FA PUSH2 0x2155 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0x5C7 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x5BE SWAP1 PUSH2 0x2CFE JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP2 ISZERO PUSH2 0x662 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND ISZERO ISZERO DUP1 PUSH2 0x5E1 JUMPI POP DUP1 JUMPDEST PUSH2 0x5FD JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x5BE SWAP1 PUSH2 0x2C18 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP8 AND SWAP4 SWAP3 AND SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 LOG3 PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP2 DUP3 AND OR SWAP1 SWAP2 SSTORE PUSH1 0x1 DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SSTORE PUSH2 0x67E JUMP JUMPDEST PUSH1 0x1 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND OR SWAP1 SSTORE JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x3 SLOAD SWAP1 JUMP JUMPDEST PUSH2 0x691 PUSH2 0x2575 JUMP JUMPDEST PUSH2 0x69A DUP5 PUSH2 0x1362 JUMP JUMPDEST PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 DUP2 MLOAD SWAP2 SWAP3 POP SWAP1 PUSH2 0x6EC SWAP1 PUSH5 0xE8D4A51000 SWAP1 PUSH2 0x6D8 SWAP1 DUP8 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x2179 JUMP JUMPDEST DUP2 PUSH2 0x6DF JUMPI INVALID JUMPDEST PUSH1 0x1 DUP5 ADD SLOAD SWAP2 SWAP1 DIV PUSH2 0x21B6 JUMP JUMPDEST PUSH1 0x1 DUP3 ADD SSTORE DUP1 SLOAD PUSH2 0x6FD SWAP1 DUP6 PUSH2 0x2203 JUMP JUMPDEST DUP2 SSTORE PUSH1 0x5 DUP1 SLOAD PUSH1 0x0 SWAP2 SWAP1 DUP8 SWAP1 DUP2 LT PUSH2 0x711 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 POP DUP1 ISZERO PUSH2 0x797 JUMPI DUP2 SLOAD PUSH1 0x40 MLOAD PUSH4 0x45FB1BA1 PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP2 PUSH4 0x8BF63742 SWAP2 PUSH2 0x764 SWAP2 DUP11 SWAP2 CALLER SWAP2 DUP11 SWAP2 PUSH1 0x0 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0x2EF2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x77E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x792 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST PUSH2 0x7C5 DUP5 DUP7 PUSH1 0x4 DUP10 DUP2 SLOAD DUP2 LT PUSH2 0x7A9 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 SWAP1 PUSH2 0x2226 JUMP JUMPDEST DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP7 CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x8166BF25F8A2B7ED3C85049207DA4358D16EDBED977D23FA2EE6F0DDE3EC2132 DUP9 PUSH1 0x40 MLOAD PUSH2 0x809 SWAP2 SWAP1 PUSH2 0x2EE9 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x3 DUP2 DUP2 SLOAD DUP2 LT PUSH2 0x826 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP2 AND SWAP2 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB PUSH1 0x1 PUSH1 0x80 SHL DUP3 DIV DUP2 AND SWAP2 PUSH1 0x1 PUSH1 0xC0 SHL SWAP1 DIV AND DUP4 JUMP JUMPDEST PUSH1 0x7 SLOAD DUP2 JUMP JUMPDEST PUSH2 0x869 PUSH2 0x2575 JUMP JUMPDEST PUSH2 0x872 DUP4 PUSH2 0x1362 JUMP JUMPDEST PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP5 MSTORE SWAP1 SWAP2 MSTORE DUP2 KECCAK256 DUP3 MLOAD DUP2 SLOAD SWAP4 SWAP5 POP SWAP1 SWAP3 PUSH5 0xE8D4A51000 SWAP2 PUSH2 0x8AE SWAP2 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x2179 JUMP JUMPDEST DUP2 PUSH2 0x8B5 JUMPI INVALID JUMPDEST DIV SWAP1 POP PUSH1 0x0 PUSH2 0x8D9 PUSH2 0x8D4 DUP5 PUSH1 0x1 ADD SLOAD DUP5 PUSH2 0x21B6 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH2 0x2314 JUMP JUMPDEST PUSH1 0x1 DUP5 ADD DUP4 SWAP1 SSTORE SWAP1 POP DUP1 ISZERO PUSH2 0x91C JUMPI PUSH2 0x91C PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 AND DUP7 DUP4 PUSH2 0x2226 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x5 DUP8 DUP2 SLOAD DUP2 LT PUSH2 0x92B JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 POP DUP1 ISZERO PUSH2 0x9B0 JUMPI DUP4 SLOAD PUSH1 0x40 MLOAD PUSH4 0x45FB1BA1 PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP2 PUSH4 0x8BF63742 SWAP2 PUSH2 0x97D SWAP2 DUP12 SWAP2 CALLER SWAP2 DUP13 SWAP2 DUP10 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0x2EF2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x997 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x9AB JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST DUP7 CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x71BAB65CED2E5750775A0613BE067DF48EF06CF92A496EBF7663AE0660924954 DUP5 PUSH1 0x40 MLOAD PUSH2 0x9EA SWAP2 SWAP1 PUSH2 0x2EE9 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA05 PUSH2 0x2575 JUMP JUMPDEST PUSH1 0x3 DUP5 DUP2 SLOAD DUP2 LT PUSH2 0xA12 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 KECCAK256 PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE SWAP2 SWAP1 SWAP4 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP3 AND DUP4 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB PUSH1 0x1 PUSH1 0x80 SHL DUP4 DIV DUP2 AND DUP5 DUP7 ADD MSTORE PUSH1 0x1 PUSH1 0xC0 SHL SWAP1 SWAP3 DIV SWAP1 SWAP2 AND DUP3 DUP6 ADD MSTORE DUP9 DUP6 MSTORE PUSH1 0x6 DUP4 MSTORE DUP4 DUP6 KECCAK256 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP10 AND DUP7 MSTORE SWAP1 SWAP3 MSTORE SWAP2 DUP4 KECCAK256 DUP3 MLOAD PUSH1 0x4 DUP1 SLOAD SWAP5 SWAP7 POP SWAP2 SWAP5 SWAP3 AND SWAP3 DUP9 SWAP1 DUP2 LT PUSH2 0xA90 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x40 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0x70A08231 SWAP1 PUSH2 0xAC9 SWAP1 ADDRESS SWAP1 PUSH1 0x4 ADD PUSH2 0x29CA JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xAE1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xAF5 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xB19 SWAP2 SWAP1 PUSH2 0x287F JUMP JUMPDEST SWAP1 POP DUP4 PUSH1 0x20 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND NUMBER GT DUP1 ISZERO PUSH2 0xB36 JUMPI POP DUP1 ISZERO ISZERO JUMPDEST ISZERO PUSH2 0xBBF JUMPI PUSH1 0x0 PUSH2 0xB5D DUP6 PUSH1 0x20 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND NUMBER PUSH2 0x2203 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH1 0x7 SLOAD PUSH2 0xB8D DUP8 PUSH1 0x40 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND PUSH2 0xB87 PUSH2 0xB80 PUSH2 0x1C02 JUMP JUMPDEST DUP7 SWAP1 PUSH2 0x2179 JUMP JUMPDEST SWAP1 PUSH2 0x2179 JUMP JUMPDEST DUP2 PUSH2 0xB94 JUMPI INVALID JUMPDEST DIV SWAP1 POP PUSH2 0xBBA DUP4 PUSH2 0xBAA DUP4 PUSH5 0xE8D4A51000 PUSH2 0x2179 JUMP JUMPDEST DUP2 PUSH2 0xBB1 JUMPI INVALID JUMPDEST DUP7 SWAP2 SWAP1 DIV PUSH2 0x233A JUMP JUMPDEST SWAP4 POP POP POP JUMPDEST PUSH1 0x1 DUP4 ADD SLOAD DUP4 SLOAD PUSH2 0xBED SWAP2 PUSH2 0x8D4 SWAP2 PUSH5 0xE8D4A51000 SWAP1 PUSH2 0xBDF SWAP1 DUP8 PUSH2 0x2179 JUMP JUMPDEST DUP2 PUSH2 0xBE6 JUMPI INVALID JUMPDEST DIV SWAP1 PUSH2 0x21B6 JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x0 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 PUSH4 0x70A08231 SWAP1 PUSH2 0xC27 SWAP1 CALLER SWAP1 PUSH1 0x4 ADD PUSH2 0x29CA JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xC3F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xC53 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xC77 SWAP2 SWAP1 PUSH2 0x287F JUMP JUMPDEST SWAP1 POP DUP1 PUSH2 0xC96 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x5BE SWAP1 PUSH2 0x2B5D JUMP JUMPDEST PUSH2 0xCAB PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND CALLER ADDRESS DUP5 PUSH2 0x235D JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH4 0x95EA7B3 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 PUSH4 0x95EA7B3 SWAP1 PUSH2 0xCF9 SWAP1 PUSH32 0x0 SWAP1 DUP6 SWAP1 PUSH1 0x4 ADD PUSH2 0x2A43 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xD13 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xD27 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xD4B SWAP2 SWAP1 PUSH2 0x26AF JUMP JUMPDEST POP PUSH1 0x40 MLOAD PUSH4 0x1C57762B PUSH1 0xE3 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 AND SWAP1 PUSH4 0xE2BBB158 SWAP1 PUSH2 0xDBA SWAP1 PUSH32 0x0 SWAP1 DUP6 SWAP1 PUSH1 0x4 ADD PUSH2 0x2F31 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xDD4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xDE8 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH32 0x98A9BD3B7A617581FC53B1E2992534E0E0CB5091C9D44AA1A7FC978F706CAA83 SWAP3 POP PUSH1 0x0 SWAP2 POP LOG1 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0xE43 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x5BE SWAP1 PUSH2 0x2CFE JUMP JUMPDEST PUSH1 0x2 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP5 MSTORE SWAP1 SWAP2 MSTORE DUP2 KECCAK256 DUP1 SLOAD DUP3 DUP3 SSTORE PUSH1 0x1 DUP3 ADD DUP4 SWAP1 SSTORE PUSH1 0x5 DUP1 SLOAD SWAP3 SWAP4 SWAP2 SWAP3 DUP7 SWAP1 DUP2 LT PUSH2 0xE9C JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 POP DUP1 ISZERO PUSH2 0xF21 JUMPI PUSH1 0x40 MLOAD PUSH4 0x45FB1BA1 PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND SWAP1 PUSH4 0x8BF63742 SWAP1 PUSH2 0xEEE SWAP1 DUP9 SWAP1 CALLER SWAP1 DUP10 SWAP1 PUSH1 0x0 SWAP1 DUP2 SWAP1 PUSH1 0x4 ADD PUSH2 0x2EF2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xF08 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xF1C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST PUSH2 0xF33 DUP5 DUP4 PUSH1 0x4 DUP9 DUP2 SLOAD DUP2 LT PUSH2 0x7A9 JUMPI INVALID JUMPDEST DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x2CAC5E20E1541D836381527A43F651851E302817B71DC8E810284E69210C1C6B DUP6 PUSH1 0x40 MLOAD PUSH2 0xF77 SWAP2 SWAP1 PUSH2 0x2EE9 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xFAE JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x5BE SWAP1 PUSH2 0x2D9F JUMP JUMPDEST PUSH1 0x0 PUSH1 0x4 DUP3 DUP2 SLOAD DUP2 LT PUSH2 0xFBD JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 KECCAK256 ADD SLOAD PUSH1 0x40 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP3 POP DUP3 SWAP1 PUSH4 0x70A08231 SWAP1 PUSH2 0xFF8 SWAP1 ADDRESS SWAP1 PUSH1 0x4 ADD PUSH2 0x29CA JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1010 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1024 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1048 SWAP2 SWAP1 PUSH2 0x287F JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH1 0x40 MLOAD PUSH4 0x95EA7B3 PUSH1 0xE0 SHL DUP2 MSTORE SWAP2 SWAP3 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND SWAP3 PUSH4 0x95EA7B3 SWAP3 PUSH2 0x107D SWAP3 AND SWAP1 DUP6 SWAP1 PUSH1 0x4 ADD PUSH2 0x2A43 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1097 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x10AB JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x10CF SWAP2 SWAP1 PUSH2 0x26AF JUMP JUMPDEST POP PUSH1 0x2 SLOAD PUSH1 0x40 MLOAD PUSH4 0xCE5494BB PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH4 0xCE5494BB SWAP1 PUSH2 0x1101 SWAP1 DUP7 SWAP1 PUSH1 0x4 ADD PUSH2 0x29CA JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x111B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x112F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1153 SWAP2 SWAP1 PUSH2 0x26E7 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE SWAP1 SWAP2 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND SWAP1 PUSH4 0x70A08231 SWAP1 PUSH2 0x1182 SWAP1 ADDRESS SWAP1 PUSH1 0x4 ADD PUSH2 0x29CA JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x119A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x11AE JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x11D2 SWAP2 SWAP1 PUSH2 0x287F JUMP JUMPDEST DUP3 EQ PUSH2 0x11F0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x5BE SWAP1 PUSH2 0x2C47 JUMP JUMPDEST DUP1 PUSH1 0x4 DUP6 DUP2 SLOAD DUP2 LT PUSH2 0x11FE JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB MUL NOT AND SWAP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND MUL OR SWAP1 SSTORE POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER DUP2 EQ PUSH2 0x125D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x5BE SWAP1 PUSH2 0x2D33 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND SWAP4 SWAP3 AND SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 LOG3 PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP3 DUP4 AND OR SWAP1 SSTORE PUSH1 0x1 DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH4 0x1C57762B PUSH1 0xE3 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 AND SWAP1 PUSH4 0xE2BBB158 SWAP1 PUSH2 0x132E SWAP1 PUSH32 0x0 SWAP1 PUSH1 0x0 SWAP1 PUSH1 0x4 ADD PUSH2 0x2F31 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1348 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x135C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x136A PUSH2 0x2575 JUMP JUMPDEST PUSH1 0x3 DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x1377 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP2 DUP3 SWAP1 KECCAK256 PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE SWAP3 SWAP1 SWAP2 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP2 AND DUP4 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB PUSH1 0x1 PUSH1 0x80 SHL DUP3 DIV DUP2 AND SWAP5 DUP5 ADD DUP6 SWAP1 MSTORE PUSH1 0x1 PUSH1 0xC0 SHL SWAP1 SWAP2 DIV AND SWAP1 DUP3 ADD MSTORE SWAP2 POP NUMBER GT ISZERO PUSH2 0x15D7 JUMPI PUSH1 0x0 PUSH1 0x4 DUP4 DUP2 SLOAD DUP2 LT PUSH2 0x13D9 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x40 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0x70A08231 SWAP1 PUSH2 0x1412 SWAP1 ADDRESS SWAP1 PUSH1 0x4 ADD PUSH2 0x29CA JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x142A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x143E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1462 SWAP2 SWAP1 PUSH2 0x287F JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x14FB JUMPI PUSH1 0x0 PUSH2 0x148C DUP4 PUSH1 0x20 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND NUMBER PUSH2 0x2203 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH1 0x7 SLOAD PUSH2 0x14AF DUP6 PUSH1 0x40 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND PUSH2 0xB87 PUSH2 0xB80 PUSH2 0x1C02 JUMP JUMPDEST DUP2 PUSH2 0x14B6 JUMPI INVALID JUMPDEST DIV SWAP1 POP PUSH2 0x14ED PUSH2 0x14DC DUP5 PUSH2 0x14CF DUP5 PUSH5 0xE8D4A51000 PUSH2 0x2179 JUMP JUMPDEST DUP2 PUSH2 0x14D6 JUMPI INVALID JUMPDEST DIV PUSH2 0x244E JUMP JUMPDEST DUP6 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND SWAP1 PUSH2 0x2477 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP5 MSTORE POP POP JUMPDEST PUSH2 0x1504 NUMBER PUSH2 0x24A6 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x3 DUP1 SLOAD DUP4 SWAP2 SWAP1 DUP6 SWAP1 DUP2 LT PUSH2 0x1523 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP2 DUP3 SWAP1 KECCAK256 DUP4 MLOAD SWAP2 ADD DUP1 SLOAD DUP5 DUP5 ADD MLOAD PUSH1 0x40 SWAP6 DUP7 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB NOT SWAP1 SWAP3 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR PUSH8 0xFFFFFFFFFFFFFFFF PUSH1 0x80 SHL NOT AND PUSH1 0x1 PUSH1 0x80 SHL PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB SWAP5 DUP6 AND MUL OR PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND PUSH1 0x1 PUSH1 0xC0 SHL SWAP4 SWAP1 SWAP2 AND SWAP3 SWAP1 SWAP3 MUL SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE DUP4 ADD MLOAD DUP4 MLOAD SWAP2 MLOAD DUP6 SWAP3 PUSH32 0xFC9545022A542541AD085D091FB09A2AB36FEE366A4576AB63714EA907AD353 SWAP3 PUSH2 0x15CD SWAP3 SWAP1 SWAP2 DUP7 SWAP2 PUSH2 0x2F3F JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST DUP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x135C JUMPI PUSH2 0x1603 DUP5 DUP5 DUP4 DUP2 DUP2 LT PUSH2 0x15F7 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD PUSH2 0x1362 JUMP JUMPDEST POP PUSH1 0x1 ADD PUSH2 0x15E0 JUMP JUMPDEST PUSH32 0x0 DUP2 JUMP JUMPDEST PUSH1 0x4 DUP2 DUP2 SLOAD DUP2 LT PUSH2 0x163D JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 POP DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH4 0xD505ACCF PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP10 AND SWAP1 PUSH4 0xD505ACCF SWAP1 PUSH2 0x168F SWAP1 DUP11 SWAP1 DUP11 SWAP1 DUP11 SWAP1 DUP11 SWAP1 DUP11 SWAP1 DUP11 SWAP1 DUP11 SWAP1 PUSH1 0x4 ADD PUSH2 0x2A02 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x16A9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x16BD JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0x1704 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x5BE SWAP1 PUSH2 0x2CFE JUMP JUMPDEST PUSH2 0x1743 DUP4 PUSH2 0x173D PUSH1 0x3 DUP8 DUP2 SLOAD DUP2 LT PUSH2 0x1718 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x7 SLOAD SWAP1 PUSH1 0x1 PUSH1 0xC0 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND PUSH2 0x2203 JUMP JUMPDEST SWAP1 PUSH2 0x233A JUMP JUMPDEST PUSH1 0x7 SSTORE PUSH2 0x174F DUP4 PUSH2 0x24A6 JUMP JUMPDEST PUSH1 0x3 DUP6 DUP2 SLOAD DUP2 LT PUSH2 0x175C JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 ADD PUSH1 0x18 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB MUL NOT AND SWAP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND MUL OR SWAP1 SSTORE POP DUP1 ISZERO PUSH2 0x17D0 JUMPI DUP2 PUSH1 0x5 DUP6 DUP2 SLOAD DUP2 LT PUSH2 0x17A1 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB MUL NOT AND SWAP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND MUL OR SWAP1 SSTORE POP JUMPDEST DUP1 PUSH2 0x17FC JUMPI PUSH1 0x5 DUP5 DUP2 SLOAD DUP2 LT PUSH2 0x17E2 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x17FE JUMP JUMPDEST DUP2 JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH32 0x95895A6AB1DF54420D241B55243258A33E61B2194DB66C1179EC521AAE8E1865 DUP6 DUP5 PUSH1 0x40 MLOAD PUSH2 0x1839 SWAP3 SWAP2 SWAP1 PUSH2 0x2F21 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH2 0x185E PUSH2 0x2575 JUMP JUMPDEST PUSH2 0x1867 DUP5 PUSH2 0x1362 JUMP JUMPDEST PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 DUP1 SLOAD SWAP2 SWAP3 POP SWAP1 PUSH2 0x1899 SWAP1 DUP6 PUSH2 0x233A JUMP JUMPDEST DUP2 SSTORE DUP2 MLOAD PUSH2 0x18D0 SWAP1 PUSH5 0xE8D4A51000 SWAP1 PUSH2 0x18BC SWAP1 DUP8 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x2179 JUMP JUMPDEST DUP2 PUSH2 0x18C3 JUMPI INVALID JUMPDEST PUSH1 0x1 DUP5 ADD SLOAD SWAP2 SWAP1 DIV PUSH2 0x24CF JUMP JUMPDEST DUP2 PUSH1 0x1 ADD DUP2 SWAP1 SSTORE POP PUSH1 0x0 PUSH1 0x5 DUP7 DUP2 SLOAD DUP2 LT PUSH2 0x18E7 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 POP DUP1 ISZERO PUSH2 0x196D JUMPI DUP2 SLOAD PUSH1 0x40 MLOAD PUSH4 0x45FB1BA1 PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP2 PUSH4 0x8BF63742 SWAP2 PUSH2 0x193A SWAP2 DUP11 SWAP2 DUP10 SWAP2 DUP3 SWAP2 PUSH1 0x0 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0x2EF2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1954 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1968 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST PUSH2 0x199D CALLER ADDRESS DUP8 PUSH1 0x4 DUP11 DUP2 SLOAD DUP2 LT PUSH2 0x1980 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP3 SWAP2 SWAP1 PUSH2 0x235D JUMP JUMPDEST DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP7 CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x2D7E648DD130FC184D383E55BB126AC4C9C60E8F94BF05ACDF557BA2D540B47 DUP9 PUSH1 0x40 MLOAD PUSH2 0x809 SWAP2 SWAP1 PUSH2 0x2EE9 JUMP JUMPDEST PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 SWAP1 SWAP2 ADD SLOAD DUP3 JUMP JUMPDEST PUSH32 0x0 DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0x1A53 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x5BE SWAP1 PUSH2 0x2CFE JUMP JUMPDEST PUSH1 0x7 SLOAD NUMBER SWAP1 PUSH2 0x1A62 SWAP1 DUP6 PUSH2 0x233A JUMP JUMPDEST PUSH1 0x7 SSTORE PUSH1 0x4 DUP1 SLOAD PUSH1 0x1 DUP2 DUP2 ADD SWAP1 SWAP3 SSTORE PUSH32 0x8A35ACFBC15FF81A39AE7D344FD709F28E8600B4AA8C65C6B64BFE7FE36BD19B ADD DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP8 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP3 DUP4 AND OR SWAP1 SWAP3 SSTORE PUSH1 0x5 DUP1 SLOAD SWAP4 DUP5 ADD DUP2 SSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH32 0x36B6384B5ECA791C62761152D0C79BB0604C104A5FB6F4EB0703F3154BB3DB0 SWAP1 SWAP4 ADD DUP1 SLOAD SWAP3 DUP7 AND SWAP3 SWAP1 SWAP2 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD SWAP1 SWAP2 MSTORE SWAP1 DUP2 MSTORE PUSH1 0x3 SWAP1 PUSH1 0x20 DUP2 ADD PUSH2 0x1B0F DUP5 PUSH2 0x24A6 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1B26 DUP8 PUSH2 0x24A6 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB SWAP1 DUP2 AND SWAP1 SWAP2 MSTORE DUP3 SLOAD PUSH1 0x1 DUP2 DUP2 ADD DUP6 SSTORE PUSH1 0x0 SWAP5 DUP6 MSTORE PUSH1 0x20 SWAP5 DUP6 SWAP1 KECCAK256 DUP5 MLOAD SWAP3 ADD DUP1 SLOAD SWAP6 DUP6 ADD MLOAD PUSH1 0x40 SWAP1 SWAP6 ADD MLOAD DUP5 AND PUSH1 0x1 PUSH1 0xC0 SHL MUL PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB SWAP6 SWAP1 SWAP5 AND PUSH1 0x1 PUSH1 0x80 SHL MUL PUSH8 0xFFFFFFFFFFFFFFFF PUSH1 0x80 SHL NOT PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP1 SWAP5 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB NOT SWAP1 SWAP8 AND SWAP7 SWAP1 SWAP7 OR SWAP3 SWAP1 SWAP3 AND SWAP5 SWAP1 SWAP5 OR SWAP3 SWAP1 SWAP3 AND OR SWAP1 SSTORE PUSH1 0x4 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND SWAP3 SWAP1 DUP7 AND SWAP2 PUSH2 0x1BC5 SWAP2 PUSH2 0x2203 JUMP JUMPDEST PUSH32 0x81EE0F8C5C46E2CB41984886F77A84181724ABB86C32A5F6DE539B07509D45E5 DUP8 PUSH1 0x40 MLOAD PUSH2 0x1BF4 SWAP2 SWAP1 PUSH2 0x2EE9 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH32 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x17CAF6F1 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1C5D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1C71 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1C95 SWAP2 SWAP1 PUSH2 0x287F JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH4 0x1526FE27 PUSH1 0xE0 SHL DUP2 MSTORE PUSH2 0x1D69 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 AND SWAP1 PUSH4 0x1526FE27 SWAP1 PUSH2 0x1D05 SWAP1 PUSH32 0x0 SWAP1 PUSH1 0x4 ADD PUSH2 0x2EE9 JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1D1D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1D31 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1D55 SWAP2 SWAP1 PUSH2 0x2815 JUMP JUMPDEST PUSH1 0x20 ADD MLOAD PUSH9 0x56BC75E2D63100000 SWAP1 PUSH2 0x2179 JUMP JUMPDEST DUP2 PUSH2 0x1D70 JUMPI INVALID JUMPDEST DIV SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x5 DUP2 DUP2 SLOAD DUP2 LT PUSH2 0x163D JUMPI INVALID JUMPDEST PUSH2 0x1D8B PUSH2 0x2575 JUMP JUMPDEST PUSH2 0x1D94 DUP5 PUSH2 0x1362 JUMP JUMPDEST PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP5 MSTORE SWAP1 SWAP2 MSTORE DUP2 KECCAK256 DUP3 MLOAD DUP2 SLOAD SWAP4 SWAP5 POP SWAP1 SWAP3 PUSH5 0xE8D4A51000 SWAP2 PUSH2 0x1DD0 SWAP2 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x2179 JUMP JUMPDEST DUP2 PUSH2 0x1DD7 JUMPI INVALID JUMPDEST DIV SWAP1 POP PUSH1 0x0 PUSH2 0x1DF6 PUSH2 0x8D4 DUP5 PUSH1 0x1 ADD SLOAD DUP5 PUSH2 0x21B6 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 POP PUSH2 0x1E31 PUSH5 0xE8D4A51000 PUSH2 0x1E21 DUP7 PUSH1 0x0 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP10 PUSH2 0x2179 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP2 PUSH2 0x1E28 JUMPI INVALID JUMPDEST DUP5 SWAP2 SWAP1 DIV PUSH2 0x21B6 JUMP JUMPDEST PUSH1 0x1 DUP5 ADD SSTORE DUP3 SLOAD PUSH2 0x1E42 SWAP1 DUP8 PUSH2 0x2203 JUMP JUMPDEST DUP4 SSTORE PUSH2 0x1E78 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 AND DUP7 DUP4 PUSH2 0x2226 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x5 DUP9 DUP2 SLOAD DUP2 LT PUSH2 0x1E87 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 POP DUP1 ISZERO PUSH2 0x1F0C JUMPI DUP4 SLOAD PUSH1 0x40 MLOAD PUSH4 0x45FB1BA1 PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP2 PUSH4 0x8BF63742 SWAP2 PUSH2 0x1ED9 SWAP2 DUP13 SWAP2 CALLER SWAP2 DUP13 SWAP2 DUP10 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0x2EF2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1EF3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1F07 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST PUSH2 0x1F1E DUP7 DUP9 PUSH1 0x4 DUP12 DUP2 SLOAD DUP2 LT PUSH2 0x7A9 JUMPI INVALID JUMPDEST DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP9 CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x8166BF25F8A2B7ED3C85049207DA4358D16EDBED977D23FA2EE6F0DDE3EC2132 DUP11 PUSH1 0x40 MLOAD PUSH2 0x1F62 SWAP2 SWAP1 PUSH2 0x2EE9 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 DUP8 CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x71BAB65CED2E5750775A0613BE067DF48EF06CF92A496EBF7663AE0660924954 DUP5 PUSH1 0x40 MLOAD PUSH2 0x1FA4 SWAP2 SWAP1 PUSH2 0x2EE9 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT DUP1 ISZERO PUSH2 0x1FCF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x1FF9 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP SWAP2 POP DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT DUP1 ISZERO PUSH2 0x2012 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x2046 JUMPI DUP2 PUSH1 0x20 ADD JUMPDEST PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x2031 JUMPI SWAP1 POP JUMPDEST POP SWAP1 POP PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x213D JUMPI PUSH1 0x0 PUSH1 0x60 ADDRESS DUP9 DUP9 DUP6 DUP2 DUP2 LT PUSH2 0x2065 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x2077 SWAP2 SWAP1 PUSH2 0x2F69 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x2085 SWAP3 SWAP2 SWAP1 PUSH2 0x299E JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x20C0 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x20C5 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 DUP1 PUSH2 0x20D4 JUMPI POP DUP6 ISZERO JUMPDEST PUSH2 0x20DD DUP3 PUSH2 0x2515 JUMP JUMPDEST SWAP1 PUSH2 0x20FB JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x5BE SWAP2 SWAP1 PUSH2 0x2AF6 JUMP JUMPDEST POP DUP2 DUP6 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0x2109 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD SWAP1 ISZERO ISZERO SWAP1 DUP2 ISZERO ISZERO DUP2 MSTORE POP POP DUP1 DUP5 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0x2128 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE POP POP PUSH1 0x1 ADD PUSH2 0x204C JUMP JUMPDEST POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH32 0x0 DUP2 JUMP JUMPDEST PUSH1 0x0 DUP2 ISZERO DUP1 PUSH2 0x2194 JUMPI POP POP DUP1 DUP3 MUL DUP3 DUP3 DUP3 DUP2 PUSH2 0x2191 JUMPI INVALID JUMPDEST DIV EQ JUMPDEST PUSH2 0x21B0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x5BE SWAP1 PUSH2 0x2E4F JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 SUB DUP2 DUP4 SLT DUP1 ISZERO SWAP1 PUSH2 0x21CB JUMPI POP DUP4 DUP2 SGT ISZERO JUMPDEST DUP1 PUSH2 0x21E0 JUMPI POP PUSH1 0x0 DUP4 SLT DUP1 ISZERO PUSH2 0x21E0 JUMPI POP DUP4 DUP2 SGT JUMPDEST PUSH2 0x21FC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x5BE SWAP1 PUSH2 0x2DD6 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP1 DUP3 SUB DUP3 DUP2 GT ISZERO PUSH2 0x21B0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x5BE SWAP1 PUSH2 0x2B09 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xA9059CBB DUP6 DUP6 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x224C SWAP3 SWAP2 SWAP1 PUSH2 0x2A43 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP1 PUSH1 0xE0 SHL PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB DUP4 DUP2 DUP4 AND OR DUP4 MSTORE POP POP POP POP PUSH1 0x40 MLOAD PUSH2 0x2285 SWAP2 SWAP1 PUSH2 0x29AE JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x22C2 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x22C7 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 DUP1 ISZERO PUSH2 0x22F1 JUMPI POP DUP1 MLOAD ISZERO DUP1 PUSH2 0x22F1 JUMPI POP DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x22F1 SWAP2 SWAP1 PUSH2 0x26AF JUMP JUMPDEST PUSH2 0x230D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x5BE SWAP1 PUSH2 0x2BA0 JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 SLT ISZERO PUSH2 0x2336 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x5BE SWAP1 PUSH2 0x2B38 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST DUP2 DUP2 ADD DUP2 DUP2 LT ISZERO PUSH2 0x21B0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x5BE SWAP1 PUSH2 0x2CC7 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x23B872DD DUP7 DUP7 DUP7 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x2385 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x29DE JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP1 PUSH1 0xE0 SHL PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB DUP4 DUP2 DUP4 AND OR DUP4 MSTORE POP POP POP POP PUSH1 0x40 MLOAD PUSH2 0x23BE SWAP2 SWAP1 PUSH2 0x29AE JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x23FB JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x2400 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 DUP1 ISZERO PUSH2 0x242A JUMPI POP DUP1 MLOAD ISZERO DUP1 PUSH2 0x242A JUMPI POP DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x242A SWAP2 SWAP1 PUSH2 0x26AF JUMP JUMPDEST PUSH2 0x2446 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x5BE SWAP1 PUSH2 0x2E1A JUMP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP3 GT ISZERO PUSH2 0x2336 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x5BE SWAP1 PUSH2 0x2C90 JUMP JUMPDEST DUP2 DUP2 ADD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP4 AND SWAP1 DUP3 AND LT ISZERO PUSH2 0x21B0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x5BE SWAP1 PUSH2 0x2CC7 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP3 GT ISZERO PUSH2 0x2336 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x5BE SWAP1 PUSH2 0x2D68 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP2 DUP4 SLT DUP1 ISZERO SWAP1 PUSH2 0x24E4 JUMPI POP DUP4 DUP2 SLT ISZERO JUMPDEST DUP1 PUSH2 0x24F9 JUMPI POP PUSH1 0x0 DUP4 SLT DUP1 ISZERO PUSH2 0x24F9 JUMPI POP DUP4 DUP2 SLT JUMPDEST PUSH2 0x21FC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x5BE SWAP1 PUSH2 0x2BD7 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x44 DUP3 MLOAD LT ISZERO PUSH2 0x255B JUMPI POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x1D DUP2 MSTORE PUSH32 0x5472616E73616374696F6E2072657665727465642073696C656E746C79000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x15D7 JUMP JUMPDEST PUSH1 0x4 DUP3 ADD SWAP2 POP DUP2 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x21B0 SWAP2 SWAP1 PUSH2 0x278A JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x25A6 JUMPI DUP2 DUP3 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x25BC JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP1 DUP4 MUL DUP6 ADD ADD GT ISZERO PUSH2 0x25D6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x25F1 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x25FC DUP2 PUSH2 0x2FFF JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x260C DUP2 PUSH2 0x3017 JUMP JUMPDEST SWAP2 POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH2 0x261C DUP2 PUSH2 0x3017 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x40 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x263B JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x2650 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x265C DUP7 DUP3 DUP8 ADD PUSH2 0x2595 JUMP JUMPDEST SWAP1 SWAP5 POP SWAP3 POP POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x261C DUP2 PUSH2 0x3017 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x20 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x2682 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x2697 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x26A3 DUP6 DUP3 DUP7 ADD PUSH2 0x2595 JUMP JUMPDEST SWAP1 SWAP7 SWAP1 SWAP6 POP SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x26C0 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x21FC DUP2 PUSH2 0x3017 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x26DC JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x21FC DUP2 PUSH2 0x2FFF JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x26F8 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x21FC DUP2 PUSH2 0x2FFF JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH2 0x100 DUP10 DUP12 SUB SLT ISZERO PUSH2 0x271F JUMPI DUP4 DUP5 REVERT JUMPDEST DUP9 CALLDATALOAD PUSH2 0x272A DUP2 PUSH2 0x2FFF JUMP JUMPDEST SWAP8 POP PUSH1 0x20 DUP10 ADD CALLDATALOAD PUSH2 0x273A DUP2 PUSH2 0x2FFF JUMP JUMPDEST SWAP7 POP PUSH1 0x40 DUP10 ADD CALLDATALOAD PUSH2 0x274A DUP2 PUSH2 0x2FFF JUMP JUMPDEST SWAP6 POP PUSH1 0x60 DUP10 ADD CALLDATALOAD SWAP5 POP PUSH1 0x80 DUP10 ADD CALLDATALOAD SWAP4 POP PUSH1 0xA0 DUP10 ADD CALLDATALOAD PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0x276D JUMPI DUP4 DUP5 REVERT JUMPDEST SWAP8 SWAP11 SWAP7 SWAP10 POP SWAP5 SWAP8 SWAP4 SWAP7 SWAP3 SWAP6 SWAP3 SWAP5 POP POP POP PUSH1 0xC0 DUP3 ADD CALLDATALOAD SWAP2 PUSH1 0xE0 ADD CALLDATALOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x279B JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 GT ISZERO PUSH2 0x27B1 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 DUP5 ADD SWAP2 POP DUP5 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x27C4 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 MLOAD DUP2 DUP2 GT ISZERO PUSH2 0x27D2 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x27E5 PUSH1 0x1F DUP3 ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD PUSH2 0x2FAD JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE DUP6 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x27FB JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x280C DUP2 PUSH1 0x20 DUP5 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x2FD3 JUMP JUMPDEST POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2826 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x2830 PUSH1 0x80 PUSH2 0x2FAD JUMP JUMPDEST DUP3 MLOAD PUSH2 0x283B DUP2 PUSH2 0x2FFF JUMP JUMPDEST DUP1 DUP3 MSTORE POP PUSH1 0x20 DUP4 ADD MLOAD PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 DUP4 ADD MLOAD PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 DUP4 ADD MLOAD PUSH1 0x60 DUP3 ADD MSTORE DUP1 SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2878 JUMPI DUP1 DUP2 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2890 JUMPI DUP1 DUP2 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x28A9 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH2 0x28BB DUP2 PUSH2 0x2FFF JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x28DA JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 CALLDATALOAD SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x28EC DUP2 PUSH2 0x2FFF JUMP JUMPDEST SWAP2 POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH2 0x261C DUP2 PUSH2 0x2FFF JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x2910 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 CALLDATALOAD SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD SWAP2 POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH2 0x261C DUP2 PUSH2 0x2FFF JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x293E JUMPI DUP2 DUP3 REVERT JUMPDEST DUP5 CALLDATALOAD SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP3 POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH2 0x2957 DUP2 PUSH2 0x2FFF JUMP JUMPDEST SWAP2 POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH2 0x2967 DUP2 PUSH2 0x3017 JUMP JUMPDEST SWAP4 SWAP7 SWAP3 SWAP6 POP SWAP1 SWAP4 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH2 0x298A DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x2FD3 JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP5 DUP4 CALLDATACOPY SWAP2 ADD SWAP1 DUP2 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x29C0 DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x2FD3 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 DUP5 AND DUP2 MSTORE SWAP2 SWAP1 SWAP3 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP8 DUP9 AND DUP2 MSTORE SWAP6 SWAP1 SWAP7 AND PUSH1 0x20 DUP7 ADD MSTORE PUSH1 0x40 DUP6 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x60 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xFF AND PUSH1 0x80 DUP4 ADD MSTORE PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xC0 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xE0 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 DUP3 MSTORE DUP4 MLOAD SWAP1 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP1 PUSH1 0x20 SWAP1 PUSH1 0x60 DUP5 ADD SWAP1 DUP3 DUP8 ADD DUP5 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x2A97 JUMPI DUP2 MLOAD ISZERO ISZERO DUP5 MSTORE SWAP3 DUP5 ADD SWAP3 SWAP1 DUP5 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x2A79 JUMP JUMPDEST POP POP POP DUP4 DUP2 SUB DUP3 DUP6 ADD MSTORE DUP1 DUP6 MLOAD PUSH2 0x2AAE DUP2 DUP5 PUSH2 0x2EE9 JUMP JUMPDEST SWAP2 POP DUP2 SWAP3 POP DUP4 DUP2 MUL DUP3 ADD DUP5 DUP9 ADD DUP7 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x2AE7 JUMPI DUP6 DUP4 SUB DUP6 MSTORE PUSH2 0x2AD5 DUP4 DUP4 MLOAD PUSH2 0x2972 JUMP JUMPDEST SWAP5 DUP8 ADD SWAP5 SWAP3 POP SWAP1 DUP7 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x2ABD JUMP JUMPDEST POP SWAP1 SWAP10 SWAP9 POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE PUSH2 0x21FC PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x2972 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x15 SWAP1 DUP3 ADD MSTORE PUSH21 0x426F72696E674D6174683A20556E646572666C6F77 PUSH1 0x58 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0xB SWAP1 DUP3 ADD MSTORE PUSH11 0x496E7465676572203C203 PUSH1 0xAC SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x23 SWAP1 DUP3 ADD MSTORE PUSH32 0x4D61737465724368656656323A2042616C616E6365206D757374206578636565 PUSH1 0x40 DUP3 ADD MSTORE PUSH3 0x64203 PUSH1 0xEC SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1C SWAP1 DUP3 ADD MSTORE PUSH32 0x426F72696E6745524332303A205472616E73666572206661696C656400000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x21 SWAP1 DUP3 ADD MSTORE PUSH32 0x5369676E6564536166654D6174683A206164646974696F6E206F766572666C6F PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x77 PUSH1 0xF8 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x15 SWAP1 DUP3 ADD MSTORE PUSH21 0x4F776E61626C653A207A65726F2061646472657373 PUSH1 0x58 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x29 SWAP1 DUP3 ADD MSTORE PUSH32 0x4D61737465724368656656323A206D696772617465642062616C616E6365206D PUSH1 0x40 DUP3 ADD MSTORE PUSH9 0xEAE6E840DAC2E8C6D PUSH1 0xBB SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1C SWAP1 DUP3 ADD MSTORE PUSH32 0x426F72696E674D6174683A2075696E74313238204F766572666C6F7700000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x18 SWAP1 DUP3 ADD MSTORE PUSH32 0x426F72696E674D6174683A20416464204F766572666C6F770000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C657220213D2070656E64696E67206F776E6572 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1B SWAP1 DUP3 ADD MSTORE PUSH32 0x426F72696E674D6174683A2075696E743634204F766572666C6F770000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1D SWAP1 DUP3 ADD MSTORE PUSH32 0x4D61737465724368656656323A206E6F206D69677261746F7220736574000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x24 SWAP1 DUP3 ADD MSTORE PUSH32 0x5369676E6564536166654D6174683A207375627472616374696F6E206F766572 PUSH1 0x40 DUP3 ADD MSTORE PUSH4 0x666C6F77 PUSH1 0xE0 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD MSTORE PUSH32 0x426F72696E6745524332303A205472616E7366657246726F6D206661696C6564 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x18 SWAP1 DUP3 ADD MSTORE PUSH32 0x426F72696E674D6174683A204D756C204F766572666C6F770000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH1 0x20 DUP1 DUP4 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB SWAP1 DUP2 AND SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 SWAP3 DUP4 ADD MLOAD AND SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP4 SWAP1 SWAP4 AND DUP4 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB SWAP2 DUP3 AND PUSH1 0x20 DUP5 ADD MSTORE AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP5 DUP6 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 DUP5 AND PUSH1 0x20 DUP7 ADD MSTORE SWAP2 SWAP1 SWAP3 AND PUSH1 0x40 DUP5 ADD MSTORE PUSH1 0x60 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0xA0 ADD SWAP1 JUMP JUMPDEST SWAP2 DUP3 MSTORE ISZERO ISZERO PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB SWAP4 SWAP1 SWAP4 AND DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH1 0x1E NOT DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x2F7F JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP3 GT ISZERO PUSH2 0x2F98 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0x25D6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x2FCB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x2FEE JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x2FD6 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x135C JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x3014 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x3014 JUMPI PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DUP2 0x4E 0x5D REVERT 0xEE PUSH1 0x6B SWAP16 0xF8 CALLDATALOAD PUSH27 0x8C99C275BC5BEE65FD89E04F2E557682DA8CCC9F4264736F6C6343 STOP MOD 0xC STOP CALLER ", + "sourceMap": "1098:13971:5:-:0;;;3839:182;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;639:5:1;:18;;-1:-1:-1;;;;;;639:18:1;647:10;639:18;;;;;673:44;;647:10;;639:5;673:44;;639:5;;673:44;-1:-1:-1;;;;;;3930:26:5;;;;;;;;3966:14;;;;;;;3990:24;;1098:13971;;496:603:-1;;;;679:2;667:9;658:7;654:23;650:32;647:2;;;-1:-1;;685:12;647:2;278:6;272:13;290:53;337:5;290:53;:::i;:::-;868:2;932:22;;97:13;737:94;;-1:-1;115:47;97:13;115:47;:::i;:::-;876:88;;;;1001:2;1055:9;1051:22;433:13;1009:74;;641:458;;;;;:::o;1641:145::-;-1:-1;;;;;1496:54;;1714:49;;1704:2;;1777:1;;1767:12;1704:2;1698:88;:::o;:::-;1098:13971:5;;;;;;;;;;;;;;;;;;;" + }, + "deployedBytecode": { + "immutableReferences": { + "890": [ + { + "length": 32, + "start": 3279 + }, + { + "length": 32, + "start": 3427 + }, + { + "length": 32, + "start": 4822 + }, + { + "length": 32, + "start": 7174 + }, + { + "length": 32, + "start": 7344 + }, + { + "length": 32, + "start": 8535 + } + ], + "893": [ + { + "length": 32, + "start": 2293 + }, + { + "length": 32, + "start": 6663 + }, + { + "length": 32, + "start": 7761 + } + ], + "896": [ + { + "length": 32, + "start": 3472 + }, + { + "length": 32, + "start": 4867 + }, + { + "length": 32, + "start": 5646 + }, + { + "length": 32, + "start": 7389 + } + ] + }, + "linkReferences": {}, + "object": "6080604052600436106101d85760003560e01c806361621aaa11610102578063ab560e1011610095578063d1abb90711610064578063d1abb90714610529578063d2423b5114610549578063e30c39781461056a578063edd8b1701461057f576101d8565b8063ab560e10146104bf578063ab7de098146104d4578063b0bcf42a146104f4578063c346253d14610509576101d8565b806388bba42f116100d157806388bba42f1461043c5780638da5cb5b1461045c5780638dbdbe6d1461047157806393f1a40b14610491576101d8565b806361621aaa146103c557806378ed5d1f146103da5780637c516e94146104075780637cd07e4714610427576101d8565b806319ab453c1161017a5780634e71e0c8116101495780634e71e0c81461034e5780634f70b15a1461036357806351eb05a61461037857806357a5b58c146103a5576101d8565b806319ab453c146102ce57806323cf3118146102ee5780632f940c701461030e578063454b06081461032e576101d8565b80631526fe27116101b65780631526fe271461024a57806317caf6f11461027957806318fccc761461028e578063195426ec146102ae576101d8565b8063078dfbe7146101dd578063081e3eda146101ff5780630ad58d2f1461022a575b600080fd5b3480156101e957600080fd5b506101fd6101f83660046125dd565b610594565b005b34801561020b57600080fd5b50610214610683565b6040516102219190612ee9565b60405180910390f35b34801561023657600080fd5b506101fd6102453660046128fc565b610689565b34801561025657600080fd5b5061026a610265366004612867565b610819565b60405161022193929190612ebf565b34801561028557600080fd5b5061021461085b565b34801561029a57600080fd5b506101fd6102a9366004612897565b610861565b3480156102ba57600080fd5b506102146102c9366004612897565b6109fb565b3480156102da57600080fd5b506101fd6102e93660046126cb565b610bf8565b3480156102fa57600080fd5b506101fd6103093660046126cb565b610e19565b34801561031a57600080fd5b506101fd610329366004612897565b610e65565b34801561033a57600080fd5b506101fd610349366004612867565b610f86565b34801561035a57600080fd5b506101fd611232565b34801561036f57600080fd5b506101fd6112bf565b34801561038457600080fd5b50610398610393366004612867565b611362565b6040516102219190612e86565b3480156103b157600080fd5b506101fd6103c0366004612670565b6115dc565b3480156103d157600080fd5b5061021461160c565b3480156103e657600080fd5b506103fa6103f5366004612867565b611630565b60405161022191906129ca565b34801561041357600080fd5b506101fd610422366004612703565b611657565b34801561043357600080fd5b506103fa6116cb565b34801561044857600080fd5b506101fd610457366004612929565b6116da565b34801561046857600080fd5b506103fa611847565b34801561047d57600080fd5b506101fd61048c3660046128fc565b611856565b34801561049d57600080fd5b506104b16104ac366004612897565b6119e1565b604051610221929190612f31565b3480156104cb57600080fd5b506103fa611a05565b3480156104e057600080fd5b506101fd6104ef3660046128c6565b611a29565b34801561050057600080fd5b50610214611c02565b34801561051557600080fd5b506103fa610524366004612867565b611d76565b34801561053557600080fd5b506101fd6105443660046128fc565b611d83565b61055c610557366004612627565b611fb6565b604051610221929190612a5c565b34801561057657600080fd5b506103fa612146565b34801561058b57600080fd5b506103fa612155565b6000546001600160a01b031633146105c75760405162461bcd60e51b81526004016105be90612cfe565b60405180910390fd5b8115610662576001600160a01b0383161515806105e15750805b6105fd5760405162461bcd60e51b81526004016105be90612c18565b600080546040516001600160a01b03808716939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0385166001600160a01b03199182161790915560018054909116905561067e565b600180546001600160a01b0319166001600160a01b0385161790555b505050565b60035490565b610691612575565b61069a84611362565b600085815260066020908152604080832033845290915290208151919250906106ec9064e8d4a51000906106d89087906001600160801b0316612179565b816106df57fe5b60018401549190046121b6565b600182015580546106fd9085612203565b815560058054600091908790811061071157fe5b6000918252602090912001546001600160a01b0316905080156107975781546040516345fb1ba160e11b81526001600160a01b03831691638bf6374291610764918a9133918a9160009190600401612ef2565b600060405180830381600087803b15801561077e57600080fd5b505af1158015610792573d6000803e3d6000fd5b505050505b6107c58486600489815481106107a957fe5b6000918252602090912001546001600160a01b03169190612226565b836001600160a01b031686336001600160a01b03167f8166bf25f8a2b7ed3c85049207da4358d16edbed977d23fa2ee6f0dde3ec2132886040516108099190612ee9565b60405180910390a4505050505050565b6003818154811061082657fe5b6000918252602090912001546001600160801b03811691506001600160401b03600160801b8204811691600160c01b90041683565b60075481565b610869612575565b61087283611362565b6000848152600660209081526040808320338452909152812082518154939450909264e8d4a51000916108ae91906001600160801b0316612179565b816108b557fe5b04905060006108d96108d48460010154846121b690919063ffffffff16565b612314565b600184018390559050801561091c5761091c6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168683612226565b60006005878154811061092b57fe5b6000918252602090912001546001600160a01b0316905080156109b05783546040516345fb1ba160e11b81526001600160a01b03831691638bf637429161097d918b9133918c91899190600401612ef2565b600060405180830381600087803b15801561099757600080fd5b505af11580156109ab573d6000803e3d6000fd5b505050505b86336001600160a01b03167f71bab65ced2e5750775a0613be067df48ef06cf92a496ebf7663ae0660924954846040516109ea9190612ee9565b60405180910390a350505050505050565b6000610a05612575565b60038481548110610a1257fe5b600091825260208083206040805160608101825291909301546001600160801b0380821683526001600160401b03600160801b8304811684860152600160c01b90920490911682850152888552600683528385206001600160a01b0389168652909252918320825160048054949650919492169288908110610a9057fe5b6000918252602090912001546040516370a0823160e01b81526001600160a01b03909116906370a0823190610ac99030906004016129ca565b60206040518083038186803b158015610ae157600080fd5b505afa158015610af5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b19919061287f565b905083602001516001600160401b031643118015610b3657508015155b15610bbf576000610b5d85602001516001600160401b03164361220390919063ffffffff16565b90506000600754610b8d87604001516001600160401b0316610b87610b80611c02565b8690612179565b90612179565b81610b9457fe5b049050610bba83610baa8364e8d4a51000612179565b81610bb157fe5b8691900461233a565b935050505b60018301548354610bed916108d49164e8d4a5100090610bdf9087612179565b81610be657fe5b04906121b6565b979650505050505050565b6040516370a0823160e01b81526000906001600160a01b038316906370a0823190610c279033906004016129ca565b60206040518083038186803b158015610c3f57600080fd5b505afa158015610c53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c77919061287f565b905080610c965760405162461bcd60e51b81526004016105be90612b5d565b610cab6001600160a01b03831633308461235d565b60405163095ea7b360e01b81526001600160a01b0383169063095ea7b390610cf9907f0000000000000000000000000000000000000000000000000000000000000000908590600401612a43565b602060405180830381600087803b158015610d1357600080fd5b505af1158015610d27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4b91906126af565b50604051631c57762b60e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e2bbb15890610dba907f0000000000000000000000000000000000000000000000000000000000000000908590600401612f31565b600060405180830381600087803b158015610dd457600080fd5b505af1158015610de8573d6000803e3d6000fd5b50506040517f98a9bd3b7a617581fc53b1e2992534e0e0cb5091c9d44aa1a7fc978f706caa83925060009150a15050565b6000546001600160a01b03163314610e435760405162461bcd60e51b81526004016105be90612cfe565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b60008281526006602090815260408083203384529091528120805482825560018201839055600580549293919286908110610e9c57fe5b6000918252602090912001546001600160a01b031690508015610f21576040516345fb1ba160e11b81526001600160a01b03821690638bf6374290610eee908890339089906000908190600401612ef2565b600060405180830381600087803b158015610f0857600080fd5b505af1158015610f1c573d6000803e3d6000fd5b505050505b610f338483600488815481106107a957fe5b836001600160a01b031685336001600160a01b03167f2cac5e20e1541d836381527a43f651851e302817b71dc8e810284e69210c1c6b85604051610f779190612ee9565b60405180910390a45050505050565b6002546001600160a01b0316610fae5760405162461bcd60e51b81526004016105be90612d9f565b600060048281548110610fbd57fe5b60009182526020822001546040516370a0823160e01b81526001600160a01b03909116925082906370a0823190610ff89030906004016129ca565b60206040518083038186803b15801561101057600080fd5b505afa158015611024573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611048919061287f565b60025460405163095ea7b360e01b81529192506001600160a01b038085169263095ea7b39261107d9216908590600401612a43565b602060405180830381600087803b15801561109757600080fd5b505af11580156110ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110cf91906126af565b5060025460405163ce5494bb60e01b81526000916001600160a01b03169063ce5494bb906111019086906004016129ca565b602060405180830381600087803b15801561111b57600080fd5b505af115801561112f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061115391906126e7565b6040516370a0823160e01b81529091506001600160a01b038216906370a08231906111829030906004016129ca565b60206040518083038186803b15801561119a57600080fd5b505afa1580156111ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111d2919061287f565b82146111f05760405162461bcd60e51b81526004016105be90612c47565b80600485815481106111fe57fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555050505050565b6001546001600160a01b031633811461125d5760405162461bcd60e51b81526004016105be90612d33565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b039092166001600160a01b0319928316179055600180549091169055565b604051631c57762b60e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e2bbb1589061132e907f000000000000000000000000000000000000000000000000000000000000000090600090600401612f31565b600060405180830381600087803b15801561134857600080fd5b505af115801561135c573d6000803e3d6000fd5b50505050565b61136a612575565b6003828154811061137757fe5b60009182526020918290206040805160608101825292909101546001600160801b03811683526001600160401b03600160801b82048116948401859052600160c01b909104169082015291504311156115d7576000600483815481106113d957fe5b6000918252602090912001546040516370a0823160e01b81526001600160a01b03909116906370a08231906114129030906004016129ca565b60206040518083038186803b15801561142a57600080fd5b505afa15801561143e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611462919061287f565b905080156114fb57600061148c83602001516001600160401b03164361220390919063ffffffff16565b905060006007546114af85604001516001600160401b0316610b87610b80611c02565b816114b657fe5b0490506114ed6114dc846114cf8464e8d4a51000612179565b816114d657fe5b0461244e565b85516001600160801b031690612477565b6001600160801b0316845250505b611504436124a6565b6001600160401b03166020830152600380548391908590811061152357fe5b6000918252602091829020835191018054848401516040958601516001600160801b03199092166001600160801b039094169390931767ffffffffffffffff60801b1916600160801b6001600160401b0394851602176001600160c01b0316600160c01b93909116929092029190911790558301518351915185927f0fc9545022a542541ad085d091fb09a2ab36fee366a4576ab63714ea907ad353926115cd9290918691612f3f565b60405180910390a2505b919050565b8060005b8181101561135c576116038484838181106115f757fe5b90506020020135611362565b506001016115e0565b7f000000000000000000000000000000000000000000000000000000000000000081565b6004818154811061163d57fe5b6000918252602090912001546001600160a01b0316905081565b60405163d505accf60e01b81526001600160a01b0389169063d505accf9061168f908a908a908a908a908a908a908a90600401612a02565b600060405180830381600087803b1580156116a957600080fd5b505af11580156116bd573d6000803e3d6000fd5b505050505050505050505050565b6002546001600160a01b031681565b6000546001600160a01b031633146117045760405162461bcd60e51b81526004016105be90612cfe565b6117438361173d6003878154811061171857fe5b60009182526020909120015460075490600160c01b90046001600160401b0316612203565b9061233a565b60075561174f836124a6565b6003858154811061175c57fe5b9060005260206000200160000160186101000a8154816001600160401b0302191690836001600160401b0316021790555080156117d05781600585815481106117a157fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b806117fc57600584815481106117e257fe5b6000918252602090912001546001600160a01b03166117fe565b815b6001600160a01b0316847f95895a6ab1df54420d241b55243258a33e61b2194db66c1179ec521aae8e18658584604051611839929190612f21565b60405180910390a350505050565b6000546001600160a01b031681565b61185e612575565b61186784611362565b60008581526006602090815260408083206001600160a01b03871684529091529020805491925090611899908561233a565b815581516118d09064e8d4a51000906118bc9087906001600160801b0316612179565b816118c357fe5b60018401549190046124cf565b81600101819055506000600586815481106118e757fe5b6000918252602090912001546001600160a01b03169050801561196d5781546040516345fb1ba160e11b81526001600160a01b03831691638bf637429161193a918a918991829160009190600401612ef2565b600060405180830381600087803b15801561195457600080fd5b505af1158015611968573d6000803e3d6000fd5b505050505b61199d33308760048a8154811061198057fe5b6000918252602090912001546001600160a01b031692919061235d565b836001600160a01b031686336001600160a01b03167f02d7e648dd130fc184d383e55bb126ac4c9c60e8f94bf05acdf557ba2d540b47886040516108099190612ee9565b60066020908152600092835260408084209091529082529020805460019091015482565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000546001600160a01b03163314611a535760405162461bcd60e51b81526004016105be90612cfe565b6007544390611a62908561233a565b6007556004805460018181019092557f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180546001600160a01b038087166001600160a01b03199283161790925560058054938401815560009081527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0909301805492861692909116919091179055604080516060810190915290815260039060208101611b0f846124a6565b6001600160401b03168152602001611b26876124a6565b6001600160401b039081169091528254600181810185556000948552602094859020845192018054958501516040909501518416600160c01b026001600160c01b0395909416600160801b0267ffffffffffffffff60801b196001600160801b039094166001600160801b0319909716969096179290921694909417929092161790556004546001600160a01b038085169290861691611bc591612203565b7f81ee0f8c5c46e2cb41984886f77a84181724abb86c32a5f6de539b07509d45e587604051611bf49190612ee9565b60405180910390a450505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166317caf6f16040518163ffffffff1660e01b815260040160206040518083038186803b158015611c5d57600080fd5b505afa158015611c71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c95919061287f565b604051631526fe2760e01b8152611d69906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690631526fe2790611d05907f000000000000000000000000000000000000000000000000000000000000000090600401612ee9565b60806040518083038186803b158015611d1d57600080fd5b505afa158015611d31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d559190612815565b6020015168056bc75e2d6310000090612179565b81611d7057fe5b04905090565b6005818154811061163d57fe5b611d8b612575565b611d9484611362565b6000858152600660209081526040808320338452909152812082518154939450909264e8d4a5100091611dd091906001600160801b0316612179565b81611dd757fe5b0490506000611df66108d48460010154846121b690919063ffffffff16565b9050611e3164e8d4a51000611e2186600001516001600160801b03168961217990919063ffffffff16565b81611e2857fe5b849190046121b6565b60018401558254611e429087612203565b8355611e786001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168683612226565b600060058881548110611e8757fe5b6000918252602090912001546001600160a01b031690508015611f0c5783546040516345fb1ba160e11b81526001600160a01b03831691638bf6374291611ed9918c9133918c91899190600401612ef2565b600060405180830381600087803b158015611ef357600080fd5b505af1158015611f07573d6000803e3d6000fd5b505050505b611f1e868860048b815481106107a957fe5b856001600160a01b031688336001600160a01b03167f8166bf25f8a2b7ed3c85049207da4358d16edbed977d23fa2ee6f0dde3ec21328a604051611f629190612ee9565b60405180910390a487336001600160a01b03167f71bab65ced2e5750775a0613be067df48ef06cf92a496ebf7663ae066092495484604051611fa49190612ee9565b60405180910390a35050505050505050565b606080836001600160401b0381118015611fcf57600080fd5b50604051908082528060200260200182016040528015611ff9578160200160208202803683370190505b509150836001600160401b038111801561201257600080fd5b5060405190808252806020026020018201604052801561204657816020015b60608152602001906001900390816120315790505b50905060005b8481101561213d57600060603088888581811061206557fe5b90506020028101906120779190612f69565b60405161208592919061299e565b600060405180830381855af49150503d80600081146120c0576040519150601f19603f3d011682016040523d82523d6000602084013e6120c5565b606091505b509150915081806120d4575085155b6120dd82612515565b906120fb5760405162461bcd60e51b81526004016105be9190612af6565b508185848151811061210957fe5b6020026020010190151590811515815250508084848151811061212857fe5b6020908102919091010152505060010161204c565b50935093915050565b6001546001600160a01b031681565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008115806121945750508082028282828161219157fe5b04145b6121b05760405162461bcd60e51b81526004016105be90612e4f565b92915050565b60008183038183128015906121cb5750838113155b806121e057506000831280156121e057508381135b6121fc5760405162461bcd60e51b81526004016105be90612dd6565b9392505050565b808203828111156121b05760405162461bcd60e51b81526004016105be90612b09565b60006060846001600160a01b031663a9059cbb858560405160240161224c929190612a43565b6040516020818303038152906040529060e01b6020820180516001600160e01b03838183161783525050505060405161228591906129ae565b6000604051808303816000865af19150503d80600081146122c2576040519150601f19603f3d011682016040523d82523d6000602084013e6122c7565b606091505b50915091508180156122f15750805115806122f15750808060200190518101906122f191906126af565b61230d5760405162461bcd60e51b81526004016105be90612ba0565b5050505050565b6000808212156123365760405162461bcd60e51b81526004016105be90612b38565b5090565b818101818110156121b05760405162461bcd60e51b81526004016105be90612cc7565b60006060856001600160a01b03166323b872dd868686604051602401612385939291906129de565b6040516020818303038152906040529060e01b6020820180516001600160e01b0383818316178352505050506040516123be91906129ae565b6000604051808303816000865af19150503d80600081146123fb576040519150601f19603f3d011682016040523d82523d6000602084013e612400565b606091505b509150915081801561242a57508051158061242a57508080602001905181019061242a91906126af565b6124465760405162461bcd60e51b81526004016105be90612e1a565b505050505050565b60006001600160801b038211156123365760405162461bcd60e51b81526004016105be90612c90565b8181016001600160801b0380831690821610156121b05760405162461bcd60e51b81526004016105be90612cc7565b60006001600160401b038211156123365760405162461bcd60e51b81526004016105be90612d68565b60008282018183128015906124e45750838112155b806124f957506000831280156124f957508381125b6121fc5760405162461bcd60e51b81526004016105be90612bd7565b606060448251101561255b575060408051808201909152601d81527f5472616e73616374696f6e2072657665727465642073696c656e746c7900000060208201526115d7565b600482019150818060200190518101906121b0919061278a565b604080516060810182526000808252602082018190529181019190915290565b60008083601f8401126125a6578182fd5b5081356001600160401b038111156125bc578182fd5b60208301915083602080830285010111156125d657600080fd5b9250929050565b6000806000606084860312156125f1578283fd5b83356125fc81612fff565b9250602084013561260c81613017565b9150604084013561261c81613017565b809150509250925092565b60008060006040848603121561263b578283fd5b83356001600160401b03811115612650578384fd5b61265c86828701612595565b909450925050602084013561261c81613017565b60008060208385031215612682578182fd5b82356001600160401b03811115612697578283fd5b6126a385828601612595565b90969095509350505050565b6000602082840312156126c0578081fd5b81516121fc81613017565b6000602082840312156126dc578081fd5b81356121fc81612fff565b6000602082840312156126f8578081fd5b81516121fc81612fff565b600080600080600080600080610100898b03121561271f578384fd5b883561272a81612fff565b9750602089013561273a81612fff565b9650604089013561274a81612fff565b9550606089013594506080890135935060a089013560ff8116811461276d578384fd5b979a969950949793969295929450505060c08201359160e0013590565b60006020828403121561279b578081fd5b81516001600160401b03808211156127b1578283fd5b818401915084601f8301126127c4578283fd5b8151818111156127d2578384fd5b6127e5601f8201601f1916602001612fad565b91508082528560208285010111156127fb578384fd5b61280c816020840160208601612fd3565b50949350505050565b600060808284031215612826578081fd5b6128306080612fad565b825161283b81612fff565b808252506020830151602082015260408301516040820152606083015160608201528091505092915050565b600060208284031215612878578081fd5b5035919050565b600060208284031215612890578081fd5b5051919050565b600080604083850312156128a9578182fd5b8235915060208301356128bb81612fff565b809150509250929050565b6000806000606084860312156128da578081fd5b8335925060208401356128ec81612fff565b9150604084013561261c81612fff565b600080600060608486031215612910578081fd5b8335925060208401359150604084013561261c81612fff565b6000806000806080858703121561293e578182fd5b8435935060208501359250604085013561295781612fff565b9150606085013561296781613017565b939692955090935050565b6000815180845261298a816020860160208601612fd3565b601f01601f19169290920160200192915050565b6000828483379101908152919050565b600082516129c0818460208701612fd3565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b6001600160a01b03929092168252602082015260400190565b604080825283519082018190526000906020906060840190828701845b82811015612a97578151151584529284019290840190600101612a79565b50505083810382850152808551612aae8184612ee9565b91508192508381028201848801865b83811015612ae7578583038552612ad5838351612972565b94870194925090860190600101612abd565b50909998505050505050505050565b6000602082526121fc6020830184612972565b602080825260159082015274426f72696e674d6174683a20556e646572666c6f7760581b604082015260600190565b6020808252600b908201526a0496e7465676572203c20360ac1b604082015260600190565b60208082526023908201527f4d61737465724368656656323a2042616c616e6365206d75737420657863656560408201526206420360ec1b606082015260800190565b6020808252601c908201527f426f72696e6745524332303a205472616e73666572206661696c656400000000604082015260600190565b60208082526021908201527f5369676e6564536166654d6174683a206164646974696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252601590820152744f776e61626c653a207a65726f206164647265737360581b604082015260600190565b60208082526029908201527f4d61737465724368656656323a206d696772617465642062616c616e6365206d6040820152680eae6e840dac2e8c6d60bb1b606082015260800190565b6020808252601c908201527f426f72696e674d6174683a2075696e74313238204f766572666c6f7700000000604082015260600190565b60208082526018908201527f426f72696e674d6174683a20416464204f766572666c6f770000000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c657220213d2070656e64696e67206f776e6572604082015260600190565b6020808252601b908201527f426f72696e674d6174683a2075696e743634204f766572666c6f770000000000604082015260600190565b6020808252601d908201527f4d61737465724368656656323a206e6f206d69677261746f7220736574000000604082015260600190565b60208082526024908201527f5369676e6564536166654d6174683a207375627472616374696f6e206f766572604082015263666c6f7760e01b606082015260800190565b6020808252818101527f426f72696e6745524332303a205472616e7366657246726f6d206661696c6564604082015260600190565b60208082526018908201527f426f72696e674d6174683a204d756c204f766572666c6f770000000000000000604082015260600190565b81516001600160801b031681526020808301516001600160401b0390811691830191909152604092830151169181019190915260600190565b6001600160801b039390931683526001600160401b03918216602084015216604082015260600190565b90815260200190565b9485526001600160a01b0393841660208601529190921660408401526060830191909152608082015260a00190565b9182521515602082015260400190565b918252602082015260400190565b6001600160401b0393909316835260208301919091526001600160801b0316604082015260600190565b6000808335601e19843603018112612f7f578283fd5b8301803591506001600160401b03821115612f98578283fd5b6020019150368190038213156125d657600080fd5b6040518181016001600160401b0381118282101715612fcb57600080fd5b604052919050565b60005b83811015612fee578181015183820152602001612fd6565b8381111561135c5750506000910152565b6001600160a01b038116811461301457600080fd5b50565b801515811461301457600080fdfea2646970667358221220814e5dfdee606b9ff8357a8c99c275bc5bee65fd89e04f2e557682da8ccc9f4264736f6c634300060c0033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x1D8 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x61621AAA GT PUSH2 0x102 JUMPI DUP1 PUSH4 0xAB560E10 GT PUSH2 0x95 JUMPI DUP1 PUSH4 0xD1ABB907 GT PUSH2 0x64 JUMPI DUP1 PUSH4 0xD1ABB907 EQ PUSH2 0x529 JUMPI DUP1 PUSH4 0xD2423B51 EQ PUSH2 0x549 JUMPI DUP1 PUSH4 0xE30C3978 EQ PUSH2 0x56A JUMPI DUP1 PUSH4 0xEDD8B170 EQ PUSH2 0x57F JUMPI PUSH2 0x1D8 JUMP JUMPDEST DUP1 PUSH4 0xAB560E10 EQ PUSH2 0x4BF JUMPI DUP1 PUSH4 0xAB7DE098 EQ PUSH2 0x4D4 JUMPI DUP1 PUSH4 0xB0BCF42A EQ PUSH2 0x4F4 JUMPI DUP1 PUSH4 0xC346253D EQ PUSH2 0x509 JUMPI PUSH2 0x1D8 JUMP JUMPDEST DUP1 PUSH4 0x88BBA42F GT PUSH2 0xD1 JUMPI DUP1 PUSH4 0x88BBA42F EQ PUSH2 0x43C JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x45C JUMPI DUP1 PUSH4 0x8DBDBE6D EQ PUSH2 0x471 JUMPI DUP1 PUSH4 0x93F1A40B EQ PUSH2 0x491 JUMPI PUSH2 0x1D8 JUMP JUMPDEST DUP1 PUSH4 0x61621AAA EQ PUSH2 0x3C5 JUMPI DUP1 PUSH4 0x78ED5D1F EQ PUSH2 0x3DA JUMPI DUP1 PUSH4 0x7C516E94 EQ PUSH2 0x407 JUMPI DUP1 PUSH4 0x7CD07E47 EQ PUSH2 0x427 JUMPI PUSH2 0x1D8 JUMP JUMPDEST DUP1 PUSH4 0x19AB453C GT PUSH2 0x17A JUMPI DUP1 PUSH4 0x4E71E0C8 GT PUSH2 0x149 JUMPI DUP1 PUSH4 0x4E71E0C8 EQ PUSH2 0x34E JUMPI DUP1 PUSH4 0x4F70B15A EQ PUSH2 0x363 JUMPI DUP1 PUSH4 0x51EB05A6 EQ PUSH2 0x378 JUMPI DUP1 PUSH4 0x57A5B58C EQ PUSH2 0x3A5 JUMPI PUSH2 0x1D8 JUMP JUMPDEST DUP1 PUSH4 0x19AB453C EQ PUSH2 0x2CE JUMPI DUP1 PUSH4 0x23CF3118 EQ PUSH2 0x2EE JUMPI DUP1 PUSH4 0x2F940C70 EQ PUSH2 0x30E JUMPI DUP1 PUSH4 0x454B0608 EQ PUSH2 0x32E JUMPI PUSH2 0x1D8 JUMP JUMPDEST DUP1 PUSH4 0x1526FE27 GT PUSH2 0x1B6 JUMPI DUP1 PUSH4 0x1526FE27 EQ PUSH2 0x24A JUMPI DUP1 PUSH4 0x17CAF6F1 EQ PUSH2 0x279 JUMPI DUP1 PUSH4 0x18FCCC76 EQ PUSH2 0x28E JUMPI DUP1 PUSH4 0x195426EC EQ PUSH2 0x2AE JUMPI PUSH2 0x1D8 JUMP JUMPDEST DUP1 PUSH4 0x78DFBE7 EQ PUSH2 0x1DD JUMPI DUP1 PUSH4 0x81E3EDA EQ PUSH2 0x1FF JUMPI DUP1 PUSH4 0xAD58D2F EQ PUSH2 0x22A JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1E9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1FD PUSH2 0x1F8 CALLDATASIZE PUSH1 0x4 PUSH2 0x25DD JUMP JUMPDEST PUSH2 0x594 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x20B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x214 PUSH2 0x683 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x221 SWAP2 SWAP1 PUSH2 0x2EE9 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x236 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1FD PUSH2 0x245 CALLDATASIZE PUSH1 0x4 PUSH2 0x28FC JUMP JUMPDEST PUSH2 0x689 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x256 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x26A PUSH2 0x265 CALLDATASIZE PUSH1 0x4 PUSH2 0x2867 JUMP JUMPDEST PUSH2 0x819 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x221 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x2EBF JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x285 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x214 PUSH2 0x85B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x29A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1FD PUSH2 0x2A9 CALLDATASIZE PUSH1 0x4 PUSH2 0x2897 JUMP JUMPDEST PUSH2 0x861 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2BA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x214 PUSH2 0x2C9 CALLDATASIZE PUSH1 0x4 PUSH2 0x2897 JUMP JUMPDEST PUSH2 0x9FB JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2DA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1FD PUSH2 0x2E9 CALLDATASIZE PUSH1 0x4 PUSH2 0x26CB JUMP JUMPDEST PUSH2 0xBF8 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2FA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1FD PUSH2 0x309 CALLDATASIZE PUSH1 0x4 PUSH2 0x26CB JUMP JUMPDEST PUSH2 0xE19 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x31A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1FD PUSH2 0x329 CALLDATASIZE PUSH1 0x4 PUSH2 0x2897 JUMP JUMPDEST PUSH2 0xE65 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x33A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1FD PUSH2 0x349 CALLDATASIZE PUSH1 0x4 PUSH2 0x2867 JUMP JUMPDEST PUSH2 0xF86 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x35A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1FD PUSH2 0x1232 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x36F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1FD PUSH2 0x12BF JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x384 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x398 PUSH2 0x393 CALLDATASIZE PUSH1 0x4 PUSH2 0x2867 JUMP JUMPDEST PUSH2 0x1362 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x221 SWAP2 SWAP1 PUSH2 0x2E86 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3B1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1FD PUSH2 0x3C0 CALLDATASIZE PUSH1 0x4 PUSH2 0x2670 JUMP JUMPDEST PUSH2 0x15DC JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3D1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x214 PUSH2 0x160C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3E6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3FA PUSH2 0x3F5 CALLDATASIZE PUSH1 0x4 PUSH2 0x2867 JUMP JUMPDEST PUSH2 0x1630 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x221 SWAP2 SWAP1 PUSH2 0x29CA JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x413 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1FD PUSH2 0x422 CALLDATASIZE PUSH1 0x4 PUSH2 0x2703 JUMP JUMPDEST PUSH2 0x1657 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x433 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3FA PUSH2 0x16CB JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x448 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1FD PUSH2 0x457 CALLDATASIZE PUSH1 0x4 PUSH2 0x2929 JUMP JUMPDEST PUSH2 0x16DA JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x468 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3FA PUSH2 0x1847 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x47D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1FD PUSH2 0x48C CALLDATASIZE PUSH1 0x4 PUSH2 0x28FC JUMP JUMPDEST PUSH2 0x1856 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x49D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x4B1 PUSH2 0x4AC CALLDATASIZE PUSH1 0x4 PUSH2 0x2897 JUMP JUMPDEST PUSH2 0x19E1 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x221 SWAP3 SWAP2 SWAP1 PUSH2 0x2F31 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4CB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3FA PUSH2 0x1A05 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4E0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1FD PUSH2 0x4EF CALLDATASIZE PUSH1 0x4 PUSH2 0x28C6 JUMP JUMPDEST PUSH2 0x1A29 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x500 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x214 PUSH2 0x1C02 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x515 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3FA PUSH2 0x524 CALLDATASIZE PUSH1 0x4 PUSH2 0x2867 JUMP JUMPDEST PUSH2 0x1D76 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x535 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1FD PUSH2 0x544 CALLDATASIZE PUSH1 0x4 PUSH2 0x28FC JUMP JUMPDEST PUSH2 0x1D83 JUMP JUMPDEST PUSH2 0x55C PUSH2 0x557 CALLDATASIZE PUSH1 0x4 PUSH2 0x2627 JUMP JUMPDEST PUSH2 0x1FB6 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x221 SWAP3 SWAP2 SWAP1 PUSH2 0x2A5C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x576 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3FA PUSH2 0x2146 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x58B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3FA PUSH2 0x2155 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0x5C7 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x5BE SWAP1 PUSH2 0x2CFE JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP2 ISZERO PUSH2 0x662 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND ISZERO ISZERO DUP1 PUSH2 0x5E1 JUMPI POP DUP1 JUMPDEST PUSH2 0x5FD JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x5BE SWAP1 PUSH2 0x2C18 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP8 AND SWAP4 SWAP3 AND SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 LOG3 PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP2 DUP3 AND OR SWAP1 SWAP2 SSTORE PUSH1 0x1 DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SSTORE PUSH2 0x67E JUMP JUMPDEST PUSH1 0x1 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND OR SWAP1 SSTORE JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x3 SLOAD SWAP1 JUMP JUMPDEST PUSH2 0x691 PUSH2 0x2575 JUMP JUMPDEST PUSH2 0x69A DUP5 PUSH2 0x1362 JUMP JUMPDEST PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 DUP2 MLOAD SWAP2 SWAP3 POP SWAP1 PUSH2 0x6EC SWAP1 PUSH5 0xE8D4A51000 SWAP1 PUSH2 0x6D8 SWAP1 DUP8 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x2179 JUMP JUMPDEST DUP2 PUSH2 0x6DF JUMPI INVALID JUMPDEST PUSH1 0x1 DUP5 ADD SLOAD SWAP2 SWAP1 DIV PUSH2 0x21B6 JUMP JUMPDEST PUSH1 0x1 DUP3 ADD SSTORE DUP1 SLOAD PUSH2 0x6FD SWAP1 DUP6 PUSH2 0x2203 JUMP JUMPDEST DUP2 SSTORE PUSH1 0x5 DUP1 SLOAD PUSH1 0x0 SWAP2 SWAP1 DUP8 SWAP1 DUP2 LT PUSH2 0x711 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 POP DUP1 ISZERO PUSH2 0x797 JUMPI DUP2 SLOAD PUSH1 0x40 MLOAD PUSH4 0x45FB1BA1 PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP2 PUSH4 0x8BF63742 SWAP2 PUSH2 0x764 SWAP2 DUP11 SWAP2 CALLER SWAP2 DUP11 SWAP2 PUSH1 0x0 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0x2EF2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x77E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x792 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST PUSH2 0x7C5 DUP5 DUP7 PUSH1 0x4 DUP10 DUP2 SLOAD DUP2 LT PUSH2 0x7A9 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP2 SWAP1 PUSH2 0x2226 JUMP JUMPDEST DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP7 CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x8166BF25F8A2B7ED3C85049207DA4358D16EDBED977D23FA2EE6F0DDE3EC2132 DUP9 PUSH1 0x40 MLOAD PUSH2 0x809 SWAP2 SWAP1 PUSH2 0x2EE9 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x3 DUP2 DUP2 SLOAD DUP2 LT PUSH2 0x826 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP2 AND SWAP2 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB PUSH1 0x1 PUSH1 0x80 SHL DUP3 DIV DUP2 AND SWAP2 PUSH1 0x1 PUSH1 0xC0 SHL SWAP1 DIV AND DUP4 JUMP JUMPDEST PUSH1 0x7 SLOAD DUP2 JUMP JUMPDEST PUSH2 0x869 PUSH2 0x2575 JUMP JUMPDEST PUSH2 0x872 DUP4 PUSH2 0x1362 JUMP JUMPDEST PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP5 MSTORE SWAP1 SWAP2 MSTORE DUP2 KECCAK256 DUP3 MLOAD DUP2 SLOAD SWAP4 SWAP5 POP SWAP1 SWAP3 PUSH5 0xE8D4A51000 SWAP2 PUSH2 0x8AE SWAP2 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x2179 JUMP JUMPDEST DUP2 PUSH2 0x8B5 JUMPI INVALID JUMPDEST DIV SWAP1 POP PUSH1 0x0 PUSH2 0x8D9 PUSH2 0x8D4 DUP5 PUSH1 0x1 ADD SLOAD DUP5 PUSH2 0x21B6 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH2 0x2314 JUMP JUMPDEST PUSH1 0x1 DUP5 ADD DUP4 SWAP1 SSTORE SWAP1 POP DUP1 ISZERO PUSH2 0x91C JUMPI PUSH2 0x91C PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 AND DUP7 DUP4 PUSH2 0x2226 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x5 DUP8 DUP2 SLOAD DUP2 LT PUSH2 0x92B JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 POP DUP1 ISZERO PUSH2 0x9B0 JUMPI DUP4 SLOAD PUSH1 0x40 MLOAD PUSH4 0x45FB1BA1 PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP2 PUSH4 0x8BF63742 SWAP2 PUSH2 0x97D SWAP2 DUP12 SWAP2 CALLER SWAP2 DUP13 SWAP2 DUP10 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0x2EF2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x997 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x9AB JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST DUP7 CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x71BAB65CED2E5750775A0613BE067DF48EF06CF92A496EBF7663AE0660924954 DUP5 PUSH1 0x40 MLOAD PUSH2 0x9EA SWAP2 SWAP1 PUSH2 0x2EE9 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA05 PUSH2 0x2575 JUMP JUMPDEST PUSH1 0x3 DUP5 DUP2 SLOAD DUP2 LT PUSH2 0xA12 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 KECCAK256 PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE SWAP2 SWAP1 SWAP4 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP3 AND DUP4 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB PUSH1 0x1 PUSH1 0x80 SHL DUP4 DIV DUP2 AND DUP5 DUP7 ADD MSTORE PUSH1 0x1 PUSH1 0xC0 SHL SWAP1 SWAP3 DIV SWAP1 SWAP2 AND DUP3 DUP6 ADD MSTORE DUP9 DUP6 MSTORE PUSH1 0x6 DUP4 MSTORE DUP4 DUP6 KECCAK256 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP10 AND DUP7 MSTORE SWAP1 SWAP3 MSTORE SWAP2 DUP4 KECCAK256 DUP3 MLOAD PUSH1 0x4 DUP1 SLOAD SWAP5 SWAP7 POP SWAP2 SWAP5 SWAP3 AND SWAP3 DUP9 SWAP1 DUP2 LT PUSH2 0xA90 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x40 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0x70A08231 SWAP1 PUSH2 0xAC9 SWAP1 ADDRESS SWAP1 PUSH1 0x4 ADD PUSH2 0x29CA JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xAE1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xAF5 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xB19 SWAP2 SWAP1 PUSH2 0x287F JUMP JUMPDEST SWAP1 POP DUP4 PUSH1 0x20 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND NUMBER GT DUP1 ISZERO PUSH2 0xB36 JUMPI POP DUP1 ISZERO ISZERO JUMPDEST ISZERO PUSH2 0xBBF JUMPI PUSH1 0x0 PUSH2 0xB5D DUP6 PUSH1 0x20 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND NUMBER PUSH2 0x2203 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH1 0x7 SLOAD PUSH2 0xB8D DUP8 PUSH1 0x40 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND PUSH2 0xB87 PUSH2 0xB80 PUSH2 0x1C02 JUMP JUMPDEST DUP7 SWAP1 PUSH2 0x2179 JUMP JUMPDEST SWAP1 PUSH2 0x2179 JUMP JUMPDEST DUP2 PUSH2 0xB94 JUMPI INVALID JUMPDEST DIV SWAP1 POP PUSH2 0xBBA DUP4 PUSH2 0xBAA DUP4 PUSH5 0xE8D4A51000 PUSH2 0x2179 JUMP JUMPDEST DUP2 PUSH2 0xBB1 JUMPI INVALID JUMPDEST DUP7 SWAP2 SWAP1 DIV PUSH2 0x233A JUMP JUMPDEST SWAP4 POP POP POP JUMPDEST PUSH1 0x1 DUP4 ADD SLOAD DUP4 SLOAD PUSH2 0xBED SWAP2 PUSH2 0x8D4 SWAP2 PUSH5 0xE8D4A51000 SWAP1 PUSH2 0xBDF SWAP1 DUP8 PUSH2 0x2179 JUMP JUMPDEST DUP2 PUSH2 0xBE6 JUMPI INVALID JUMPDEST DIV SWAP1 PUSH2 0x21B6 JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x0 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 PUSH4 0x70A08231 SWAP1 PUSH2 0xC27 SWAP1 CALLER SWAP1 PUSH1 0x4 ADD PUSH2 0x29CA JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xC3F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xC53 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xC77 SWAP2 SWAP1 PUSH2 0x287F JUMP JUMPDEST SWAP1 POP DUP1 PUSH2 0xC96 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x5BE SWAP1 PUSH2 0x2B5D JUMP JUMPDEST PUSH2 0xCAB PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND CALLER ADDRESS DUP5 PUSH2 0x235D JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH4 0x95EA7B3 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 PUSH4 0x95EA7B3 SWAP1 PUSH2 0xCF9 SWAP1 PUSH32 0x0 SWAP1 DUP6 SWAP1 PUSH1 0x4 ADD PUSH2 0x2A43 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xD13 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xD27 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xD4B SWAP2 SWAP1 PUSH2 0x26AF JUMP JUMPDEST POP PUSH1 0x40 MLOAD PUSH4 0x1C57762B PUSH1 0xE3 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 AND SWAP1 PUSH4 0xE2BBB158 SWAP1 PUSH2 0xDBA SWAP1 PUSH32 0x0 SWAP1 DUP6 SWAP1 PUSH1 0x4 ADD PUSH2 0x2F31 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xDD4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xDE8 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH32 0x98A9BD3B7A617581FC53B1E2992534E0E0CB5091C9D44AA1A7FC978F706CAA83 SWAP3 POP PUSH1 0x0 SWAP2 POP LOG1 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0xE43 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x5BE SWAP1 PUSH2 0x2CFE JUMP JUMPDEST PUSH1 0x2 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP5 MSTORE SWAP1 SWAP2 MSTORE DUP2 KECCAK256 DUP1 SLOAD DUP3 DUP3 SSTORE PUSH1 0x1 DUP3 ADD DUP4 SWAP1 SSTORE PUSH1 0x5 DUP1 SLOAD SWAP3 SWAP4 SWAP2 SWAP3 DUP7 SWAP1 DUP2 LT PUSH2 0xE9C JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 POP DUP1 ISZERO PUSH2 0xF21 JUMPI PUSH1 0x40 MLOAD PUSH4 0x45FB1BA1 PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND SWAP1 PUSH4 0x8BF63742 SWAP1 PUSH2 0xEEE SWAP1 DUP9 SWAP1 CALLER SWAP1 DUP10 SWAP1 PUSH1 0x0 SWAP1 DUP2 SWAP1 PUSH1 0x4 ADD PUSH2 0x2EF2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xF08 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xF1C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST PUSH2 0xF33 DUP5 DUP4 PUSH1 0x4 DUP9 DUP2 SLOAD DUP2 LT PUSH2 0x7A9 JUMPI INVALID JUMPDEST DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP6 CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x2CAC5E20E1541D836381527A43F651851E302817B71DC8E810284E69210C1C6B DUP6 PUSH1 0x40 MLOAD PUSH2 0xF77 SWAP2 SWAP1 PUSH2 0x2EE9 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0xFAE JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x5BE SWAP1 PUSH2 0x2D9F JUMP JUMPDEST PUSH1 0x0 PUSH1 0x4 DUP3 DUP2 SLOAD DUP2 LT PUSH2 0xFBD JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 KECCAK256 ADD SLOAD PUSH1 0x40 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP3 POP DUP3 SWAP1 PUSH4 0x70A08231 SWAP1 PUSH2 0xFF8 SWAP1 ADDRESS SWAP1 PUSH1 0x4 ADD PUSH2 0x29CA JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1010 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1024 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1048 SWAP2 SWAP1 PUSH2 0x287F JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH1 0x40 MLOAD PUSH4 0x95EA7B3 PUSH1 0xE0 SHL DUP2 MSTORE SWAP2 SWAP3 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND SWAP3 PUSH4 0x95EA7B3 SWAP3 PUSH2 0x107D SWAP3 AND SWAP1 DUP6 SWAP1 PUSH1 0x4 ADD PUSH2 0x2A43 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1097 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x10AB JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x10CF SWAP2 SWAP1 PUSH2 0x26AF JUMP JUMPDEST POP PUSH1 0x2 SLOAD PUSH1 0x40 MLOAD PUSH4 0xCE5494BB PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH4 0xCE5494BB SWAP1 PUSH2 0x1101 SWAP1 DUP7 SWAP1 PUSH1 0x4 ADD PUSH2 0x29CA JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x111B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x112F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1153 SWAP2 SWAP1 PUSH2 0x26E7 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE SWAP1 SWAP2 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND SWAP1 PUSH4 0x70A08231 SWAP1 PUSH2 0x1182 SWAP1 ADDRESS SWAP1 PUSH1 0x4 ADD PUSH2 0x29CA JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x119A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x11AE JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x11D2 SWAP2 SWAP1 PUSH2 0x287F JUMP JUMPDEST DUP3 EQ PUSH2 0x11F0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x5BE SWAP1 PUSH2 0x2C47 JUMP JUMPDEST DUP1 PUSH1 0x4 DUP6 DUP2 SLOAD DUP2 LT PUSH2 0x11FE JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB MUL NOT AND SWAP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND MUL OR SWAP1 SSTORE POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER DUP2 EQ PUSH2 0x125D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x5BE SWAP1 PUSH2 0x2D33 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND SWAP4 SWAP3 AND SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 LOG3 PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP3 DUP4 AND OR SWAP1 SSTORE PUSH1 0x1 DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH4 0x1C57762B PUSH1 0xE3 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 AND SWAP1 PUSH4 0xE2BBB158 SWAP1 PUSH2 0x132E SWAP1 PUSH32 0x0 SWAP1 PUSH1 0x0 SWAP1 PUSH1 0x4 ADD PUSH2 0x2F31 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1348 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x135C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x136A PUSH2 0x2575 JUMP JUMPDEST PUSH1 0x3 DUP3 DUP2 SLOAD DUP2 LT PUSH2 0x1377 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP2 DUP3 SWAP1 KECCAK256 PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE SWAP3 SWAP1 SWAP2 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP2 AND DUP4 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB PUSH1 0x1 PUSH1 0x80 SHL DUP3 DIV DUP2 AND SWAP5 DUP5 ADD DUP6 SWAP1 MSTORE PUSH1 0x1 PUSH1 0xC0 SHL SWAP1 SWAP2 DIV AND SWAP1 DUP3 ADD MSTORE SWAP2 POP NUMBER GT ISZERO PUSH2 0x15D7 JUMPI PUSH1 0x0 PUSH1 0x4 DUP4 DUP2 SLOAD DUP2 LT PUSH2 0x13D9 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x40 MLOAD PUSH4 0x70A08231 PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0x70A08231 SWAP1 PUSH2 0x1412 SWAP1 ADDRESS SWAP1 PUSH1 0x4 ADD PUSH2 0x29CA JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x142A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x143E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1462 SWAP2 SWAP1 PUSH2 0x287F JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x14FB JUMPI PUSH1 0x0 PUSH2 0x148C DUP4 PUSH1 0x20 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND NUMBER PUSH2 0x2203 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH1 0x7 SLOAD PUSH2 0x14AF DUP6 PUSH1 0x40 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND PUSH2 0xB87 PUSH2 0xB80 PUSH2 0x1C02 JUMP JUMPDEST DUP2 PUSH2 0x14B6 JUMPI INVALID JUMPDEST DIV SWAP1 POP PUSH2 0x14ED PUSH2 0x14DC DUP5 PUSH2 0x14CF DUP5 PUSH5 0xE8D4A51000 PUSH2 0x2179 JUMP JUMPDEST DUP2 PUSH2 0x14D6 JUMPI INVALID JUMPDEST DIV PUSH2 0x244E JUMP JUMPDEST DUP6 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND SWAP1 PUSH2 0x2477 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP5 MSTORE POP POP JUMPDEST PUSH2 0x1504 NUMBER PUSH2 0x24A6 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x3 DUP1 SLOAD DUP4 SWAP2 SWAP1 DUP6 SWAP1 DUP2 LT PUSH2 0x1523 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP2 DUP3 SWAP1 KECCAK256 DUP4 MLOAD SWAP2 ADD DUP1 SLOAD DUP5 DUP5 ADD MLOAD PUSH1 0x40 SWAP6 DUP7 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB NOT SWAP1 SWAP3 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR PUSH8 0xFFFFFFFFFFFFFFFF PUSH1 0x80 SHL NOT AND PUSH1 0x1 PUSH1 0x80 SHL PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB SWAP5 DUP6 AND MUL OR PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND PUSH1 0x1 PUSH1 0xC0 SHL SWAP4 SWAP1 SWAP2 AND SWAP3 SWAP1 SWAP3 MUL SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE DUP4 ADD MLOAD DUP4 MLOAD SWAP2 MLOAD DUP6 SWAP3 PUSH32 0xFC9545022A542541AD085D091FB09A2AB36FEE366A4576AB63714EA907AD353 SWAP3 PUSH2 0x15CD SWAP3 SWAP1 SWAP2 DUP7 SWAP2 PUSH2 0x2F3F JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST DUP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x135C JUMPI PUSH2 0x1603 DUP5 DUP5 DUP4 DUP2 DUP2 LT PUSH2 0x15F7 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD PUSH2 0x1362 JUMP JUMPDEST POP PUSH1 0x1 ADD PUSH2 0x15E0 JUMP JUMPDEST PUSH32 0x0 DUP2 JUMP JUMPDEST PUSH1 0x4 DUP2 DUP2 SLOAD DUP2 LT PUSH2 0x163D JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 POP DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH4 0xD505ACCF PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP10 AND SWAP1 PUSH4 0xD505ACCF SWAP1 PUSH2 0x168F SWAP1 DUP11 SWAP1 DUP11 SWAP1 DUP11 SWAP1 DUP11 SWAP1 DUP11 SWAP1 DUP11 SWAP1 DUP11 SWAP1 PUSH1 0x4 ADD PUSH2 0x2A02 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x16A9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x16BD JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0x1704 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x5BE SWAP1 PUSH2 0x2CFE JUMP JUMPDEST PUSH2 0x1743 DUP4 PUSH2 0x173D PUSH1 0x3 DUP8 DUP2 SLOAD DUP2 LT PUSH2 0x1718 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x7 SLOAD SWAP1 PUSH1 0x1 PUSH1 0xC0 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND PUSH2 0x2203 JUMP JUMPDEST SWAP1 PUSH2 0x233A JUMP JUMPDEST PUSH1 0x7 SSTORE PUSH2 0x174F DUP4 PUSH2 0x24A6 JUMP JUMPDEST PUSH1 0x3 DUP6 DUP2 SLOAD DUP2 LT PUSH2 0x175C JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 ADD PUSH1 0x18 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB MUL NOT AND SWAP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND MUL OR SWAP1 SSTORE POP DUP1 ISZERO PUSH2 0x17D0 JUMPI DUP2 PUSH1 0x5 DUP6 DUP2 SLOAD DUP2 LT PUSH2 0x17A1 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB MUL NOT AND SWAP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND MUL OR SWAP1 SSTORE POP JUMPDEST DUP1 PUSH2 0x17FC JUMPI PUSH1 0x5 DUP5 DUP2 SLOAD DUP2 LT PUSH2 0x17E2 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x17FE JUMP JUMPDEST DUP2 JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH32 0x95895A6AB1DF54420D241B55243258A33E61B2194DB66C1179EC521AAE8E1865 DUP6 DUP5 PUSH1 0x40 MLOAD PUSH2 0x1839 SWAP3 SWAP2 SWAP1 PUSH2 0x2F21 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH2 0x185E PUSH2 0x2575 JUMP JUMPDEST PUSH2 0x1867 DUP5 PUSH2 0x1362 JUMP JUMPDEST PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP8 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 DUP1 SLOAD SWAP2 SWAP3 POP SWAP1 PUSH2 0x1899 SWAP1 DUP6 PUSH2 0x233A JUMP JUMPDEST DUP2 SSTORE DUP2 MLOAD PUSH2 0x18D0 SWAP1 PUSH5 0xE8D4A51000 SWAP1 PUSH2 0x18BC SWAP1 DUP8 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x2179 JUMP JUMPDEST DUP2 PUSH2 0x18C3 JUMPI INVALID JUMPDEST PUSH1 0x1 DUP5 ADD SLOAD SWAP2 SWAP1 DIV PUSH2 0x24CF JUMP JUMPDEST DUP2 PUSH1 0x1 ADD DUP2 SWAP1 SSTORE POP PUSH1 0x0 PUSH1 0x5 DUP7 DUP2 SLOAD DUP2 LT PUSH2 0x18E7 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 POP DUP1 ISZERO PUSH2 0x196D JUMPI DUP2 SLOAD PUSH1 0x40 MLOAD PUSH4 0x45FB1BA1 PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP2 PUSH4 0x8BF63742 SWAP2 PUSH2 0x193A SWAP2 DUP11 SWAP2 DUP10 SWAP2 DUP3 SWAP2 PUSH1 0x0 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0x2EF2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1954 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1968 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST PUSH2 0x199D CALLER ADDRESS DUP8 PUSH1 0x4 DUP11 DUP2 SLOAD DUP2 LT PUSH2 0x1980 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP3 SWAP2 SWAP1 PUSH2 0x235D JUMP JUMPDEST DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP7 CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x2D7E648DD130FC184D383E55BB126AC4C9C60E8F94BF05ACDF557BA2D540B47 DUP9 PUSH1 0x40 MLOAD PUSH2 0x809 SWAP2 SWAP1 PUSH2 0x2EE9 JUMP JUMPDEST PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 SWAP1 SWAP2 ADD SLOAD DUP3 JUMP JUMPDEST PUSH32 0x0 DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0x1A53 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x5BE SWAP1 PUSH2 0x2CFE JUMP JUMPDEST PUSH1 0x7 SLOAD NUMBER SWAP1 PUSH2 0x1A62 SWAP1 DUP6 PUSH2 0x233A JUMP JUMPDEST PUSH1 0x7 SSTORE PUSH1 0x4 DUP1 SLOAD PUSH1 0x1 DUP2 DUP2 ADD SWAP1 SWAP3 SSTORE PUSH32 0x8A35ACFBC15FF81A39AE7D344FD709F28E8600B4AA8C65C6B64BFE7FE36BD19B ADD DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP8 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP3 DUP4 AND OR SWAP1 SWAP3 SSTORE PUSH1 0x5 DUP1 SLOAD SWAP4 DUP5 ADD DUP2 SSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH32 0x36B6384B5ECA791C62761152D0C79BB0604C104A5FB6F4EB0703F3154BB3DB0 SWAP1 SWAP4 ADD DUP1 SLOAD SWAP3 DUP7 AND SWAP3 SWAP1 SWAP2 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD SWAP1 SWAP2 MSTORE SWAP1 DUP2 MSTORE PUSH1 0x3 SWAP1 PUSH1 0x20 DUP2 ADD PUSH2 0x1B0F DUP5 PUSH2 0x24A6 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1B26 DUP8 PUSH2 0x24A6 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB SWAP1 DUP2 AND SWAP1 SWAP2 MSTORE DUP3 SLOAD PUSH1 0x1 DUP2 DUP2 ADD DUP6 SSTORE PUSH1 0x0 SWAP5 DUP6 MSTORE PUSH1 0x20 SWAP5 DUP6 SWAP1 KECCAK256 DUP5 MLOAD SWAP3 ADD DUP1 SLOAD SWAP6 DUP6 ADD MLOAD PUSH1 0x40 SWAP1 SWAP6 ADD MLOAD DUP5 AND PUSH1 0x1 PUSH1 0xC0 SHL MUL PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB SWAP6 SWAP1 SWAP5 AND PUSH1 0x1 PUSH1 0x80 SHL MUL PUSH8 0xFFFFFFFFFFFFFFFF PUSH1 0x80 SHL NOT PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP1 SWAP5 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB NOT SWAP1 SWAP8 AND SWAP7 SWAP1 SWAP7 OR SWAP3 SWAP1 SWAP3 AND SWAP5 SWAP1 SWAP5 OR SWAP3 SWAP1 SWAP3 AND OR SWAP1 SSTORE PUSH1 0x4 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND SWAP3 SWAP1 DUP7 AND SWAP2 PUSH2 0x1BC5 SWAP2 PUSH2 0x2203 JUMP JUMPDEST PUSH32 0x81EE0F8C5C46E2CB41984886F77A84181724ABB86C32A5F6DE539B07509D45E5 DUP8 PUSH1 0x40 MLOAD PUSH2 0x1BF4 SWAP2 SWAP1 PUSH2 0x2EE9 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH32 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x17CAF6F1 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1C5D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1C71 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1C95 SWAP2 SWAP1 PUSH2 0x287F JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH4 0x1526FE27 PUSH1 0xE0 SHL DUP2 MSTORE PUSH2 0x1D69 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 AND SWAP1 PUSH4 0x1526FE27 SWAP1 PUSH2 0x1D05 SWAP1 PUSH32 0x0 SWAP1 PUSH1 0x4 ADD PUSH2 0x2EE9 JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1D1D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1D31 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x1D55 SWAP2 SWAP1 PUSH2 0x2815 JUMP JUMPDEST PUSH1 0x20 ADD MLOAD PUSH9 0x56BC75E2D63100000 SWAP1 PUSH2 0x2179 JUMP JUMPDEST DUP2 PUSH2 0x1D70 JUMPI INVALID JUMPDEST DIV SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x5 DUP2 DUP2 SLOAD DUP2 LT PUSH2 0x163D JUMPI INVALID JUMPDEST PUSH2 0x1D8B PUSH2 0x2575 JUMP JUMPDEST PUSH2 0x1D94 DUP5 PUSH2 0x1362 JUMP JUMPDEST PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP5 MSTORE SWAP1 SWAP2 MSTORE DUP2 KECCAK256 DUP3 MLOAD DUP2 SLOAD SWAP4 SWAP5 POP SWAP1 SWAP3 PUSH5 0xE8D4A51000 SWAP2 PUSH2 0x1DD0 SWAP2 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0x2179 JUMP JUMPDEST DUP2 PUSH2 0x1DD7 JUMPI INVALID JUMPDEST DIV SWAP1 POP PUSH1 0x0 PUSH2 0x1DF6 PUSH2 0x8D4 DUP5 PUSH1 0x1 ADD SLOAD DUP5 PUSH2 0x21B6 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 POP PUSH2 0x1E31 PUSH5 0xE8D4A51000 PUSH2 0x1E21 DUP7 PUSH1 0x0 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP10 PUSH2 0x2179 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP2 PUSH2 0x1E28 JUMPI INVALID JUMPDEST DUP5 SWAP2 SWAP1 DIV PUSH2 0x21B6 JUMP JUMPDEST PUSH1 0x1 DUP5 ADD SSTORE DUP3 SLOAD PUSH2 0x1E42 SWAP1 DUP8 PUSH2 0x2203 JUMP JUMPDEST DUP4 SSTORE PUSH2 0x1E78 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 AND DUP7 DUP4 PUSH2 0x2226 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x5 DUP9 DUP2 SLOAD DUP2 LT PUSH2 0x1E87 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 POP DUP1 ISZERO PUSH2 0x1F0C JUMPI DUP4 SLOAD PUSH1 0x40 MLOAD PUSH4 0x45FB1BA1 PUSH1 0xE1 SHL DUP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP2 PUSH4 0x8BF63742 SWAP2 PUSH2 0x1ED9 SWAP2 DUP13 SWAP2 CALLER SWAP2 DUP13 SWAP2 DUP10 SWAP2 SWAP1 PUSH1 0x4 ADD PUSH2 0x2EF2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1EF3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1F07 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMPDEST PUSH2 0x1F1E DUP7 DUP9 PUSH1 0x4 DUP12 DUP2 SLOAD DUP2 LT PUSH2 0x7A9 JUMPI INVALID JUMPDEST DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP9 CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x8166BF25F8A2B7ED3C85049207DA4358D16EDBED977D23FA2EE6F0DDE3EC2132 DUP11 PUSH1 0x40 MLOAD PUSH2 0x1F62 SWAP2 SWAP1 PUSH2 0x2EE9 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 DUP8 CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x71BAB65CED2E5750775A0613BE067DF48EF06CF92A496EBF7663AE0660924954 DUP5 PUSH1 0x40 MLOAD PUSH2 0x1FA4 SWAP2 SWAP1 PUSH2 0x2EE9 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP1 DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT DUP1 ISZERO PUSH2 0x1FCF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x1FF9 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP JUMPDEST POP SWAP2 POP DUP4 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT DUP1 ISZERO PUSH2 0x2012 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x2046 JUMPI DUP2 PUSH1 0x20 ADD JUMPDEST PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x2031 JUMPI SWAP1 POP JUMPDEST POP SWAP1 POP PUSH1 0x0 JUMPDEST DUP5 DUP2 LT ISZERO PUSH2 0x213D JUMPI PUSH1 0x0 PUSH1 0x60 ADDRESS DUP9 DUP9 DUP6 DUP2 DUP2 LT PUSH2 0x2065 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL DUP2 ADD SWAP1 PUSH2 0x2077 SWAP2 SWAP1 PUSH2 0x2F69 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x2085 SWAP3 SWAP2 SWAP1 PUSH2 0x299E JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x20C0 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x20C5 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 DUP1 PUSH2 0x20D4 JUMPI POP DUP6 ISZERO JUMPDEST PUSH2 0x20DD DUP3 PUSH2 0x2515 JUMP JUMPDEST SWAP1 PUSH2 0x20FB JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x5BE SWAP2 SWAP1 PUSH2 0x2AF6 JUMP JUMPDEST POP DUP2 DUP6 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0x2109 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD SWAP1 ISZERO ISZERO SWAP1 DUP2 ISZERO ISZERO DUP2 MSTORE POP POP DUP1 DUP5 DUP5 DUP2 MLOAD DUP2 LT PUSH2 0x2128 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE POP POP PUSH1 0x1 ADD PUSH2 0x204C JUMP JUMPDEST POP SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH32 0x0 DUP2 JUMP JUMPDEST PUSH1 0x0 DUP2 ISZERO DUP1 PUSH2 0x2194 JUMPI POP POP DUP1 DUP3 MUL DUP3 DUP3 DUP3 DUP2 PUSH2 0x2191 JUMPI INVALID JUMPDEST DIV EQ JUMPDEST PUSH2 0x21B0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x5BE SWAP1 PUSH2 0x2E4F JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 SUB DUP2 DUP4 SLT DUP1 ISZERO SWAP1 PUSH2 0x21CB JUMPI POP DUP4 DUP2 SGT ISZERO JUMPDEST DUP1 PUSH2 0x21E0 JUMPI POP PUSH1 0x0 DUP4 SLT DUP1 ISZERO PUSH2 0x21E0 JUMPI POP DUP4 DUP2 SGT JUMPDEST PUSH2 0x21FC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x5BE SWAP1 PUSH2 0x2DD6 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP1 DUP3 SUB DUP3 DUP2 GT ISZERO PUSH2 0x21B0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x5BE SWAP1 PUSH2 0x2B09 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xA9059CBB DUP6 DUP6 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x224C SWAP3 SWAP2 SWAP1 PUSH2 0x2A43 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP1 PUSH1 0xE0 SHL PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB DUP4 DUP2 DUP4 AND OR DUP4 MSTORE POP POP POP POP PUSH1 0x40 MLOAD PUSH2 0x2285 SWAP2 SWAP1 PUSH2 0x29AE JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x22C2 JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x22C7 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 DUP1 ISZERO PUSH2 0x22F1 JUMPI POP DUP1 MLOAD ISZERO DUP1 PUSH2 0x22F1 JUMPI POP DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x22F1 SWAP2 SWAP1 PUSH2 0x26AF JUMP JUMPDEST PUSH2 0x230D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x5BE SWAP1 PUSH2 0x2BA0 JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 SLT ISZERO PUSH2 0x2336 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x5BE SWAP1 PUSH2 0x2B38 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST DUP2 DUP2 ADD DUP2 DUP2 LT ISZERO PUSH2 0x21B0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x5BE SWAP1 PUSH2 0x2CC7 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x23B872DD DUP7 DUP7 DUP7 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x2385 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x29DE JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP1 PUSH1 0xE0 SHL PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB DUP4 DUP2 DUP4 AND OR DUP4 MSTORE POP POP POP POP PUSH1 0x40 MLOAD PUSH2 0x23BE SWAP2 SWAP1 PUSH2 0x29AE JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x23FB JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x2400 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 DUP1 ISZERO PUSH2 0x242A JUMPI POP DUP1 MLOAD ISZERO DUP1 PUSH2 0x242A JUMPI POP DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x242A SWAP2 SWAP1 PUSH2 0x26AF JUMP JUMPDEST PUSH2 0x2446 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x5BE SWAP1 PUSH2 0x2E1A JUMP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP3 GT ISZERO PUSH2 0x2336 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x5BE SWAP1 PUSH2 0x2C90 JUMP JUMPDEST DUP2 DUP2 ADD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP4 AND SWAP1 DUP3 AND LT ISZERO PUSH2 0x21B0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x5BE SWAP1 PUSH2 0x2CC7 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP3 GT ISZERO PUSH2 0x2336 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x5BE SWAP1 PUSH2 0x2D68 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP2 DUP4 SLT DUP1 ISZERO SWAP1 PUSH2 0x24E4 JUMPI POP DUP4 DUP2 SLT ISZERO JUMPDEST DUP1 PUSH2 0x24F9 JUMPI POP PUSH1 0x0 DUP4 SLT DUP1 ISZERO PUSH2 0x24F9 JUMPI POP DUP4 DUP2 SLT JUMPDEST PUSH2 0x21FC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x5BE SWAP1 PUSH2 0x2BD7 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x44 DUP3 MLOAD LT ISZERO PUSH2 0x255B JUMPI POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x1D DUP2 MSTORE PUSH32 0x5472616E73616374696F6E2072657665727465642073696C656E746C79000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x15D7 JUMP JUMPDEST PUSH1 0x4 DUP3 ADD SWAP2 POP DUP2 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x21B0 SWAP2 SWAP1 PUSH2 0x278A JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 PUSH1 0x1F DUP5 ADD SLT PUSH2 0x25A6 JUMPI DUP2 DUP3 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x25BC JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x20 DUP1 DUP4 MUL DUP6 ADD ADD GT ISZERO PUSH2 0x25D6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x25F1 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x25FC DUP2 PUSH2 0x2FFF JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x260C DUP2 PUSH2 0x3017 JUMP JUMPDEST SWAP2 POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH2 0x261C DUP2 PUSH2 0x3017 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x40 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x263B JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x2650 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x265C DUP7 DUP3 DUP8 ADD PUSH2 0x2595 JUMP JUMPDEST SWAP1 SWAP5 POP SWAP3 POP POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x261C DUP2 PUSH2 0x3017 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x20 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x2682 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT ISZERO PUSH2 0x2697 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH2 0x26A3 DUP6 DUP3 DUP7 ADD PUSH2 0x2595 JUMP JUMPDEST SWAP1 SWAP7 SWAP1 SWAP6 POP SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x26C0 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x21FC DUP2 PUSH2 0x3017 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x26DC JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x21FC DUP2 PUSH2 0x2FFF JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x26F8 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x21FC DUP2 PUSH2 0x2FFF JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH2 0x100 DUP10 DUP12 SUB SLT ISZERO PUSH2 0x271F JUMPI DUP4 DUP5 REVERT JUMPDEST DUP9 CALLDATALOAD PUSH2 0x272A DUP2 PUSH2 0x2FFF JUMP JUMPDEST SWAP8 POP PUSH1 0x20 DUP10 ADD CALLDATALOAD PUSH2 0x273A DUP2 PUSH2 0x2FFF JUMP JUMPDEST SWAP7 POP PUSH1 0x40 DUP10 ADD CALLDATALOAD PUSH2 0x274A DUP2 PUSH2 0x2FFF JUMP JUMPDEST SWAP6 POP PUSH1 0x60 DUP10 ADD CALLDATALOAD SWAP5 POP PUSH1 0x80 DUP10 ADD CALLDATALOAD SWAP4 POP PUSH1 0xA0 DUP10 ADD CALLDATALOAD PUSH1 0xFF DUP2 AND DUP2 EQ PUSH2 0x276D JUMPI DUP4 DUP5 REVERT JUMPDEST SWAP8 SWAP11 SWAP7 SWAP10 POP SWAP5 SWAP8 SWAP4 SWAP7 SWAP3 SWAP6 SWAP3 SWAP5 POP POP POP PUSH1 0xC0 DUP3 ADD CALLDATALOAD SWAP2 PUSH1 0xE0 ADD CALLDATALOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x279B JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 GT ISZERO PUSH2 0x27B1 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 DUP5 ADD SWAP2 POP DUP5 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x27C4 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP2 MLOAD DUP2 DUP2 GT ISZERO PUSH2 0x27D2 JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x27E5 PUSH1 0x1F DUP3 ADD PUSH1 0x1F NOT AND PUSH1 0x20 ADD PUSH2 0x2FAD JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE DUP6 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x27FB JUMPI DUP4 DUP5 REVERT JUMPDEST PUSH2 0x280C DUP2 PUSH1 0x20 DUP5 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x2FD3 JUMP JUMPDEST POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2826 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x2830 PUSH1 0x80 PUSH2 0x2FAD JUMP JUMPDEST DUP3 MLOAD PUSH2 0x283B DUP2 PUSH2 0x2FFF JUMP JUMPDEST DUP1 DUP3 MSTORE POP PUSH1 0x20 DUP4 ADD MLOAD PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 DUP4 ADD MLOAD PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 DUP4 ADD MLOAD PUSH1 0x60 DUP3 ADD MSTORE DUP1 SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2878 JUMPI DUP1 DUP2 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x2890 JUMPI DUP1 DUP2 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x28A9 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH2 0x28BB DUP2 PUSH2 0x2FFF JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x28DA JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 CALLDATALOAD SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x28EC DUP2 PUSH2 0x2FFF JUMP JUMPDEST SWAP2 POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH2 0x261C DUP2 PUSH2 0x2FFF JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x2910 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP4 CALLDATALOAD SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD SWAP2 POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH2 0x261C DUP2 PUSH2 0x2FFF JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x293E JUMPI DUP2 DUP3 REVERT JUMPDEST DUP5 CALLDATALOAD SWAP4 POP PUSH1 0x20 DUP6 ADD CALLDATALOAD SWAP3 POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH2 0x2957 DUP2 PUSH2 0x2FFF JUMP JUMPDEST SWAP2 POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH2 0x2967 DUP2 PUSH2 0x3017 JUMP JUMPDEST SWAP4 SWAP7 SWAP3 SWAP6 POP SWAP1 SWAP4 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP1 DUP5 MSTORE PUSH2 0x298A DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x2FD3 JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x20 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP5 DUP4 CALLDATACOPY SWAP2 ADD SWAP1 DUP2 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD PUSH2 0x29C0 DUP2 DUP5 PUSH1 0x20 DUP8 ADD PUSH2 0x2FD3 JUMP JUMPDEST SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 DUP5 AND DUP2 MSTORE SWAP2 SWAP1 SWAP3 AND PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP8 DUP9 AND DUP2 MSTORE SWAP6 SWAP1 SWAP7 AND PUSH1 0x20 DUP7 ADD MSTORE PUSH1 0x40 DUP6 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x60 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xFF AND PUSH1 0x80 DUP4 ADD MSTORE PUSH1 0xA0 DUP3 ADD MSTORE PUSH1 0xC0 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xE0 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 DUP3 MSTORE DUP4 MLOAD SWAP1 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP1 PUSH1 0x20 SWAP1 PUSH1 0x60 DUP5 ADD SWAP1 DUP3 DUP8 ADD DUP5 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x2A97 JUMPI DUP2 MLOAD ISZERO ISZERO DUP5 MSTORE SWAP3 DUP5 ADD SWAP3 SWAP1 DUP5 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x2A79 JUMP JUMPDEST POP POP POP DUP4 DUP2 SUB DUP3 DUP6 ADD MSTORE DUP1 DUP6 MLOAD PUSH2 0x2AAE DUP2 DUP5 PUSH2 0x2EE9 JUMP JUMPDEST SWAP2 POP DUP2 SWAP3 POP DUP4 DUP2 MUL DUP3 ADD DUP5 DUP9 ADD DUP7 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x2AE7 JUMPI DUP6 DUP4 SUB DUP6 MSTORE PUSH2 0x2AD5 DUP4 DUP4 MLOAD PUSH2 0x2972 JUMP JUMPDEST SWAP5 DUP8 ADD SWAP5 SWAP3 POP SWAP1 DUP7 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x2ABD JUMP JUMPDEST POP SWAP1 SWAP10 SWAP9 POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 MSTORE PUSH2 0x21FC PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x2972 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x15 SWAP1 DUP3 ADD MSTORE PUSH21 0x426F72696E674D6174683A20556E646572666C6F77 PUSH1 0x58 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0xB SWAP1 DUP3 ADD MSTORE PUSH11 0x496E7465676572203C203 PUSH1 0xAC SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x23 SWAP1 DUP3 ADD MSTORE PUSH32 0x4D61737465724368656656323A2042616C616E6365206D757374206578636565 PUSH1 0x40 DUP3 ADD MSTORE PUSH3 0x64203 PUSH1 0xEC SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1C SWAP1 DUP3 ADD MSTORE PUSH32 0x426F72696E6745524332303A205472616E73666572206661696C656400000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x21 SWAP1 DUP3 ADD MSTORE PUSH32 0x5369676E6564536166654D6174683A206164646974696F6E206F766572666C6F PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x77 PUSH1 0xF8 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x15 SWAP1 DUP3 ADD MSTORE PUSH21 0x4F776E61626C653A207A65726F2061646472657373 PUSH1 0x58 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x29 SWAP1 DUP3 ADD MSTORE PUSH32 0x4D61737465724368656656323A206D696772617465642062616C616E6365206D PUSH1 0x40 DUP3 ADD MSTORE PUSH9 0xEAE6E840DAC2E8C6D PUSH1 0xBB SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1C SWAP1 DUP3 ADD MSTORE PUSH32 0x426F72696E674D6174683A2075696E74313238204F766572666C6F7700000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x18 SWAP1 DUP3 ADD MSTORE PUSH32 0x426F72696E674D6174683A20416464204F766572666C6F770000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C657220213D2070656E64696E67206F776E6572 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1B SWAP1 DUP3 ADD MSTORE PUSH32 0x426F72696E674D6174683A2075696E743634204F766572666C6F770000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1D SWAP1 DUP3 ADD MSTORE PUSH32 0x4D61737465724368656656323A206E6F206D69677261746F7220736574000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x24 SWAP1 DUP3 ADD MSTORE PUSH32 0x5369676E6564536166654D6174683A207375627472616374696F6E206F766572 PUSH1 0x40 DUP3 ADD MSTORE PUSH4 0x666C6F77 PUSH1 0xE0 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD MSTORE PUSH32 0x426F72696E6745524332303A205472616E7366657246726F6D206661696C6564 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x18 SWAP1 DUP3 ADD MSTORE PUSH32 0x426F72696E674D6174683A204D756C204F766572666C6F770000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH1 0x20 DUP1 DUP4 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB SWAP1 DUP2 AND SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 SWAP3 DUP4 ADD MLOAD AND SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP4 SWAP1 SWAP4 AND DUP4 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB SWAP2 DUP3 AND PUSH1 0x20 DUP5 ADD MSTORE AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP5 DUP6 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP4 DUP5 AND PUSH1 0x20 DUP7 ADD MSTORE SWAP2 SWAP1 SWAP3 AND PUSH1 0x40 DUP5 ADD MSTORE PUSH1 0x60 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x80 DUP3 ADD MSTORE PUSH1 0xA0 ADD SWAP1 JUMP JUMPDEST SWAP2 DUP3 MSTORE ISZERO ISZERO PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB SWAP4 SWAP1 SWAP4 AND DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 CALLDATALOAD PUSH1 0x1E NOT DUP5 CALLDATASIZE SUB ADD DUP2 SLT PUSH2 0x2F7F JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 ADD DUP1 CALLDATALOAD SWAP2 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP3 GT ISZERO PUSH2 0x2F98 JUMPI DUP3 DUP4 REVERT JUMPDEST PUSH1 0x20 ADD SWAP2 POP CALLDATASIZE DUP2 SWAP1 SUB DUP3 SGT ISZERO PUSH2 0x25D6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x2FCB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x2FEE JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x2FD6 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x135C JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x3014 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x3014 JUMPI PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DUP2 0x4E 0x5D REVERT 0xEE PUSH1 0x6B SWAP16 0xF8 CALLDATALOAD PUSH27 0x8C99C275BC5BEE65FD89E04F2E557682DA8CCC9F4264736F6C6343 STOP MOD 0xC STOP CALLER ", + "sourceMap": "1098:13971:5:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;774:472:1;;;;;;;;;;-1:-1:-1;774:472:1;;;;;:::i;:::-;;:::i;:::-;;4876:98:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11235:670;;;;;;;;;;-1:-1:-1;11235:670:5;;;;;:::i;:::-;;:::i;2289:26::-;;;;;;;;;;-1:-1:-1;2289:26:5;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;2728:30::-;;;;;;;;;;;;;:::i;12079:788::-;;;;;;;;;;-1:-1:-1;12079:788:5;;;;;:::i;:::-;;:::i;7716:792::-;;;;;;;;;;-1:-1:-1;7716:792:5;;;;;:::i;:::-;;:::i;4435:385::-;;;;;;;;;;-1:-1:-1;4435:385:5;;;;;:::i;:::-;;:::i;6766:100::-;;;;;;;;;;-1:-1:-1;6766:100:5;;;;;:::i;:::-;;:::i;14506:561::-;;;;;;;;;;-1:-1:-1;14506:561:5;;;;;:::i;:::-;;:::i;7020:474::-;;;;;;;;;;-1:-1:-1;7020:474:5;;;;;:::i;:::-;;:::i;1295:348:1:-;;;;;;;;;;;;;:::i;14235:91:5:-;;;;;;;;;;;;;:::i;9348:772::-;;;;;;;;;;-1:-1:-1;9348:772:5;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;8686:188::-;;;;;;;;;;-1:-1:-1;8686:188:5;;;;;:::i;:::-;;:::i;2067:35::-;;;;;;;;;;;;;:::i;2381:23::-;;;;;;;;;;-1:-1:-1;2381:23:5;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;2161:246:0:-;;;;;;;;;;-1:-1:-1;2161:246:0;;;;;:::i;:::-;;:::i;2213:29:5:-;;;;;;;;;;;;;:::i;6222:406::-;;;;;;;;;;-1:-1:-1;6222:406:5;;;;;:::i;:::-;;:::i;350:20:1:-;;;;;;;;;;;;;:::i;10358:671:5:-;;;;;;;;;;-1:-1:-1;10358:671:5;;;;;:::i;:::-;;:::i;2563:66::-;;;;;;;;;;-1:-1:-1;2563:66:5;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;1977:29::-;;;;;;;;;;;;;:::i;5306:529::-;;;;;;;;;;-1:-1:-1;5306:529:5;;;;;:::i;:::-;;:::i;8952:217::-;;;;;;;;;;;;;:::i;2472:27::-;;;;;;;;;;-1:-1:-1;2472:27:5;;;;;:::i;:::-;;:::i;13147:982::-;;;;;;;;;;-1:-1:-1;13147:982:5;;;;;:::i;:::-;;:::i;1260:554:0:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;397:27:1:-;;;;;;;;;;;;;:::i;1888:40:5:-;;;;;;;;;;;;;:::i;774:472:1:-;1746:5;;-1:-1:-1;;;;;1746:5:1;1732:10;:19;1724:64;;;;-1:-1:-1;;;1724:64:1;;;;;;;:::i;:::-;;;;;;;;;879:6:::1;875:364;;;-1:-1:-1::0;;;;;933:22:1;::::1;::::0;::::1;::::0;:34:::1;;;959:8;933:34;925:68;;;;-1:-1:-1::0;;;925:68:1::1;;;;;;;:::i;:::-;1060:5;::::0;;1039:37:::1;::::0;-1:-1:-1;;;;;1039:37:1;;::::1;::::0;1060:5;::::1;::::0;1039:37:::1;::::0;::::1;1091:5;:16:::0;;-1:-1:-1;;;;;1091:16:1;::::1;-1:-1:-1::0;;;;;;1091:16:1;;::::1;;::::0;;;;1122:25;;;;::::1;::::0;;875:364:::1;;;1204:12;:23:::0;;-1:-1:-1;;;;;;1204:23:1::1;-1:-1:-1::0;;;;;1204:23:1;::::1;;::::0;;875:364:::1;774:472:::0;;;:::o;4876:98:5:-;4952:8;:15;;4876:98::o;11235:670::-;11311:20;;:::i;:::-;11334:15;11345:3;11334:10;:15::i;:::-;11359:21;11383:13;;;:8;:13;;;;;;;;11397:10;11383:25;;;;;;;11494:21;;11311:38;;-1:-1:-1;11383:25:5;11456:84;;2876:4;;11483:33;;:6;;-1:-1:-1;;;;;11483:33:5;:10;:33::i;:::-;:55;;;;;11456:15;;;;;11483:55;;11456:19;:84::i;:::-;11438:15;;;:102;11564:11;;:23;;11580:6;11564:15;:23::i;:::-;11550:37;;11644:8;:13;;11550:11;;11644:8;11653:3;;11644:13;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11644:13:5;;-1:-1:-1;11671:32:5;;11667:123;;11767:11;;11719:60;;-1:-1:-1;;;11719:60:5;;-1:-1:-1;;;;;11719:23:5;;;;;:60;;11743:3;;11748:10;;11760:2;;11764:1;;11767:11;11719:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11667:123;11808:37;11834:2;11838:6;11808:7;11816:3;11808:12;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11808:12:5;;:37;:25;:37::i;:::-;11895:2;-1:-1:-1;;;;;11861:37:5;11882:3;11870:10;-1:-1:-1;;;;;11861:37:5;;11887:6;11861:37;;;;;;:::i;:::-;;;;;;;;11235:670;;;;;;:::o;2289:26::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2289:26:5;;;-1:-1:-1;;;;;;;;;2289:26:5;;;;;-1:-1:-1;;;2289:26:5;;;;:::o;2728:30::-;;;;:::o;12079:788::-;12138:20;;:::i;:::-;12161:15;12172:3;12161:10;:15::i;:::-;12186:21;12210:13;;;:8;:13;;;;;;;;12224:10;12210:25;;;;;;;12294:21;;12278:11;;12138:38;;-1:-1:-1;12210:25:5;;2876:4;;12278:38;;:11;-1:-1:-1;;;;;12278:38:5;:15;:38::i;:::-;:60;;;;;;12245:94;;12349:21;12373:49;:37;12394:4;:15;;;12373:16;:20;;:37;;;;:::i;:::-;:47;:49::i;:::-;12452:15;;;:34;;;12349:73;-1:-1:-1;12525:18:5;;12521:86;;12559:37;-1:-1:-1;;;;;12559:5:5;:18;12578:2;12582:13;12559:18;:37::i;:::-;12625:19;12647:8;12656:3;12647:13;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12647:13:5;;-1:-1:-1;12674:32:5;;12670:136;;12783:11;;12722:73;;-1:-1:-1;;;12722:73:5;;-1:-1:-1;;;;;12722:23:5;;;;;:73;;12747:3;;12752:10;;12764:2;;12768:13;;12783:11;12722:73;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12670:136;12841:3;12829:10;-1:-1:-1;;;;;12821:39:5;;12846:13;12821:39;;;;;;:::i;:::-;;;;;;;;12079:788;;;;;;;:::o;7716:792::-;7790:15;7817:20;;:::i;:::-;7840:8;7849:4;7840:14;;;;;;;;;;;;;;;;7817:37;;;;;;;;7840:14;;;;7817:37;-1:-1:-1;;;;;7817:37:5;;;;;-1:-1:-1;;;;;;;;7817:37:5;;;;;;;;-1:-1:-1;;;7817:37:5;;;;;;;;;;7888:14;;;:8;:14;;;;;-1:-1:-1;;;;;7888:21:5;;;;;;;;;;7946;;7996:7;:13;;7817:37;;-1:-1:-1;7888:21:5;;7919:48;;;7897:4;;7996:13;;;;;;;;;;;;;;;;:38;;-1:-1:-1;;;7996:38:5;;-1:-1:-1;;;;;7996:13:5;;;;:23;;:38;;8028:4;;7996:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7977:57;;8063:4;:20;;;-1:-1:-1;;;;;8048:35:5;:12;:35;:52;;;;-1:-1:-1;8087:13:5;;;8048:52;8044:342;;;8116:14;8133:38;8150:4;:20;;;-1:-1:-1;;;;;8133:38:5;:12;:16;;:38;;;;:::i;:::-;8116:55;;8185:19;8258:15;;8207:48;8239:4;:15;;;-1:-1:-1;;;;;8207:48:5;:27;8218:15;:13;:15::i;:::-;8207:6;;:10;:27::i;:::-;:31;;:48::i;:::-;:66;;;;;;;-1:-1:-1;8306:69:5;8366:8;8327:36;8207:66;2876:4;8327:15;:36::i;:::-;:47;;;;;8306:16;;8327:47;;8306:20;:69::i;:::-;8287:88;;8044:342;;;8473:15;;;;8412:11;;8405:96;;:84;;2876:4;;8412:33;;8428:16;8412:15;:33::i;:::-;:55;;;;;;;8405:67;:84::i;:96::-;8395:106;7716:792;-1:-1:-1;;;;;;;7716:792:5:o;4435:385::-;4505:32;;-1:-1:-1;;;4505:32:5;;4487:15;;-1:-1:-1;;;;;4505:20:5;;;;;:32;;4526:10;;4505:32;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4487:50;-1:-1:-1;4555:12:5;4547:60;;;;-1:-1:-1;;;4547:60:5;;;;;;;:::i;:::-;4617:63;-1:-1:-1;;;;;4617:27:5;;4645:10;4665:4;4672:7;4617:27;:63::i;:::-;4690:49;;-1:-1:-1;;;4690:49:5;;-1:-1:-1;;;;;4690:18:5;;;;;:49;;4717:11;;4731:7;;4690:49;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;4749:40:5;;-1:-1:-1;;;4749:40:5;;-1:-1:-1;;;;;4749:11:5;:19;;;;:40;;4769:10;;4781:7;;4749:40;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4804:9:5;;;;-1:-1:-1;4804:9:5;;-1:-1:-1;4804:9:5;4435:385;;:::o;6766:100::-;1746:5:1;;-1:-1:-1;;;;;1746:5:1;1732:10;:19;1724:64;;;;-1:-1:-1;;;1724:64:1;;;;;;;:::i;:::-;6839:8:5::1;:20:::0;;-1:-1:-1;;;;;;6839:20:5::1;-1:-1:-1::0;;;;;6839:20:5;;;::::1;::::0;;;::::1;::::0;;6766:100::o;14506:561::-;14575:21;14599:13;;;:8;:13;;;;;;;;14613:10;14599:25;;;;;;;14651:11;;14672:15;;;-1:-1:-1;14697:15:5;;:19;;;14749:8;:13;;14599:25;;14651:11;;14608:3;;14749:13;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14749:13:5;;-1:-1:-1;14776:32:5;;14772:113;;14824:50;;-1:-1:-1;;;14824:50:5;;-1:-1:-1;;;;;14824:23:5;;;;;:50;;14848:3;;14853:10;;14865:2;;14869:1;;;;14824:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14772:113;14962:37;14988:2;14992:6;14962:7;14970:3;14962:12;;;;;;;:37;15057:2;-1:-1:-1;;;;;15014:46:5;15044:3;15032:10;-1:-1:-1;;;;;15014:46:5;;15049:6;15014:46;;;;;;:::i;:::-;;;;;;;;14506:561;;;;;:::o;7020:474::-;7084:8;;-1:-1:-1;;;;;7084:8:5;7068:73;;;;-1:-1:-1;;;7068:73:5;;;;;;;:::i;:::-;7151:15;7169:7;7177:4;7169:13;;;;;;;;;;;;;;;;;7206:33;;-1:-1:-1;;;7206:33:5;;-1:-1:-1;;;;;7169:13:5;;;;-1:-1:-1;7169:13:5;;7206:18;;:33;;7233:4;;7206:33;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7274:8;;7249:40;;-1:-1:-1;;;7249:40:5;;7192:47;;-1:-1:-1;;;;;;7249:16:5;;;;;;:40;;7274:8;;7192:47;;7249:40;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;7319:8:5;;:26;;-1:-1:-1;;;7319:26:5;;7299:17;;-1:-1:-1;;;;;7319:8:5;;:16;;:26;;7336:8;;7319:26;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7370:35;;-1:-1:-1;;;7370:35:5;;7299:46;;-1:-1:-1;;;;;;7370:20:5;;;;;:35;;7399:4;;7370:35;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7363:3;:42;7355:96;;;;-1:-1:-1;;;7355:96:5;;;;;;;:::i;:::-;7477:10;7461:7;7469:4;7461:13;;;;;;;;;;;;;;;;:26;;;;;-1:-1:-1;;;;;7461:26:5;;;;;-1:-1:-1;;;;;7461:26:5;;;;;;7020:474;;;;:::o;1295:348:1:-;1363:12;;-1:-1:-1;;;;;1363:12:1;1423:10;:27;;1415:72;;;;-1:-1:-1;;;1415:72:1;;;;;;;:::i;:::-;1546:5;;;1525:42;;-1:-1:-1;;;;;1525:42:1;;;;1546:5;;;1525:42;;;1578:5;:21;;-1:-1:-1;;;;;1578:21:1;;;-1:-1:-1;;;;;;1578:21:1;;;;;;;1610:25;;;;;;;1295:348::o;14235:91:5:-;14285:34;;-1:-1:-1;;;14285:34:5;;-1:-1:-1;;;;;14285:11:5;:19;;;;:34;;14305:10;;14317:1;;14285:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14235:91::o;9348:772::-;9397:20;;:::i;:::-;9436:8;9445:3;9436:13;;;;;;;;;;;;;;;;;9429:20;;;;;;;;9436:13;;;;9429:20;-1:-1:-1;;;;;9429:20:5;;;;-1:-1:-1;;;;;;;;9429:20:5;;;;;;;;;;-1:-1:-1;;;9429:20:5;;;;;;;;;-1:-1:-1;9463:12:5;:35;9459:655;;;9514:16;9533:7;9541:3;9533:12;;;;;;;;;;;;;;;;;;:37;;-1:-1:-1;;;9533:37:5;;-1:-1:-1;;;;;9533:12:5;;;;:22;;:37;;9564:4;;9533:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9514:56;-1:-1:-1;9588:12:5;;9584:338;;9620:14;9637:38;9654:4;:20;;;-1:-1:-1;;;;;9637:38:5;:12;:16;;:38;;;;:::i;:::-;9620:55;;9693:19;9766:15;;9715:48;9747:4;:15;;;-1:-1:-1;;;;;9715:48:5;:27;9726:15;:13;:15::i;9715:48::-;:66;;;;;;;-1:-1:-1;9823:84:5;9849:57;9889:8;9850:36;9715:66;2876:4;9850:15;:36::i;:::-;:47;;;;;;9849:55;:57::i;:::-;9823:21;;-1:-1:-1;;;;;9823:25:5;;;:84::i;:::-;-1:-1:-1;;;;;9799:108:5;;;-1:-1:-1;;9584:338:5;9958:19;:12;:17;:19::i;:::-;-1:-1:-1;;;;;9935:42:5;:20;;;:42;9991:8;:13;;9935:4;;9991:8;10000:3;;9991:13;;;;;;;;;;;;;;;:20;;:13;;:20;;;;;;;;;;;-1:-1:-1;;;;;;9991:20:5;;;-1:-1:-1;;;;;9991:20:5;;;;;;;-1:-1:-1;;;;9991:20:5;-1:-1:-1;;;;;;;;9991:20:5;;;;;-1:-1:-1;;;;;9991:20:5;-1:-1:-1;;;9991:20:5;;;;;;;;;;;;;;10049;;;10081:21;;10030:73;;10044:3;;10030:73;;;;10049:20;;10071:8;;10030:73;:::i;:::-;;;;;;;;9459:655;;9348:772;;;:::o;8686:188::-;8769:4;8755:11;8790:78;8814:3;8810:1;:7;8790:78;;;8838:19;8849:4;;8854:1;8849:7;;;;;;;;;;;;;8838:10;:19::i;:::-;-1:-1:-1;8819:3:5;;8790:78;;2067:35;;;:::o;2381:23::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2381:23:5;;-1:-1:-1;2381:23:5;:::o;2161:246:0:-;2350:49;;-1:-1:-1;;;2350:49:0;;-1:-1:-1;;;;;2350:12:0;;;;;:49;;2363:4;;2369:2;;2373:6;;2381:8;;2391:1;;2394;;2397;;2350:49;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2161:246;;;;;;;;:::o;2213:29:5:-;;;-1:-1:-1;;;;;2213:29:5;;:::o;6222:406::-;1746:5:1;;-1:-1:-1;;;;;1746:5:1;1732:10;:19;1724:64;;;;-1:-1:-1;;;1724:64:1;;;;;;;:::i;:::-;6352:63:5::1;6403:11;6352:46;6372:8;6381:4;6372:14;;;;;;;;;::::0;;;::::1;::::0;;;::::1;:25:::0;6352:15:::1;::::0;;-1:-1:-1;;;6372:25:5;::::1;-1:-1:-1::0;;;;;6372:25:5::1;6352:19;:46::i;:::-;:50:::0;::::1;:63::i;:::-;6334:15;:81:::0;6453:18:::1;:11:::0;:16:::1;:18::i;:::-;6425:8;6434:4;6425:14;;;;;;;;;;;;;;;:25;;;:46;;;;;-1:-1:-1::0;;;;;6425:46:5::1;;;;;-1:-1:-1::0;;;;;6425:46:5::1;;;;;;6485:9;6481:46;;;6515:9;6498:8;6507:4;6498:14;;;;;;;;;;;;;;;;:26;;;;;-1:-1:-1::0;;;;;6498:26:5::1;;;;;-1:-1:-1::0;;;;;6498:26:5::1;;;;;;6481:46;6571:9;:38;;6595:8;6604:4;6595:14;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;6595:14:5::1;6571:38;;;6583:9;6571:38;-1:-1:-1::0;;;;;6541:80:5::1;6552:4;6541:80;6558:11;6611:9;6541:80;;;;;;;:::i;:::-;;;;;;;;6222:406:::0;;;;:::o;350:20:1:-;;;-1:-1:-1;;;;;350:20:1;;:::o;10358:671:5:-;10433:20;;:::i;:::-;10456:15;10467:3;10456:10;:15::i;:::-;10481:21;10505:13;;;:8;:13;;;;;;;;-1:-1:-1;;;;;10505:17:5;;;;;;;;;10566:11;;10433:38;;-1:-1:-1;10505:17:5;10566:23;;10582:6;10566:15;:23::i;:::-;10552:37;;10655:21;;10617:84;;2876:4;;10644:33;;:6;;-1:-1:-1;;;;;10644:33:5;:10;:33::i;:::-;:55;;;;;10617:15;;;;;10644:55;;10617:19;:84::i;:::-;10599:4;:15;;:102;;;;10736:19;10758:8;10767:3;10758:13;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10758:13:5;;-1:-1:-1;10785:32:5;;10781:115;;10873:11;;10833:52;;-1:-1:-1;;;10833:52:5;;-1:-1:-1;;;;;10833:23:5;;;;;:52;;10857:3;;10862:2;;;;10870:1;;10873:11;10833:52;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10781:115;10906:64;10936:10;10956:4;10963:6;10906:7;10914:3;10906:12;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10906:12:5;;:64;;:29;:64::i;:::-;11019:2;-1:-1:-1;;;;;10986:36:5;11006:3;10994:10;-1:-1:-1;;;;;10986:36:5;;11011:6;10986:36;;;;;;:::i;2563:66::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1977:29::-;;;:::o;5306:529::-;1746:5:1;;-1:-1:-1;;;;;1746:5:1;1732:10;:19;1724:64;;;;-1:-1:-1;;;1724:64:1;;;;;;;:::i;:::-;5470:15:5::1;::::0;5430:12:::1;::::0;5470:31:::1;::::0;5490:10;5470:19:::1;:31::i;:::-;5452:15;:49:::0;5511:7:::1;:22:::0;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;-1:-1:-1;;;;;5511:22:5;;::::1;-1:-1:-1::0;;;;;;5511:22:5;;::::1;;::::0;;;5543:8:::1;:24:::0;;;;::::1;::::0;;-1:-1:-1;5543:24:5;;;;;;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;5592:149:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;;5511:22:5::1;5592:149:::0;::::1;5675:22;:15:::0;:20:::1;:22::i;:::-;-1:-1:-1::0;;;;;5592:149:5::1;;;;;5627:17;:10;:15;:17::i;:::-;-1:-1:-1::0;;;;;5592:149:5;;::::1;::::0;;;5578:164;;::::1;::::0;;::::1;::::0;;-1:-1:-1;5578:164:5;;;::::1;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;5578:164:5::1;-1:-1:-1::0;;;;;5578:164:5;;;::::1;-1:-1:-1::0;;;5578:164:5::1;-1:-1:-1::0;;;;;;;;;5578:164:5;;::::1;-1:-1:-1::0;;;;;;5578:164:5;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;::::1;;::::0;;5773:7:::1;:14:::0;-1:-1:-1;;;;;5757:71:5;;::::1;::::0;;;::::1;::::0;5773:21:::1;::::0;:18:::1;:21::i;:::-;5757:71;5796:10;5757:71;;;;;;:::i;:::-;;;;;;;;1799:1:1;5306:529:5::0;;;:::o;8952:217::-;8998:14;9133:11;-1:-1:-1;;;;;9133:27:5;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9086:32;;-1:-1:-1;;;9086:32:5;;9033:97;;-1:-1:-1;;;;;9086:11:5;:20;;;;:32;;9107:10;;9086:32;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:43;;;2819:4;;9033:52;:97::i;:::-;:129;;;;;;9024:138;;8952:217;:::o;2472:27::-;;;;;;;;;;13147:982;13233:20;;:::i;:::-;13256:15;13267:3;13256:10;:15::i;:::-;13281:21;13305:13;;;:8;:13;;;;;;;;13319:10;13305:25;;;;;;;13389:21;;13373:11;;13233:38;;-1:-1:-1;13305:25:5;;2876:4;;13373:38;;:11;-1:-1:-1;;;;;13373:38:5;:15;:38::i;:::-;:60;;;;;;13340:94;;13444:21;13468:49;:37;13489:4;:15;;;13468:16;:20;;:37;;;;:::i;:49::-;13444:73;;13565:85;2876:4;13593:33;13604:4;:21;;;-1:-1:-1;;;;;13593:33:5;:6;:10;;:33;;;;:::i;:::-;:55;;;;;13565:16;;13593:55;;13565:20;:85::i;:::-;13547:15;;;:103;13674:11;;:23;;13690:6;13674:15;:23::i;:::-;13660:37;;13740;-1:-1:-1;;;;;13740:5:5;:18;13759:2;13763:13;13740:18;:37::i;:::-;13788:19;13810:8;13819:3;13810:13;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;13810:13:5;;-1:-1:-1;13837:32:5;;13833:135;;13945:11;;13885:72;;-1:-1:-1;;;13885:72:5;;-1:-1:-1;;;;;13885:23:5;;;;;:72;;13909:3;;13914:10;;13926:2;;13930:13;;13945:11;13885:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13833:135;13978:37;14004:2;14008:6;13978:7;13986:3;13978:12;;;;;;;:37;14065:2;-1:-1:-1;;;;;14031:37:5;14052:3;14040:10;-1:-1:-1;;;;;14031:37:5;;14057:6;14031:37;;;;;;:::i;:::-;;;;;;;;14103:3;14091:10;-1:-1:-1;;;;;14083:39:5;;14108:13;14083:39;;;;;;:::i;:::-;;;;;;;;13147:982;;;;;;;;:::o;1260:554:0:-;1343:23;;1451:5;-1:-1:-1;;;;;1440:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1440:24:0;-1:-1:-1;1428:36:0;-1:-1:-1;1497:5:0;-1:-1:-1;;;;;1485:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1475:35;;1526:9;1521:286;1541:16;;;1521:286;;;1580:12;1594:19;1625:4;1644:5;;1650:1;1644:8;;;;;;;;;;;;;;;;;;:::i;:::-;1617:36;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1579:74;;;;1676:7;:24;;;;1688:12;1687:13;1676:24;1702:21;1716:6;1702:13;:21::i;:::-;1668:56;;;;;-1:-1:-1;;;1668:56:0;;;;;;;;:::i;:::-;;1754:7;1739:9;1749:1;1739:12;;;;;;;;;;;;;:22;;;;;;;;;;;1789:6;1776:7;1784:1;1776:10;;;;;;;;;;;;;;;;;:19;-1:-1:-1;;1559:3:0;;1521:286;;;;1260:554;;;;;;:::o;397:27:1:-;;;-1:-1:-1;;;;;397:27:1;;:::o;1888:40:5:-;;;:::o;470:137:4:-;528:9;548:6;;;:28;;-1:-1:-1;;563:5:4;;;575:1;570;563:5;570:1;558:13;;;;;:18;548:28;540:65;;;;-1:-1:-1;;;540:65:4;;;;;;;:::i;:::-;470:137;;;;:::o;1895:213:8:-;1951:6;1980:5;;;2004:6;;;;;;:16;;;2019:1;2014;:6;;2004:16;2003:38;;;;2030:1;2026;:5;:14;;;;;2039:1;2035;:5;2026:14;1995:87;;;;-1:-1:-1;;;1995:87:8;;;;;;;:::i;:::-;2100:1;1895:213;-1:-1:-1;;;1895:213:8:o;342:122:4:-;425:5;;;420:16;;;;412:50;;;;-1:-1:-1;;;412:50:4;;;;;;;:::i;951:304:3:-;1036:12;1050:17;1079:5;-1:-1:-1;;;;;1071:19:3;1114:10;1126:2;1130:6;1091:46;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1091:46:3;;;;;;;;;;;1071:67;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1035:103;;;;1157:7;:57;;;;-1:-1:-1;1169:11:3;;:16;;:44;;;1200:4;1189:24;;;;;;;;;;;;:::i;:::-;1149:98;;;;-1:-1:-1;;;1149:98:3;;;;;;;:::i;:::-;951:304;;;;;:::o;2557:135:8:-;2609:7;2641:1;2636;:6;;2628:30;;;;-1:-1:-1;;;2628:30:8;;;;;;;:::i;:::-;-1:-1:-1;2683:1:8;2557:135::o;211:125:4:-;294:5;;;289:16;;;;281:53;;;;-1:-1:-1;;;281:53:4;;;;;;;:::i;1263:332:3:-;1366:12;1380:17;1409:5;-1:-1:-1;;;;;1401:19:3;1444:10;1456:4;1462:2;1466:6;1421:52;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1421:52:3;;;;;;;;;;;1401:73;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1365:109;;;;1493:7;:57;;;;-1:-1:-1;1505:11:3;;:16;;:44;;;1536:4;1525:24;;;;;;;;;;;;:::i;:::-;1485:102;;;;-1:-1:-1;;;1485:102:3;;;;;;;:::i;:::-;1263:332;;;;;;:::o;613:161:4:-;662:9;-1:-1:-1;;;;;692:16:4;;;684:57;;;;-1:-1:-1;;;684:57:4;;;;;;;:::i;1134:125::-;1217:5;;;-1:-1:-1;;;;;1212:16:4;;;;;;;;1204:53;;;;-1:-1:-1;;;1204:53:4;;;;;;;:::i;780:156::-;828:8;-1:-1:-1;;;;;857:15:4;;;849:55;;;;-1:-1:-1;;;849:55:4;;;;;;;:::i;2341:210:8:-;2397:6;2426:5;;;2450:6;;;;;;:16;;;2465:1;2460;:6;;2450:16;2449:38;;;;2476:1;2472;:5;:14;;;;;2485:1;2481;:5;2472:14;2441:84;;;;-1:-1:-1;;;2441:84:8;;;;;;;:::i;304:496:0:-;376:13;539:2;518:11;:18;:23;514:67;;;-1:-1:-1;543:38:0;;;;;;;;;;;;;;;;;;;514:67;685:4;672:11;668:22;653:37;;729:11;718:33;;;;;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;158:363::-;;;299:3;292:4;284:6;280:17;276:27;266:2;;-1:-1;;307:12;266:2;-1:-1;337:20;;-1:-1;;;;;366:30;;363:2;;;-1:-1;;399:12;363:2;443:4;435:6;431:17;419:29;;494:3;443:4;;478:6;474:17;435:6;460:32;;457:41;454:2;;;511:1;;501:12;454:2;259:262;;;;;:::o;3758:479::-;;;;3890:2;3878:9;3869:7;3865:23;3861:32;3858:2;;;-1:-1;;3896:12;3858:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;3948:63;-1:-1;4048:2;4084:22;;971:20;996:30;971:20;996:30;:::i;:::-;4056:60;-1:-1;4153:2;4189:22;;971:20;996:30;971:20;996:30;:::i;:::-;4161:60;;;;3852:385;;;;;:::o;4244:538::-;;;;4408:2;4396:9;4387:7;4383:23;4379:32;4376:2;;;-1:-1;;4414:12;4376:2;4472:17;4459:31;-1:-1;;;;;4502:6;4499:30;4496:2;;;-1:-1;;4532:12;4496:2;4570:91;4653:7;4644:6;4633:9;4629:22;4570:91;:::i;:::-;4552:109;;-1:-1;4552:109;-1:-1;;4698:2;4734:22;;971:20;996:30;971:20;996:30;:::i;4789:397::-;;;4928:2;4916:9;4907:7;4903:23;4899:32;4896:2;;;-1:-1;;4934:12;4896:2;4992:17;4979:31;-1:-1;;;;;5022:6;5019:30;5016:2;;;-1:-1;;5052:12;5016:2;5090:80;5162:7;5153:6;5142:9;5138:22;5090:80;:::i;:::-;5072:98;;;;-1:-1;4890:296;-1:-1;;;;4890:296::o;5193:257::-;;5305:2;5293:9;5284:7;5280:23;5276:32;5273:2;;;-1:-1;;5311:12;5273:2;1119:6;1113:13;1131:30;1155:5;1131:30;:::i;5457:269::-;;5575:2;5563:9;5554:7;5550:23;5546:32;5543:2;;;-1:-1;;5581:12;5543:2;1404:6;1391:20;1416:47;1457:5;1416:47;:::i;5733:291::-;;5862:2;5850:9;5841:7;5837:23;5833:32;5830:2;;;-1:-1;;5868:12;5830:2;1573:6;1567:13;1585:47;1626:5;1585:47;:::i;6031:1145::-;;;;;;;;;6266:3;6254:9;6245:7;6241:23;6237:33;6234:2;;;-1:-1;;6273:12;6234:2;1404:6;1391:20;1416:47;1457:5;1416:47;:::i;:::-;6325:77;-1:-1;6439:2;6478:22;;72:20;97:33;72:20;97:33;:::i;:::-;6447:63;-1:-1;6547:2;6586:22;;72:20;97:33;72:20;97:33;:::i;:::-;6555:63;-1:-1;6655:2;6694:22;;3414:20;;-1:-1;6763:3;6803:22;;3414:20;;-1:-1;6872:3;6910:22;;3690:20;44255:4;44244:16;;47641:33;;47631:2;;-1:-1;;47678:12;47631:2;6228:948;;;;-1:-1;6228:948;;;;;;6881:61;;-1:-1;;;6979:3;7019:22;;1240:20;;7088:3;7128:22;1240:20;;6228:948::o;7473:362::-;;7598:2;7586:9;7577:7;7573:23;7569:32;7566:2;;;-1:-1;;7604:12;7566:2;7655:17;7649:24;-1:-1;;;;;7693:18;7685:6;7682:30;7679:2;;;-1:-1;;7715:12;7679:2;7802:6;7791:9;7787:22;;;2110:3;2103:4;2095:6;2091:17;2087:27;2077:2;;-1:-1;;2118:12;2077:2;2158:6;2152:13;7693:18;40892:6;40889:30;40886:2;;;-1:-1;;40922:12;40886:2;2180:65;40995:9;40976:17;;-1:-1;;40972:33;7598:2;41053:15;2180:65;:::i;:::-;2171:74;;2265:6;2258:5;2251:21;2369:3;7598:2;2360:6;2293;2351:16;;2348:25;2345:2;;;-1:-1;;2376:12;2345:2;2396:39;2428:6;7598:2;2327:5;2323:16;7598:2;2293:6;2289:17;2396:39;:::i;:::-;-1:-1;7735:84;7560:275;-1:-1;;;;7560:275::o;7842:316::-;;7983:3;7971:9;7962:7;7958:23;7954:33;7951:2;;;-1:-1;;7990:12;7951:2;2645:20;7983:3;2645:20;:::i;:::-;1573:6;1567:13;1585:47;1626:5;1585:47;:::i;:::-;2750:74;2732:16;2725:100;;2892:2;2961:9;2957:22;3562:13;2892:2;2911:5;2907:16;2900:86;3058:2;3127:9;3123:22;3562:13;3058:2;3077:5;3073:16;3066:86;3225:2;3294:9;3290:22;3562:13;3225:2;3244:5;3240:16;3233:86;8042:100;;;;7945:213;;;;:::o;8165:241::-;;8269:2;8257:9;8248:7;8244:23;8240:32;8237:2;;;-1:-1;;8275:12;8237:2;-1:-1;3414:20;;8231:175;-1:-1;8231:175::o;8413:263::-;;8528:2;8516:9;8507:7;8503:23;8499:32;8496:2;;;-1:-1;;8534:12;8496:2;-1:-1;3562:13;;8490:186;-1:-1;8490:186::o;8683:366::-;;;8804:2;8792:9;8783:7;8779:23;8775:32;8772:2;;;-1:-1;;8810:12;8772:2;3427:6;3414:20;8862:63;;8962:2;9005:9;9001:22;72:20;97:33;124:5;97:33;:::i;:::-;8970:63;;;;8766:283;;;;;:::o;9056:555::-;;;;9226:2;9214:9;9205:7;9201:23;9197:32;9194:2;;;-1:-1;;9232:12;9194:2;3427:6;3414:20;9284:63;;9384:2;9441:9;9437:22;1391:20;1416:47;1457:5;1416:47;:::i;:::-;9392:77;-1:-1;9506:2;9563:22;;1908:20;1933:51;1908:20;1933:51;:::i;9618:491::-;;;;9756:2;9744:9;9735:7;9731:23;9727:32;9724:2;;;-1:-1;;9762:12;9724:2;3427:6;3414:20;9814:63;;9914:2;9957:9;9953:22;3414:20;9922:63;;10022:2;10065:9;10061:22;72:20;97:33;124:5;97:33;:::i;10116:647::-;;;;;10286:3;10274:9;10265:7;10261:23;10257:33;10254:2;;;-1:-1;;10293:12;10254:2;3427:6;3414:20;10345:63;;10445:2;10488:9;10484:22;3414:20;10453:63;;10553:2;10614:9;10610:22;1908:20;1933:51;1978:5;1933:51;:::i;:::-;10561:81;-1:-1;10679:2;10715:22;;971:20;996:30;971:20;996:30;:::i;:::-;10248:515;;;;-1:-1;10248:515;;-1:-1;;10248:515::o;13734:323::-;;13866:5;41507:12;42322:6;42317:3;42310:19;13949:52;13994:6;42359:4;42354:3;42350:14;42359:4;13975:5;13971:16;13949:52;:::i;:::-;40995:9;46579:14;-1:-1;;46575:28;14013:39;;;;42359:4;14013:39;;13814:243;-1:-1;;13814:243::o;22821:291::-;;46162:6;46157:3;46152;46139:30;46200:16;;46193:27;;;46200:16;22965:147;-1:-1;22965:147::o;23119:271::-;;14224:5;41507:12;14335:52;14380:6;14375:3;14368:4;14361:5;14357:16;14335:52;:::i;:::-;14399:16;;;;;23253:137;-1:-1;;23253:137::o;23397:222::-;-1:-1;;;;;43936:54;;;;11358:37;;23524:2;23509:18;;23495:124::o;23871:444::-;-1:-1;;;;;43936:54;;;11358:37;;43936:54;;;;24218:2;24203:18;;11358:37;24301:2;24286:18;;13344:37;;;;24054:2;24039:18;;24025:290::o;24322:884::-;-1:-1;;;;;43936:54;;;11358:37;;43936:54;;;;24778:2;24763:18;;11358:37;24861:2;24846:18;;13344:37;;;;24944:2;24929:18;;13344:37;;;;44255:4;44244:16;25023:3;25008:19;;22774:35;43947:42;25092:19;;13344:37;25191:3;25176:19;;13344:37;;;;24613:3;24598:19;;24584:622::o;25213:333::-;-1:-1;;;;;43936:54;;;;11358:37;;25532:2;25517:18;;13344:37;25368:2;25353:18;;25339:207::o;25553:653::-;25820:2;25834:47;;;41507:12;;25805:18;;;42310:19;;;25553:653;;42359:4;;42350:14;;;;41197;;;25553:653;11825:251;11850:6;11847:1;11844:13;11825:251;;;11911:13;;43224;43217:21;13116:34;;10912:14;;;;42044;;;;11872:1;11865:9;11825:251;;;11829:14;;;26045:9;26039:4;26035:20;42359:4;26019:9;26015:18;26008:48;26070:126;12353:5;41507:12;12372:95;12460:6;12455:3;12372:95;:::i;:::-;12365:102;;;;;42359:4;12524:6;12520:17;12515:3;12511:27;42359:4;12618:5;41197:14;-1:-1;12657:357;12682:6;12679:1;12676:13;12657:357;;;12744:9;12738:4;12734:20;12729:3;12722:33;11060:64;11120:3;12789:6;12783:13;11060:64;:::i;:::-;12993:14;;;;12803:90;-1:-1;42044:14;;;;11872:1;12697:9;12657:357;;;-1:-1;26062:134;;25791:415;-1:-1;;;;;;;;;25791:415::o;27275:310::-;;27422:2;27443:17;27436:47;27497:78;27422:2;27411:9;27407:18;27561:6;27497:78;:::i;27592:416::-;27792:2;27806:47;;;15950:2;27777:18;;;42310:19;-1:-1;;;42350:14;;;15966:44;16029:12;;;27763:245::o;28015:416::-;28215:2;28229:47;;;16280:2;28200:18;;;42310:19;-1:-1;;;42350:14;;;16296:34;16349:12;;;28186:245::o;28438:416::-;28638:2;28652:47;;;16600:2;28623:18;;;42310:19;16636:34;42350:14;;;16616:55;-1:-1;;;16691:12;;;16684:27;16730:12;;;28609:245::o;28861:416::-;29061:2;29075:47;;;16981:2;29046:18;;;42310:19;17017:30;42350:14;;;16997:51;17067:12;;;29032:245::o;29284:416::-;29484:2;29498:47;;;17318:2;29469:18;;;42310:19;17354:34;42350:14;;;17334:55;-1:-1;;;17409:12;;;17402:25;17446:12;;;29455:245::o;29707:416::-;29907:2;29921:47;;;17697:2;29892:18;;;42310:19;-1:-1;;;42350:14;;;17713:44;17776:12;;;29878:245::o;30130:416::-;30330:2;30344:47;;;18027:2;30315:18;;;42310:19;18063:34;42350:14;;;18043:55;-1:-1;;;18118:12;;;18111:33;18163:12;;;30301:245::o;30553:416::-;30753:2;30767:47;;;18414:2;30738:18;;;42310:19;18450:30;42350:14;;;18430:51;18500:12;;;30724:245::o;30976:416::-;31176:2;31190:47;;;18751:2;31161:18;;;42310:19;18787:26;42350:14;;;18767:47;18833:12;;;31147:245::o;31399:416::-;31599:2;31613:47;;;31584:18;;;42310:19;19120:34;42350:14;;;19100:55;19174:12;;;31570:245::o;31822:416::-;32022:2;32036:47;;;32007:18;;;42310:19;19461:34;42350:14;;;19441:55;19515:12;;;31993:245::o;32245:416::-;32445:2;32459:47;;;19766:2;32430:18;;;42310:19;19802:29;42350:14;;;19782:50;19851:12;;;32416:245::o;32668:416::-;32868:2;32882:47;;;20102:2;32853:18;;;42310:19;20138:31;42350:14;;;20118:52;20189:12;;;32839:245::o;33091:416::-;33291:2;33305:47;;;20440:2;33276:18;;;42310:19;20476:34;42350:14;;;20456:55;-1:-1;;;20531:12;;;20524:28;20571:12;;;33262:245::o;33514:416::-;33714:2;33728:47;;;33699:18;;;42310:19;20858:34;42350:14;;;20838:55;20912:12;;;33685:245::o;33937:416::-;34137:2;34151:47;;;21163:2;34122:18;;;42310:19;21199:26;42350:14;;;21179:47;21245:12;;;34108:245::o;34360:322::-;21559:23;;-1:-1;;;;;43816:46;22061:37;;21741:4;21730:16;;;21724:23;-1:-1;;;;;44142:30;;;21799:14;;;22542:36;;;;21899:4;21888:16;;;21882:23;44142:30;21957:14;;;22542:36;;;;34537:2;34522:18;;34508:174::o;34689:436::-;-1:-1;;;;;43816:46;;;;22061:37;;-1:-1;;;;;44142:30;;;35030:2;35015:18;;22542:36;44142:30;35111:2;35096:18;;22542:36;34868:2;34853:18;;34839:286::o;35132:222::-;13344:37;;;35259:2;35244:18;;35230:124::o;35361:716::-;13344:37;;;-1:-1;;;;;43936:54;;;35797:2;35782:18;;11217:58;43936:54;;;;35880:2;35865:18;;11358:37;35971:2;35956:18;;15301:58;;;;36062:3;36047:19;;15301:58;35624:3;35609:19;;35595:482::o;38173:321::-;13344:37;;;43224:13;43217:21;38480:2;38465:18;;13116:34;38322:2;38307:18;;38293:201::o;38501:329::-;13344:37;;;38816:2;38801:18;;13344:37;38654:2;38639:18;;38625:205::o;39533:440::-;-1:-1;;;;;44142:30;;;;22542:36;;39876:2;39861:18;;13344:37;;;;-1:-1;;;;;43816:46;39959:2;39944:18;;22301:50;39714:2;39699:18;;39685:288::o;39980:506::-;;;40115:11;40102:25;40166:48;;40190:8;40174:14;40170:29;40166:48;40146:18;40142:73;40132:2;;-1:-1;;40219:12;40132:2;40246:33;;40300:18;;;-1:-1;;;;;;40327:30;;40324:2;;;-1:-1;;40360:12;40324:2;40205:4;40388:13;;-1:-1;40174:14;40420:38;;;40410:49;;40407:2;;;40472:1;;40462:12;40493:256;40555:2;40549:9;40581:17;;;-1:-1;;;;;40641:34;;40677:22;;;40638:62;40635:2;;;40713:1;;40703:12;40635:2;40555;40722:22;40533:216;;-1:-1;40533:216::o;46235:268::-;46300:1;46307:101;46321:6;46318:1;46315:13;46307:101;;;46388:11;;;46382:18;46369:11;;;46362:39;46343:2;46336:10;46307:101;;;46423:6;46420:1;46417:13;46414:2;;;-1:-1;;46300:1;46470:16;;46463:27;46284:219::o;46616:117::-;-1:-1;;;;;43936:54;;46675:35;;46665:2;;46724:1;;46714:12;46665:2;46659:74;:::o;46740:111::-;46821:5;43224:13;43217:21;46799:5;46796:32;46786:2;;46842:1;;46832:12" + }, + "gasEstimates": { + "creation": { + "codeDepositCost": "2475800", + "executionCost": "infinite", + "totalCost": "infinite" + }, + "external": { + "MASTER_CHEF()": "infinite", + "MASTER_PID()": "infinite", + "SUSHI()": "infinite", + "add(uint256,address,address)": "infinite", + "batch(bytes[],bool)": "infinite", + "claimOwnership()": "45067", + "deposit(uint256,uint256,address)": "infinite", + "emergencyWithdraw(uint256,address)": "infinite", + "harvest(uint256,address)": "infinite", + "harvestFromMasterChef()": "infinite", + "init(address)": "infinite", + "lpToken(uint256)": "2106", + "massUpdatePools(uint256[])": "infinite", + "migrate(uint256)": "infinite", + "migrator()": "1182", + "owner()": "1137", + "pendingOwner()": "1158", + "pendingSushi(uint256,address)": "infinite", + "permitToken(address,address,address,uint256,uint256,uint8,bytes32,bytes32)": "infinite", + "poolInfo(uint256)": "2211", + "poolLength()": "1097", + "rewarder(uint256)": "2149", + "set(uint256,uint256,address,bool)": "infinite", + "setMigrator(address)": "22073", + "sushiPerBlock()": "infinite", + "totalAllocPoint()": "1096", + "transferOwnership(address,bool,bool)": "infinite", + "updatePool(uint256)": "infinite", + "userInfo(uint256,address)": "2293", + "withdraw(uint256,uint256,address)": "infinite", + "withdrawAndHarvest(uint256,uint256,address)": "infinite" + } + }, + "methodIdentifiers": { + "MASTER_CHEF()": "edd8b170", + "MASTER_PID()": "61621aaa", + "SUSHI()": "ab560e10", + "add(uint256,address,address)": "ab7de098", + "batch(bytes[],bool)": "d2423b51", + "claimOwnership()": "4e71e0c8", + "deposit(uint256,uint256,address)": "8dbdbe6d", + "emergencyWithdraw(uint256,address)": "2f940c70", + "harvest(uint256,address)": "18fccc76", + "harvestFromMasterChef()": "4f70b15a", + "init(address)": "19ab453c", + "lpToken(uint256)": "78ed5d1f", + "massUpdatePools(uint256[])": "57a5b58c", + "migrate(uint256)": "454b0608", + "migrator()": "7cd07e47", + "owner()": "8da5cb5b", + "pendingOwner()": "e30c3978", + "pendingSushi(uint256,address)": "195426ec", + "permitToken(address,address,address,uint256,uint256,uint8,bytes32,bytes32)": "7c516e94", + "poolInfo(uint256)": "1526fe27", + "poolLength()": "081e3eda", + "rewarder(uint256)": "c346253d", + "set(uint256,uint256,address,bool)": "88bba42f", + "setMigrator(address)": "23cf3118", + "sushiPerBlock()": "b0bcf42a", + "totalAllocPoint()": "17caf6f1", + "transferOwnership(address,bool,bool)": "078dfbe7", + "updatePool(uint256)": "51eb05a6", + "userInfo(uint256,address)": "93f1a40b", + "withdraw(uint256,uint256,address)": "0ad58d2f", + "withdrawAndHarvest(uint256,uint256,address)": "d1abb907" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IMasterChef\",\"name\":\"_MASTER_CHEF\",\"type\":\"address\"},{\"internalType\":\"contract IERC20\",\"name\":\"_sushi\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_MASTER_PID\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"pid\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"Deposit\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"pid\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"EmergencyWithdraw\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"pid\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Harvest\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"LogInit\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"pid\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"allocPoint\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"contract IERC20\",\"name\":\"lpToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"contract IRewarder\",\"name\":\"rewarder\",\"type\":\"address\"}],\"name\":\"LogPoolAddition\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"pid\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"allocPoint\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"contract IRewarder\",\"name\":\"rewarder\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"overwrite\",\"type\":\"bool\"}],\"name\":\"LogSetPool\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"pid\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"lastRewardBlock\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"lpSupply\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"accSushiPerShare\",\"type\":\"uint256\"}],\"name\":\"LogUpdatePool\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"pid\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"Withdraw\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MASTER_CHEF\",\"outputs\":[{\"internalType\":\"contract IMasterChef\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MASTER_PID\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SUSHI\",\"outputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"allocPoint\",\"type\":\"uint256\"},{\"internalType\":\"contract IERC20\",\"name\":\"_lpToken\",\"type\":\"address\"},{\"internalType\":\"contract IRewarder\",\"name\":\"_rewarder\",\"type\":\"address\"}],\"name\":\"add\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes[]\",\"name\":\"calls\",\"type\":\"bytes[]\"},{\"internalType\":\"bool\",\"name\":\"revertOnFail\",\"type\":\"bool\"}],\"name\":\"batch\",\"outputs\":[{\"internalType\":\"bool[]\",\"name\":\"successes\",\"type\":\"bool[]\"},{\"internalType\":\"bytes[]\",\"name\":\"results\",\"type\":\"bytes[]\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"claimOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"pid\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"deposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"pid\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"emergencyWithdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"pid\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"harvest\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"harvestFromMasterChef\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"dummyToken\",\"type\":\"address\"}],\"name\":\"init\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"lpToken\",\"outputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"pids\",\"type\":\"uint256[]\"}],\"name\":\"massUpdatePools\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_pid\",\"type\":\"uint256\"}],\"name\":\"migrate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"migrator\",\"outputs\":[{\"internalType\":\"contract IMigratorChef\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pendingOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_pid\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_user\",\"type\":\"address\"}],\"name\":\"pendingSushi\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"pending\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permitToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"poolInfo\",\"outputs\":[{\"internalType\":\"uint128\",\"name\":\"accSushiPerShare\",\"type\":\"uint128\"},{\"internalType\":\"uint64\",\"name\":\"lastRewardBlock\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"allocPoint\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"poolLength\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"pools\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"rewarder\",\"outputs\":[{\"internalType\":\"contract IRewarder\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_pid\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_allocPoint\",\"type\":\"uint256\"},{\"internalType\":\"contract IRewarder\",\"name\":\"_rewarder\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"overwrite\",\"type\":\"bool\"}],\"name\":\"set\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IMigratorChef\",\"name\":\"_migrator\",\"type\":\"address\"}],\"name\":\"setMigrator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"sushiPerBlock\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalAllocPoint\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"direct\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"renounce\",\"type\":\"bool\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"pid\",\"type\":\"uint256\"}],\"name\":\"updatePool\",\"outputs\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"accSushiPerShare\",\"type\":\"uint128\"},{\"internalType\":\"uint64\",\"name\":\"lastRewardBlock\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"allocPoint\",\"type\":\"uint64\"}],\"internalType\":\"struct MasterChefV2.PoolInfo\",\"name\":\"pool\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"userInfo\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"int256\",\"name\":\"rewardDebt\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"pid\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"pid\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"withdrawAndHarvest\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"add(uint256,address,address)\":{\"params\":{\"_lpToken\":\"Address of the LP ERC-20 token.\",\"_rewarder\":\"Address of the rewarder delegate.\",\"allocPoint\":\"AP of the new pool.\"}},\"constructor\":{\"params\":{\"_MASTER_CHEF\":\"The SushiSwap MCV1 contract address.\",\"_MASTER_PID\":\"The pool ID of the dummy token on the base MCV1 contract.\",\"_sushi\":\"The SUSHI token contract address.\"}},\"deposit(uint256,uint256,address)\":{\"params\":{\"amount\":\"LP token amount to deposit.\",\"pid\":\"The index of the pool. See `poolInfo`.\",\"to\":\"The receiver of `amount` deposit benefit.\"}},\"emergencyWithdraw(uint256,address)\":{\"params\":{\"pid\":\"The index of the pool. See `poolInfo`.\",\"to\":\"Receiver of the LP tokens.\"}},\"harvest(uint256,address)\":{\"params\":{\"pid\":\"The index of the pool. See `poolInfo`.\",\"to\":\"Receiver of SUSHI rewards.\"}},\"init(address)\":{\"params\":{\"dummyToken\":\"The address of the ERC-20 token to deposit into MCV1.\"}},\"massUpdatePools(uint256[])\":{\"params\":{\"pids\":\"Pool IDs of all to be updated. Make sure to update all active pools.\"}},\"migrate(uint256)\":{\"params\":{\"_pid\":\"The index of the pool. See `poolInfo`.\"}},\"pendingSushi(uint256,address)\":{\"params\":{\"_pid\":\"The index of the pool. See `poolInfo`.\",\"_user\":\"Address of user.\"},\"returns\":{\"pending\":\"SUSHI reward for a given user.\"}},\"set(uint256,uint256,address,bool)\":{\"params\":{\"_allocPoint\":\"New AP of the pool.\",\"_pid\":\"The index of the pool. See `poolInfo`.\",\"_rewarder\":\"Address of the rewarder delegate.\",\"overwrite\":\"True if _rewarder should be `set`. Otherwise `_rewarder` is ignored.\"}},\"setMigrator(address)\":{\"params\":{\"_migrator\":\"The contract address to set.\"}},\"updatePool(uint256)\":{\"params\":{\"pid\":\"The index of the pool. See `poolInfo`.\"},\"returns\":{\"pool\":\"Returns the pool that was updated.\"}},\"withdraw(uint256,uint256,address)\":{\"params\":{\"amount\":\"LP token amount to withdraw.\",\"pid\":\"The index of the pool. See `poolInfo`.\",\"to\":\"Receiver of the LP tokens.\"}},\"withdrawAndHarvest(uint256,uint256,address)\":{\"params\":{\"amount\":\"LP token amount to withdraw.\",\"pid\":\"The index of the pool. See `poolInfo`.\",\"to\":\"Receiver of the LP tokens and SUSHI rewards.\"}}},\"stateVariables\":{\"totalAllocPoint\":{\"details\":\"Total allocation points. Must be the sum of all allocation points in all pools.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"MASTER_CHEF()\":{\"notice\":\"Address of MCV1 contract.\"},\"MASTER_PID()\":{\"notice\":\"The index of MCV2 master pool in MCV1.\"},\"SUSHI()\":{\"notice\":\"Address of SUSHI contract.\"},\"add(uint256,address,address)\":{\"notice\":\"Add a new LP to the pool. Can only be called by the owner. DO NOT add the same LP token more than once. Rewards will be messed up if you do.\"},\"deposit(uint256,uint256,address)\":{\"notice\":\"Deposit LP tokens to MCV2 for SUSHI allocation.\"},\"emergencyWithdraw(uint256,address)\":{\"notice\":\"Withdraw without caring about rewards. EMERGENCY ONLY.\"},\"harvest(uint256,address)\":{\"notice\":\"Harvest proceeds for transaction sender to `to`.\"},\"harvestFromMasterChef()\":{\"notice\":\"Harvests SUSHI from `MASTER_CHEF` MCV1 and pool `MASTER_PID` to this MCV2 contract.\"},\"init(address)\":{\"notice\":\"Deposits a dummy token to `MASTER_CHEF` MCV1. This is required because MCV1 holds the minting rights for SUSHI. Any balance of transaction sender in `dummyToken` is transferred. The allocation point for the pool on MCV1 is the total allocation point for all pools that receive double incentives.\"},\"lpToken(uint256)\":{\"notice\":\"Address of the LP token for each MCV2 pool.\"},\"massUpdatePools(uint256[])\":{\"notice\":\"Update reward variables for all pools. Be careful of gas spending!\"},\"migrate(uint256)\":{\"notice\":\"Migrate LP token to another LP contract through the `migrator` contract.\"},\"pendingSushi(uint256,address)\":{\"notice\":\"View function to see pending SUSHI on frontend.\"},\"poolInfo(uint256)\":{\"notice\":\"Info of each MCV2 pool.\"},\"poolLength()\":{\"notice\":\"Returns the number of MCV2 pools.\"},\"rewarder(uint256)\":{\"notice\":\"Address of each `IRewarder` contract in MCV2.\"},\"set(uint256,uint256,address,bool)\":{\"notice\":\"Update the given pool's SUSHI allocation point and `IRewarder` contract. Can only be called by the owner.\"},\"setMigrator(address)\":{\"notice\":\"Set the `migrator` contract. Can only be called by the owner.\"},\"sushiPerBlock()\":{\"notice\":\"Calculates and returns the `amount` of SUSHI per block.\"},\"updatePool(uint256)\":{\"notice\":\"Update reward variables of the given pool.\"},\"userInfo(uint256,address)\":{\"notice\":\"Info of each user that stakes LP tokens.\"},\"withdraw(uint256,uint256,address)\":{\"notice\":\"Withdraw LP tokens from MCV2.\"},\"withdrawAndHarvest(uint256,uint256,address)\":{\"notice\":\"Withdraw LP tokens from MCV2 and harvest proceeds for transaction sender to `to`.\"}},\"notice\":\"The (older) MasterChef contract gives out a constant number of SUSHI tokens per block. It is the only address with minting rights for SUSHI. The idea for this MasterChef V2 (MCV2) contract is therefore to be the owner of a dummy token that is deposited into the MasterChef V1 (MCV1) contract. The allocation point for this pool on MCV1 is the total allocation point for all pools that receive double incentives.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/MasterChefV2.sol\":\"MasterChefV2\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@boringcrypto/boring-solidity/contracts/BoringBatchable.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\r\\n// Audit on 5-Jan-2021 by Keno and BoringCrypto\\r\\n\\r\\n// P1 - P3: OK\\r\\npragma solidity 0.6.12;\\r\\npragma experimental ABIEncoderV2;\\r\\n// solhint-disable avoid-low-level-calls\\r\\n\\r\\nimport \\\"./libraries/BoringERC20.sol\\\";\\r\\n\\r\\n// T1 - T4: OK\\r\\ncontract BaseBoringBatchable {\\r\\n function _getRevertMsg(bytes memory _returnData) internal pure returns (string memory) {\\r\\n // If the _res length is less than 68, then the transaction failed silently (without a revert message)\\r\\n if (_returnData.length < 68) return \\\"Transaction reverted silently\\\";\\r\\n\\r\\n assembly {\\r\\n // Slice the sighash.\\r\\n _returnData := add(_returnData, 0x04)\\r\\n }\\r\\n return abi.decode(_returnData, (string)); // All that remains is the revert string\\r\\n } \\r\\n \\r\\n // F3 - F9: OK\\r\\n // F1: External is ok here because this is the batch function, adding it to a batch makes no sense\\r\\n // F2: Calls in the batch may be payable, delegatecall operates in the same context, so each call in the batch has access to msg.value\\r\\n // C1 - C21: OK\\r\\n // C3: The length of the loop is fully under user control, so can't be exploited\\r\\n // C7: Delegatecall is only used on the same contract, so it's safe\\r\\n function batch(bytes[] calldata calls, bool revertOnFail) external payable returns(bool[] memory successes, bytes[] memory results) {\\r\\n // Interactions\\r\\n successes = new bool[](calls.length);\\r\\n results = new bytes[](calls.length);\\r\\n for (uint256 i = 0; i < calls.length; i++) {\\r\\n (bool success, bytes memory result) = address(this).delegatecall(calls[i]);\\r\\n require(success || !revertOnFail, _getRevertMsg(result));\\r\\n successes[i] = success;\\r\\n results[i] = result;\\r\\n }\\r\\n }\\r\\n}\\r\\n\\r\\n// T1 - T4: OK\\r\\ncontract BoringBatchable is BaseBoringBatchable {\\r\\n // F1 - F9: OK\\r\\n // F6: Parameters can be used front-run the permit and the user's permit will fail (due to nonce or other revert)\\r\\n // if part of a batch this could be used to grief once as the second call would not need the permit\\r\\n // C1 - C21: OK\\r\\n function permitToken(IERC20 token, address from, address to, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public {\\r\\n // Interactions\\r\\n // X1 - X5\\r\\n token.permit(from, to, amount, deadline, v, r, s);\\r\\n }\\r\\n}\",\"keccak256\":\"0xe0b0316b015447ee28c6b7d96c4347b410a66e5d26e922ef3bcccc22f3b4d590\",\"license\":\"UNLICENSED\"},\"@boringcrypto/boring-solidity/contracts/BoringOwnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\n// Audit on 5-Jan-2021 by Keno and BoringCrypto\\r\\n\\r\\n// P1 - P3: OK\\r\\npragma solidity 0.6.12;\\r\\n\\r\\n// Source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol + Claimable.sol\\r\\n// Edited by BoringCrypto\\r\\n\\r\\n// T1 - T4: OK\\r\\ncontract BoringOwnableData {\\r\\n // V1 - V5: OK\\r\\n address public owner;\\r\\n // V1 - V5: OK\\r\\n address public pendingOwner;\\r\\n}\\r\\n\\r\\n// T1 - T4: OK\\r\\ncontract BoringOwnable is BoringOwnableData {\\r\\n // E1: OK\\r\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\r\\n\\r\\n constructor () public {\\r\\n owner = msg.sender;\\r\\n emit OwnershipTransferred(address(0), msg.sender);\\r\\n }\\r\\n\\r\\n // F1 - F9: OK\\r\\n // C1 - C21: OK\\r\\n function transferOwnership(address newOwner, bool direct, bool renounce) public onlyOwner {\\r\\n if (direct) {\\r\\n // Checks\\r\\n require(newOwner != address(0) || renounce, \\\"Ownable: zero address\\\");\\r\\n\\r\\n // Effects\\r\\n emit OwnershipTransferred(owner, newOwner);\\r\\n owner = newOwner;\\r\\n pendingOwner = address(0);\\r\\n } else {\\r\\n // Effects\\r\\n pendingOwner = newOwner;\\r\\n }\\r\\n }\\r\\n\\r\\n // F1 - F9: OK\\r\\n // C1 - C21: OK\\r\\n function claimOwnership() public {\\r\\n address _pendingOwner = pendingOwner;\\r\\n \\r\\n // Checks\\r\\n require(msg.sender == _pendingOwner, \\\"Ownable: caller != pending owner\\\");\\r\\n\\r\\n // Effects\\r\\n emit OwnershipTransferred(owner, _pendingOwner);\\r\\n owner = _pendingOwner;\\r\\n pendingOwner = address(0);\\r\\n }\\r\\n\\r\\n // M1 - M5: OK\\r\\n // C1 - C21: OK\\r\\n modifier onlyOwner() {\\r\\n require(msg.sender == owner, \\\"Ownable: caller is not the owner\\\");\\r\\n _;\\r\\n }\\r\\n}\",\"keccak256\":\"0xfafb586b248c1c697227f5745397562cfe5be2f04e19fb80fc79fc94e3afaba1\",\"license\":\"MIT\"},\"@boringcrypto/boring-solidity/contracts/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\npragma solidity 0.6.12;\\r\\n\\r\\ninterface IERC20 {\\r\\n function totalSupply() external view returns (uint256);\\r\\n function balanceOf(address account) external view returns (uint256);\\r\\n function allowance(address owner, address spender) external view returns (uint256);\\r\\n function approve(address spender, uint256 amount) external returns (bool);\\r\\n event Transfer(address indexed from, address indexed to, uint256 value);\\r\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\r\\n\\r\\n // EIP 2612\\r\\n function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;\\r\\n}\",\"keccak256\":\"0x8004f86e4536cca55b8eeb2621fe18e1ee57d779396ddef50bce5bf70fb59867\",\"license\":\"MIT\"},\"@boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\r\\npragma solidity 0.6.12;\\r\\n\\r\\nimport \\\"../interfaces/IERC20.sol\\\";\\r\\n\\r\\nlibrary BoringERC20 {\\r\\n function safeSymbol(IERC20 token) internal view returns(string memory) {\\r\\n (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(0x95d89b41));\\r\\n return success && data.length > 0 ? abi.decode(data, (string)) : \\\"???\\\";\\r\\n }\\r\\n\\r\\n function safeName(IERC20 token) internal view returns(string memory) {\\r\\n (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(0x06fdde03));\\r\\n return success && data.length > 0 ? abi.decode(data, (string)) : \\\"???\\\";\\r\\n }\\r\\n\\r\\n function safeDecimals(IERC20 token) internal view returns (uint8) {\\r\\n (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(0x313ce567));\\r\\n return success && data.length == 32 ? abi.decode(data, (uint8)) : 18;\\r\\n }\\r\\n\\r\\n function safeTransfer(IERC20 token, address to, uint256 amount) internal {\\r\\n (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(0xa9059cbb, to, amount));\\r\\n require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: Transfer failed\\\");\\r\\n }\\r\\n\\r\\n function safeTransferFrom(IERC20 token, address from, address to, uint256 amount) internal {\\r\\n (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(0x23b872dd, from, to, amount));\\r\\n require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: TransferFrom failed\\\");\\r\\n }\\r\\n}\",\"keccak256\":\"0x69f1ccf716991e5d6d64dc0e3bc3828fd1990bc18400d680b1aa1960675daaaa\",\"license\":\"UNLICENSED\"},\"@boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\npragma solidity 0.6.12;\\r\\n// a library for performing overflow-safe math, updated with awesomeness from of DappHub (https://github.com/dapphub/ds-math)\\r\\nlibrary BoringMath {\\r\\n function add(uint256 a, uint256 b) internal pure returns (uint256 c) {require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");}\\r\\n function sub(uint256 a, uint256 b) internal pure returns (uint256 c) {require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");}\\r\\n function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {require(b == 0 || (c = a * b)/b == a, \\\"BoringMath: Mul Overflow\\\");}\\r\\n function to128(uint256 a) internal pure returns (uint128 c) {\\r\\n require(a <= uint128(-1), \\\"BoringMath: uint128 Overflow\\\");\\r\\n c = uint128(a);\\r\\n }\\r\\n function to64(uint256 a) internal pure returns (uint64 c) {\\r\\n require(a <= uint64(-1), \\\"BoringMath: uint64 Overflow\\\");\\r\\n c = uint64(a);\\r\\n }\\r\\n function to32(uint256 a) internal pure returns (uint32 c) {\\r\\n require(a <= uint32(-1), \\\"BoringMath: uint32 Overflow\\\");\\r\\n c = uint32(a);\\r\\n }\\r\\n}\\r\\n\\r\\nlibrary BoringMath128 {\\r\\n function add(uint128 a, uint128 b) internal pure returns (uint128 c) {require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");}\\r\\n function sub(uint128 a, uint128 b) internal pure returns (uint128 c) {require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");}\\r\\n}\\r\\n\\r\\nlibrary BoringMath64 {\\r\\n function add(uint64 a, uint64 b) internal pure returns (uint64 c) {require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");}\\r\\n function sub(uint64 a, uint64 b) internal pure returns (uint64 c) {require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");}\\r\\n}\\r\\n\\r\\nlibrary BoringMath32 {\\r\\n function add(uint32 a, uint32 b) internal pure returns (uint32 c) {require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");}\\r\\n function sub(uint32 a, uint32 b) internal pure returns (uint32 c) {require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");}\\r\\n}\",\"keccak256\":\"0x2d0e99483c5618251d4b52e8551918253bf044c63e0d09a2f1f652671f9ff762\",\"license\":\"MIT\"},\"contracts/MasterChefV2.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\nimport \\\"@boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol\\\";\\nimport \\\"@boringcrypto/boring-solidity/contracts/BoringBatchable.sol\\\";\\nimport \\\"@boringcrypto/boring-solidity/contracts/BoringOwnable.sol\\\";\\nimport \\\"./libraries/SignedSafeMath.sol\\\";\\nimport \\\"./interfaces/IRewarder.sol\\\";\\nimport \\\"./interfaces/IMasterChef.sol\\\";\\n\\ninterface IMigratorChef {\\n // Take the current LP token address and return the new LP token address.\\n // Migrator should have full access to the caller's LP token.\\n function migrate(IERC20 token) external returns (IERC20);\\n}\\n\\n/// @notice The (older) MasterChef contract gives out a constant number of SUSHI tokens per block.\\n/// It is the only address with minting rights for SUSHI.\\n/// The idea for this MasterChef V2 (MCV2) contract is therefore to be the owner of a dummy token\\n/// that is deposited into the MasterChef V1 (MCV1) contract.\\n/// The allocation point for this pool on MCV1 is the total allocation point for all pools that receive double incentives.\\ncontract MasterChefV2 is BoringOwnable, BoringBatchable {\\n using BoringMath for uint256;\\n using BoringMath128 for uint128;\\n using BoringERC20 for IERC20;\\n using SignedSafeMath for int256;\\n\\n /// @notice Info of each MCV2 user.\\n /// `amount` LP token amount the user has provided.\\n /// `rewardDebt` The amount of SUSHI entitled to the user.\\n struct UserInfo {\\n uint256 amount;\\n int256 rewardDebt;\\n }\\n\\n /// @notice Info of each MCV2 pool.\\n /// `allocPoint` The amount of allocation points assigned to the pool.\\n /// Also known as the amount of SUSHI to distribute per block.\\n struct PoolInfo {\\n uint128 accSushiPerShare;\\n uint64 lastRewardBlock;\\n uint64 allocPoint;\\n }\\n\\n /// @notice Address of MCV1 contract.\\n IMasterChef public immutable MASTER_CHEF;\\n /// @notice Address of SUSHI contract.\\n IERC20 public immutable SUSHI;\\n /// @notice The index of MCV2 master pool in MCV1.\\n uint256 public immutable MASTER_PID;\\n // @notice The migrator contract. It has a lot of power. Can only be set through governance (owner).\\n IMigratorChef public migrator;\\n\\n /// @notice Info of each MCV2 pool.\\n PoolInfo[] public poolInfo;\\n /// @notice Address of the LP token for each MCV2 pool.\\n IERC20[] public lpToken;\\n /// @notice Address of each `IRewarder` contract in MCV2.\\n IRewarder[] public rewarder;\\n\\n /// @notice Info of each user that stakes LP tokens.\\n mapping (uint256 => mapping (address => UserInfo)) public userInfo;\\n /// @dev Total allocation points. Must be the sum of all allocation points in all pools.\\n uint256 public totalAllocPoint;\\n\\n uint256 private constant MASTERCHEF_SUSHI_PER_BLOCK = 1e20;\\n uint256 private constant ACC_SUSHI_PRECISION = 1e12;\\n\\n event Deposit(address indexed user, uint256 indexed pid, uint256 amount, address indexed to);\\n event Withdraw(address indexed user, uint256 indexed pid, uint256 amount, address indexed to);\\n event EmergencyWithdraw(address indexed user, uint256 indexed pid, uint256 amount, address indexed to);\\n event Harvest(address indexed user, uint256 indexed pid, uint256 amount);\\n event LogPoolAddition(uint256 indexed pid, uint256 allocPoint, IERC20 indexed lpToken, IRewarder indexed rewarder);\\n event LogSetPool(uint256 indexed pid, uint256 allocPoint, IRewarder indexed rewarder, bool overwrite);\\n event LogUpdatePool(uint256 indexed pid, uint64 lastRewardBlock, uint256 lpSupply, uint256 accSushiPerShare);\\n event LogInit();\\n\\n /// @param _MASTER_CHEF The SushiSwap MCV1 contract address.\\n /// @param _sushi The SUSHI token contract address.\\n /// @param _MASTER_PID The pool ID of the dummy token on the base MCV1 contract.\\n constructor(IMasterChef _MASTER_CHEF, IERC20 _sushi, uint256 _MASTER_PID) public {\\n MASTER_CHEF = _MASTER_CHEF;\\n SUSHI = _sushi;\\n MASTER_PID = _MASTER_PID;\\n }\\n\\n /// @notice Deposits a dummy token to `MASTER_CHEF` MCV1. This is required because MCV1 holds the minting rights for SUSHI.\\n /// Any balance of transaction sender in `dummyToken` is transferred.\\n /// The allocation point for the pool on MCV1 is the total allocation point for all pools that receive double incentives.\\n /// @param dummyToken The address of the ERC-20 token to deposit into MCV1.\\n function init(IERC20 dummyToken) external {\\n uint256 balance = dummyToken.balanceOf(msg.sender);\\n require(balance != 0, \\\"MasterChefV2: Balance must exceed 0\\\");\\n dummyToken.safeTransferFrom(msg.sender, address(this), balance);\\n dummyToken.approve(address(MASTER_CHEF), balance);\\n MASTER_CHEF.deposit(MASTER_PID, balance);\\n emit LogInit();\\n }\\n\\n /// @notice Returns the number of MCV2 pools.\\n function poolLength() public view returns (uint256 pools) {\\n pools = poolInfo.length;\\n }\\n\\n /// @notice Add a new LP to the pool. Can only be called by the owner.\\n /// DO NOT add the same LP token more than once. Rewards will be messed up if you do.\\n /// @param allocPoint AP of the new pool.\\n /// @param _lpToken Address of the LP ERC-20 token.\\n /// @param _rewarder Address of the rewarder delegate.\\n function add(uint256 allocPoint, IERC20 _lpToken, IRewarder _rewarder) public onlyOwner {\\n uint256 lastRewardBlock = block.number;\\n totalAllocPoint = totalAllocPoint.add(allocPoint);\\n lpToken.push(_lpToken);\\n rewarder.push(_rewarder);\\n\\n poolInfo.push(PoolInfo({\\n allocPoint: allocPoint.to64(),\\n lastRewardBlock: lastRewardBlock.to64(),\\n accSushiPerShare: 0\\n }));\\n emit LogPoolAddition(lpToken.length.sub(1), allocPoint, _lpToken, _rewarder);\\n }\\n\\n /// @notice Update the given pool's SUSHI allocation point and `IRewarder` contract. Can only be called by the owner.\\n /// @param _pid The index of the pool. See `poolInfo`.\\n /// @param _allocPoint New AP of the pool.\\n /// @param _rewarder Address of the rewarder delegate.\\n /// @param overwrite True if _rewarder should be `set`. Otherwise `_rewarder` is ignored.\\n function set(uint256 _pid, uint256 _allocPoint, IRewarder _rewarder, bool overwrite) public onlyOwner {\\n totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add(_allocPoint);\\n poolInfo[_pid].allocPoint = _allocPoint.to64();\\n if (overwrite) { rewarder[_pid] = _rewarder; }\\n emit LogSetPool(_pid, _allocPoint, overwrite ? _rewarder : rewarder[_pid], overwrite);\\n }\\n\\n /// @notice Set the `migrator` contract. Can only be called by the owner.\\n /// @param _migrator The contract address to set.\\n function setMigrator(IMigratorChef _migrator) public onlyOwner {\\n migrator = _migrator;\\n }\\n\\n /// @notice Migrate LP token to another LP contract through the `migrator` contract.\\n /// @param _pid The index of the pool. See `poolInfo`.\\n function migrate(uint256 _pid) public {\\n require(address(migrator) != address(0), \\\"MasterChefV2: no migrator set\\\");\\n IERC20 _lpToken = lpToken[_pid];\\n uint256 bal = _lpToken.balanceOf(address(this));\\n _lpToken.approve(address(migrator), bal);\\n IERC20 newLpToken = migrator.migrate(_lpToken);\\n require(bal == newLpToken.balanceOf(address(this)), \\\"MasterChefV2: migrated balance must match\\\");\\n lpToken[_pid] = newLpToken;\\n }\\n\\n /// @notice View function to see pending SUSHI on frontend.\\n /// @param _pid The index of the pool. See `poolInfo`.\\n /// @param _user Address of user.\\n /// @return pending SUSHI reward for a given user.\\n function pendingSushi(uint256 _pid, address _user) external view returns (uint256 pending) {\\n PoolInfo memory pool = poolInfo[_pid];\\n UserInfo storage user = userInfo[_pid][_user];\\n uint256 accSushiPerShare = pool.accSushiPerShare;\\n uint256 lpSupply = lpToken[_pid].balanceOf(address(this));\\n if (block.number > pool.lastRewardBlock && lpSupply != 0) {\\n uint256 blocks = block.number.sub(pool.lastRewardBlock);\\n uint256 sushiReward = blocks.mul(sushiPerBlock()).mul(pool.allocPoint) / totalAllocPoint;\\n accSushiPerShare = accSushiPerShare.add(sushiReward.mul(ACC_SUSHI_PRECISION) / lpSupply);\\n }\\n pending = int256(user.amount.mul(accSushiPerShare) / ACC_SUSHI_PRECISION).sub(user.rewardDebt).toUInt256();\\n }\\n\\n /// @notice Update reward variables for all pools. Be careful of gas spending!\\n /// @param pids Pool IDs of all to be updated. Make sure to update all active pools.\\n function massUpdatePools(uint256[] calldata pids) external {\\n uint256 len = pids.length;\\n for (uint256 i = 0; i < len; ++i) {\\n updatePool(pids[i]);\\n }\\n }\\n\\n /// @notice Calculates and returns the `amount` of SUSHI per block.\\n function sushiPerBlock() public view returns (uint256 amount) {\\n amount = uint256(MASTERCHEF_SUSHI_PER_BLOCK)\\n .mul(MASTER_CHEF.poolInfo(MASTER_PID).allocPoint) / MASTER_CHEF.totalAllocPoint();\\n }\\n\\n /// @notice Update reward variables of the given pool.\\n /// @param pid The index of the pool. See `poolInfo`.\\n /// @return pool Returns the pool that was updated.\\n function updatePool(uint256 pid) public returns (PoolInfo memory pool) {\\n pool = poolInfo[pid];\\n if (block.number > pool.lastRewardBlock) {\\n uint256 lpSupply = lpToken[pid].balanceOf(address(this));\\n if (lpSupply > 0) {\\n uint256 blocks = block.number.sub(pool.lastRewardBlock);\\n uint256 sushiReward = blocks.mul(sushiPerBlock()).mul(pool.allocPoint) / totalAllocPoint;\\n pool.accSushiPerShare = pool.accSushiPerShare.add((sushiReward.mul(ACC_SUSHI_PRECISION) / lpSupply).to128());\\n }\\n pool.lastRewardBlock = block.number.to64();\\n poolInfo[pid] = pool;\\n emit LogUpdatePool(pid, pool.lastRewardBlock, lpSupply, pool.accSushiPerShare);\\n }\\n }\\n\\n /// @notice Deposit LP tokens to MCV2 for SUSHI allocation.\\n /// @param pid The index of the pool. See `poolInfo`.\\n /// @param amount LP token amount to deposit.\\n /// @param to The receiver of `amount` deposit benefit.\\n function deposit(uint256 pid, uint256 amount, address to) public {\\n PoolInfo memory pool = updatePool(pid);\\n UserInfo storage user = userInfo[pid][to];\\n\\n // Effects\\n user.amount = user.amount.add(amount);\\n user.rewardDebt = user.rewardDebt.add(int256(amount.mul(pool.accSushiPerShare) / ACC_SUSHI_PRECISION));\\n\\n // Interactions\\n IRewarder _rewarder = rewarder[pid];\\n if (address(_rewarder) != address(0)) {\\n _rewarder.onSushiReward(pid, to, to, 0, user.amount);\\n }\\n\\n lpToken[pid].safeTransferFrom(msg.sender, address(this), amount);\\n\\n emit Deposit(msg.sender, pid, amount, to);\\n }\\n\\n /// @notice Withdraw LP tokens from MCV2.\\n /// @param pid The index of the pool. See `poolInfo`.\\n /// @param amount LP token amount to withdraw.\\n /// @param to Receiver of the LP tokens.\\n function withdraw(uint256 pid, uint256 amount, address to) public {\\n PoolInfo memory pool = updatePool(pid);\\n UserInfo storage user = userInfo[pid][msg.sender];\\n\\n // Effects\\n user.rewardDebt = user.rewardDebt.sub(int256(amount.mul(pool.accSushiPerShare) / ACC_SUSHI_PRECISION));\\n user.amount = user.amount.sub(amount);\\n\\n // Interactions\\n IRewarder _rewarder = rewarder[pid];\\n if (address(_rewarder) != address(0)) {\\n _rewarder.onSushiReward(pid, msg.sender, to, 0, user.amount);\\n }\\n \\n lpToken[pid].safeTransfer(to, amount);\\n\\n emit Withdraw(msg.sender, pid, amount, to);\\n }\\n\\n /// @notice Harvest proceeds for transaction sender to `to`.\\n /// @param pid The index of the pool. See `poolInfo`.\\n /// @param to Receiver of SUSHI rewards.\\n function harvest(uint256 pid, address to) public {\\n PoolInfo memory pool = updatePool(pid);\\n UserInfo storage user = userInfo[pid][msg.sender];\\n int256 accumulatedSushi = int256(user.amount.mul(pool.accSushiPerShare) / ACC_SUSHI_PRECISION);\\n uint256 _pendingSushi = accumulatedSushi.sub(user.rewardDebt).toUInt256();\\n\\n // Effects\\n user.rewardDebt = accumulatedSushi;\\n\\n // Interactions\\n if (_pendingSushi != 0) {\\n SUSHI.safeTransfer(to, _pendingSushi);\\n }\\n \\n IRewarder _rewarder = rewarder[pid];\\n if (address(_rewarder) != address(0)) {\\n _rewarder.onSushiReward( pid, msg.sender, to, _pendingSushi, user.amount);\\n }\\n\\n emit Harvest(msg.sender, pid, _pendingSushi);\\n }\\n \\n /// @notice Withdraw LP tokens from MCV2 and harvest proceeds for transaction sender to `to`.\\n /// @param pid The index of the pool. See `poolInfo`.\\n /// @param amount LP token amount to withdraw.\\n /// @param to Receiver of the LP tokens and SUSHI rewards.\\n function withdrawAndHarvest(uint256 pid, uint256 amount, address to) public {\\n PoolInfo memory pool = updatePool(pid);\\n UserInfo storage user = userInfo[pid][msg.sender];\\n int256 accumulatedSushi = int256(user.amount.mul(pool.accSushiPerShare) / ACC_SUSHI_PRECISION);\\n uint256 _pendingSushi = accumulatedSushi.sub(user.rewardDebt).toUInt256();\\n\\n // Effects\\n user.rewardDebt = accumulatedSushi.sub(int256(amount.mul(pool.accSushiPerShare) / ACC_SUSHI_PRECISION));\\n user.amount = user.amount.sub(amount);\\n \\n // Interactions\\n SUSHI.safeTransfer(to, _pendingSushi);\\n\\n IRewarder _rewarder = rewarder[pid];\\n if (address(_rewarder) != address(0)) {\\n _rewarder.onSushiReward(pid, msg.sender, to, _pendingSushi, user.amount);\\n }\\n\\n lpToken[pid].safeTransfer(to, amount);\\n\\n emit Withdraw(msg.sender, pid, amount, to);\\n emit Harvest(msg.sender, pid, _pendingSushi);\\n }\\n\\n /// @notice Harvests SUSHI from `MASTER_CHEF` MCV1 and pool `MASTER_PID` to this MCV2 contract.\\n function harvestFromMasterChef() public {\\n MASTER_CHEF.deposit(MASTER_PID, 0);\\n }\\n\\n /// @notice Withdraw without caring about rewards. EMERGENCY ONLY.\\n /// @param pid The index of the pool. See `poolInfo`.\\n /// @param to Receiver of the LP tokens.\\n function emergencyWithdraw(uint256 pid, address to) public {\\n UserInfo storage user = userInfo[pid][msg.sender];\\n uint256 amount = user.amount;\\n user.amount = 0;\\n user.rewardDebt = 0;\\n\\n IRewarder _rewarder = rewarder[pid];\\n if (address(_rewarder) != address(0)) {\\n _rewarder.onSushiReward(pid, msg.sender, to, 0, 0);\\n }\\n\\n // Note: transfer can fail or succeed if `amount` is zero.\\n lpToken[pid].safeTransfer(to, amount);\\n emit EmergencyWithdraw(msg.sender, pid, amount, to);\\n }\\n}\\n\",\"keccak256\":\"0x2048c5e7b174e2f8f931045df32b1d56f09f488cfac3c87632b9730e0aba9bc3\",\"license\":\"MIT\"},\"contracts/interfaces/IMasterChef.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\nimport \\\"@boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol\\\";\\n\\ninterface IMasterChef {\\n using BoringERC20 for IERC20;\\n struct UserInfo {\\n uint256 amount; // How many LP tokens the user has provided.\\n uint256 rewardDebt; // Reward debt. See explanation below.\\n }\\n\\n struct PoolInfo {\\n IERC20 lpToken; // Address of LP token contract.\\n uint256 allocPoint; // How many allocation points assigned to this pool. SUSHI to distribute per block.\\n uint256 lastRewardBlock; // Last block number that SUSHI distribution occurs.\\n uint256 accSushiPerShare; // Accumulated SUSHI per share, times 1e12. See below.\\n }\\n\\n function poolInfo(uint256 pid) external view returns (IMasterChef.PoolInfo memory);\\n function totalAllocPoint() external view returns (uint256);\\n function deposit(uint256 _pid, uint256 _amount) external;\\n}\\n\",\"keccak256\":\"0xbbb2138d7b8be86b5d0bed347ab7f6d2d3e66043393abc882ad37a75fdd860d3\",\"license\":\"MIT\"},\"contracts/interfaces/IRewarder.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.6.12;\\nimport \\\"@boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol\\\";\\ninterface IRewarder {\\n using BoringERC20 for IERC20;\\n function onSushiReward(uint256 pid, address user, address recipient, uint256 sushiAmount, uint256 newLpAmount) external;\\n function pendingTokens(uint256 pid, address user, uint256 sushiAmount) external returns (IERC20[] memory, uint256[] memory);\\n}\\n\",\"keccak256\":\"0xf9fa549b5fe5d156c908a3ca612b1acd219666dbadc195d9bea4dd34d3cec94a\",\"license\":\"MIT\"},\"contracts/libraries/SignedSafeMath.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.6.12;\\n\\nlibrary SignedSafeMath {\\n int256 constant private _INT256_MIN = -2**255;\\n\\n /**\\n * @dev Returns the multiplication of two signed integers, reverting on\\n * overflow.\\n *\\n * Counterpart to Solidity's `*` operator.\\n *\\n * Requirements:\\n *\\n * - Multiplication cannot overflow.\\n */\\n function mul(int256 a, int256 b) internal pure returns (int256) {\\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n // benefit is lost if 'b' is also tested.\\n // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n if (a == 0) {\\n return 0;\\n }\\n\\n require(!(a == -1 && b == _INT256_MIN), \\\"SignedSafeMath: multiplication overflow\\\");\\n\\n int256 c = a * b;\\n require(c / a == b, \\\"SignedSafeMath: multiplication overflow\\\");\\n\\n return c;\\n }\\n\\n /**\\n * @dev Returns the integer division of two signed integers. Reverts on\\n * division by zero. The result is rounded towards zero.\\n *\\n * Counterpart to Solidity's `/` operator. Note: this function uses a\\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n * uses an invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function div(int256 a, int256 b) internal pure returns (int256) {\\n require(b != 0, \\\"SignedSafeMath: division by zero\\\");\\n require(!(b == -1 && a == _INT256_MIN), \\\"SignedSafeMath: division overflow\\\");\\n\\n int256 c = a / b;\\n\\n return c;\\n }\\n\\n /**\\n * @dev Returns the subtraction of two signed integers, reverting on\\n * overflow.\\n *\\n * Counterpart to Solidity's `-` operator.\\n *\\n * Requirements:\\n *\\n * - Subtraction cannot overflow.\\n */\\n function sub(int256 a, int256 b) internal pure returns (int256) {\\n int256 c = a - b;\\n require((b >= 0 && c <= a) || (b < 0 && c > a), \\\"SignedSafeMath: subtraction overflow\\\");\\n\\n return c;\\n }\\n\\n /**\\n * @dev Returns the addition of two signed integers, reverting on\\n * overflow.\\n *\\n * Counterpart to Solidity's `+` operator.\\n *\\n * Requirements:\\n *\\n * - Addition cannot overflow.\\n */\\n function add(int256 a, int256 b) internal pure returns (int256) {\\n int256 c = a + b;\\n require((b >= 0 && c >= a) || (b < 0 && c < a), \\\"SignedSafeMath: addition overflow\\\");\\n\\n return c;\\n }\\n\\n function toUInt256(int256 a) internal pure returns (uint256) {\\n require(a >= 0, \\\"Integer < 0\\\");\\n return uint256(a);\\n }\\n}\",\"keccak256\":\"0x4991beb21b224dfcdc3d251e0a60fdc304d4f6b699b2c35d08f3974e5b84c86a\",\"license\":\"MIT\"}},\"version\":1}", + "storageLayout": { + "storage": [ + { + "astId": 149, + "contract": "contracts/MasterChefV2.sol:MasterChefV2", + "label": "owner", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { + "astId": 151, + "contract": "contracts/MasterChefV2.sol:MasterChefV2", + "label": "pendingOwner", + "offset": 0, + "slot": "1", + "type": "t_address" + }, + { + "astId": 898, + "contract": "contracts/MasterChefV2.sol:MasterChefV2", + "label": "migrator", + "offset": 0, + "slot": "2", + "type": "t_contract(IMigratorChef)858" + }, + { + "astId": 902, + "contract": "contracts/MasterChefV2.sol:MasterChefV2", + "label": "poolInfo", + "offset": 0, + "slot": "3", + "type": "t_array(t_struct(PoolInfo)887_storage)dyn_storage" + }, + { + "astId": 906, + "contract": "contracts/MasterChefV2.sol:MasterChefV2", + "label": "lpToken", + "offset": 0, + "slot": "4", + "type": "t_array(t_contract(IERC20)337)dyn_storage" + }, + { + "astId": 910, + "contract": "contracts/MasterChefV2.sol:MasterChefV2", + "label": "rewarder", + "offset": 0, + "slot": "5", + "type": "t_array(t_contract(IRewarder)2167)dyn_storage" + }, + { + "astId": 917, + "contract": "contracts/MasterChefV2.sol:MasterChefV2", + "label": "userInfo", + "offset": 0, + "slot": "6", + "type": "t_mapping(t_uint256,t_mapping(t_address,t_struct(UserInfo)880_storage))" + }, + { + "astId": 920, + "contract": "contracts/MasterChefV2.sol:MasterChefV2", + "label": "totalAllocPoint", + "offset": 0, + "slot": "7", + "type": "t_uint256" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_contract(IERC20)337)dyn_storage": { + "base": "t_contract(IERC20)337", + "encoding": "dynamic_array", + "label": "contract IERC20[]", + "numberOfBytes": "32" + }, + "t_array(t_contract(IRewarder)2167)dyn_storage": { + "base": "t_contract(IRewarder)2167", + "encoding": "dynamic_array", + "label": "contract IRewarder[]", + "numberOfBytes": "32" + }, + "t_array(t_struct(PoolInfo)887_storage)dyn_storage": { + "base": "t_struct(PoolInfo)887_storage", + "encoding": "dynamic_array", + "label": "struct MasterChefV2.PoolInfo[]", + "numberOfBytes": "32" + }, + "t_contract(IERC20)337": { + "encoding": "inplace", + "label": "contract IERC20", + "numberOfBytes": "20" + }, + "t_contract(IMigratorChef)858": { + "encoding": "inplace", + "label": "contract IMigratorChef", + "numberOfBytes": "20" + }, + "t_contract(IRewarder)2167": { + "encoding": "inplace", + "label": "contract IRewarder", + "numberOfBytes": "20" + }, + "t_int256": { + "encoding": "inplace", + "label": "int256", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(UserInfo)880_storage)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => struct MasterChefV2.UserInfo)", + "numberOfBytes": "32", + "value": "t_struct(UserInfo)880_storage" + }, + "t_mapping(t_uint256,t_mapping(t_address,t_struct(UserInfo)880_storage))": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => mapping(address => struct MasterChefV2.UserInfo))", + "numberOfBytes": "32", + "value": "t_mapping(t_address,t_struct(UserInfo)880_storage)" + }, + "t_struct(PoolInfo)887_storage": { + "encoding": "inplace", + "label": "struct MasterChefV2.PoolInfo", + "members": [ + { + "astId": 882, + "contract": "contracts/MasterChefV2.sol:MasterChefV2", + "label": "accSushiPerShare", + "offset": 0, + "slot": "0", + "type": "t_uint128" + }, + { + "astId": 884, + "contract": "contracts/MasterChefV2.sol:MasterChefV2", + "label": "lastRewardBlock", + "offset": 16, + "slot": "0", + "type": "t_uint64" + }, + { + "astId": 886, + "contract": "contracts/MasterChefV2.sol:MasterChefV2", + "label": "allocPoint", + "offset": 24, + "slot": "0", + "type": "t_uint64" + } + ], + "numberOfBytes": "32" + }, + "t_struct(UserInfo)880_storage": { + "encoding": "inplace", + "label": "struct MasterChefV2.UserInfo", + "members": [ + { + "astId": 877, + "contract": "contracts/MasterChefV2.sol:MasterChefV2", + "label": "amount", + "offset": 0, + "slot": "0", + "type": "t_uint256" + }, + { + "astId": 879, + "contract": "contracts/MasterChefV2.sol:MasterChefV2", + "label": "rewardDebt", + "offset": 0, + "slot": "1", + "type": "t_int256" + } + ], + "numberOfBytes": "64" + }, + "t_uint128": { + "encoding": "inplace", + "label": "uint128", + "numberOfBytes": "16" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint64": { + "encoding": "inplace", + "label": "uint64", + "numberOfBytes": "8" + } + } + }, + "userdoc": { + "kind": "user", + "methods": { + "MASTER_CHEF()": { + "notice": "Address of MCV1 contract." + }, + "MASTER_PID()": { + "notice": "The index of MCV2 master pool in MCV1." + }, + "SUSHI()": { + "notice": "Address of SUSHI contract." + }, + "add(uint256,address,address)": { + "notice": "Add a new LP to the pool. Can only be called by the owner. DO NOT add the same LP token more than once. Rewards will be messed up if you do." + }, + "deposit(uint256,uint256,address)": { + "notice": "Deposit LP tokens to MCV2 for SUSHI allocation." + }, + "emergencyWithdraw(uint256,address)": { + "notice": "Withdraw without caring about rewards. EMERGENCY ONLY." + }, + "harvest(uint256,address)": { + "notice": "Harvest proceeds for transaction sender to `to`." + }, + "harvestFromMasterChef()": { + "notice": "Harvests SUSHI from `MASTER_CHEF` MCV1 and pool `MASTER_PID` to this MCV2 contract." + }, + "init(address)": { + "notice": "Deposits a dummy token to `MASTER_CHEF` MCV1. This is required because MCV1 holds the minting rights for SUSHI. Any balance of transaction sender in `dummyToken` is transferred. The allocation point for the pool on MCV1 is the total allocation point for all pools that receive double incentives." + }, + "lpToken(uint256)": { + "notice": "Address of the LP token for each MCV2 pool." + }, + "massUpdatePools(uint256[])": { + "notice": "Update reward variables for all pools. Be careful of gas spending!" + }, + "migrate(uint256)": { + "notice": "Migrate LP token to another LP contract through the `migrator` contract." + }, + "pendingSushi(uint256,address)": { + "notice": "View function to see pending SUSHI on frontend." + }, + "poolInfo(uint256)": { + "notice": "Info of each MCV2 pool." + }, + "poolLength()": { + "notice": "Returns the number of MCV2 pools." + }, + "rewarder(uint256)": { + "notice": "Address of each `IRewarder` contract in MCV2." + }, + "set(uint256,uint256,address,bool)": { + "notice": "Update the given pool's SUSHI allocation point and `IRewarder` contract. Can only be called by the owner." + }, + "setMigrator(address)": { + "notice": "Set the `migrator` contract. Can only be called by the owner." + }, + "sushiPerBlock()": { + "notice": "Calculates and returns the `amount` of SUSHI per block." + }, + "updatePool(uint256)": { + "notice": "Update reward variables of the given pool." + }, + "userInfo(uint256,address)": { + "notice": "Info of each user that stakes LP tokens." + }, + "withdraw(uint256,uint256,address)": { + "notice": "Withdraw LP tokens from MCV2." + }, + "withdrawAndHarvest(uint256,uint256,address)": { + "notice": "Withdraw LP tokens from MCV2 and harvest proceeds for transaction sender to `to`." + } + }, + "notice": "The (older) MasterChef contract gives out a constant number of SUSHI tokens per block. It is the only address with minting rights for SUSHI. The idea for this MasterChef V2 (MCV2) contract is therefore to be the owner of a dummy token that is deposited into the MasterChef V1 (MCV1) contract. The allocation point for this pool on MCV1 is the total allocation point for all pools that receive double incentives.", + "version": 1 + } + } + }, + "contracts/interfaces/IMasterChef.sol": { + "IMasterChef": { + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "_pid", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "deposit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pid", + "type": "uint256" + } + ], + "name": "poolInfo", + "outputs": [ + { + "components": [ + { + "internalType": "contract IERC20", + "name": "lpToken", + "type": "address" + }, + { + "internalType": "uint256", + "name": "allocPoint", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lastRewardBlock", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "accSushiPerShare", + "type": "uint256" + } + ], + "internalType": "struct IMasterChef.PoolInfo", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalAllocPoint", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "devdoc": { + "kind": "dev", + "methods": {}, + "version": 1 + }, + "evm": { + "bytecode": { + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "gasEstimates": null, + "methodIdentifiers": { + "deposit(uint256,uint256)": "e2bbb158", + "poolInfo(uint256)": "1526fe27", + "totalAllocPoint()": "17caf6f1" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_pid\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"deposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"pid\",\"type\":\"uint256\"}],\"name\":\"poolInfo\",\"outputs\":[{\"components\":[{\"internalType\":\"contract IERC20\",\"name\":\"lpToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"allocPoint\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lastRewardBlock\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"accSushiPerShare\",\"type\":\"uint256\"}],\"internalType\":\"struct IMasterChef.PoolInfo\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalAllocPoint\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/interfaces/IMasterChef.sol\":\"IMasterChef\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@boringcrypto/boring-solidity/contracts/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\npragma solidity 0.6.12;\\r\\n\\r\\ninterface IERC20 {\\r\\n function totalSupply() external view returns (uint256);\\r\\n function balanceOf(address account) external view returns (uint256);\\r\\n function allowance(address owner, address spender) external view returns (uint256);\\r\\n function approve(address spender, uint256 amount) external returns (bool);\\r\\n event Transfer(address indexed from, address indexed to, uint256 value);\\r\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\r\\n\\r\\n // EIP 2612\\r\\n function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;\\r\\n}\",\"keccak256\":\"0x8004f86e4536cca55b8eeb2621fe18e1ee57d779396ddef50bce5bf70fb59867\",\"license\":\"MIT\"},\"@boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\r\\npragma solidity 0.6.12;\\r\\n\\r\\nimport \\\"../interfaces/IERC20.sol\\\";\\r\\n\\r\\nlibrary BoringERC20 {\\r\\n function safeSymbol(IERC20 token) internal view returns(string memory) {\\r\\n (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(0x95d89b41));\\r\\n return success && data.length > 0 ? abi.decode(data, (string)) : \\\"???\\\";\\r\\n }\\r\\n\\r\\n function safeName(IERC20 token) internal view returns(string memory) {\\r\\n (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(0x06fdde03));\\r\\n return success && data.length > 0 ? abi.decode(data, (string)) : \\\"???\\\";\\r\\n }\\r\\n\\r\\n function safeDecimals(IERC20 token) internal view returns (uint8) {\\r\\n (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(0x313ce567));\\r\\n return success && data.length == 32 ? abi.decode(data, (uint8)) : 18;\\r\\n }\\r\\n\\r\\n function safeTransfer(IERC20 token, address to, uint256 amount) internal {\\r\\n (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(0xa9059cbb, to, amount));\\r\\n require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: Transfer failed\\\");\\r\\n }\\r\\n\\r\\n function safeTransferFrom(IERC20 token, address from, address to, uint256 amount) internal {\\r\\n (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(0x23b872dd, from, to, amount));\\r\\n require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: TransferFrom failed\\\");\\r\\n }\\r\\n}\",\"keccak256\":\"0x69f1ccf716991e5d6d64dc0e3bc3828fd1990bc18400d680b1aa1960675daaaa\",\"license\":\"UNLICENSED\"},\"contracts/interfaces/IMasterChef.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\nimport \\\"@boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol\\\";\\n\\ninterface IMasterChef {\\n using BoringERC20 for IERC20;\\n struct UserInfo {\\n uint256 amount; // How many LP tokens the user has provided.\\n uint256 rewardDebt; // Reward debt. See explanation below.\\n }\\n\\n struct PoolInfo {\\n IERC20 lpToken; // Address of LP token contract.\\n uint256 allocPoint; // How many allocation points assigned to this pool. SUSHI to distribute per block.\\n uint256 lastRewardBlock; // Last block number that SUSHI distribution occurs.\\n uint256 accSushiPerShare; // Accumulated SUSHI per share, times 1e12. See below.\\n }\\n\\n function poolInfo(uint256 pid) external view returns (IMasterChef.PoolInfo memory);\\n function totalAllocPoint() external view returns (uint256);\\n function deposit(uint256 _pid, uint256 _amount) external;\\n}\\n\",\"keccak256\":\"0xbbb2138d7b8be86b5d0bed347ab7f6d2d3e66043393abc882ad37a75fdd860d3\",\"license\":\"MIT\"}},\"version\":1}", + "storageLayout": { + "storage": [], + "types": null + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + } + }, + "contracts/interfaces/IRewarder.sol": { + "IRewarder": { + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "pid", + "type": "uint256" + }, + { + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "sushiAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "newLpAmount", + "type": "uint256" + } + ], + "name": "onSushiReward", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pid", + "type": "uint256" + }, + { + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "internalType": "uint256", + "name": "sushiAmount", + "type": "uint256" + } + ], + "name": "pendingTokens", + "outputs": [ + { + "internalType": "contract IERC20[]", + "name": "", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "devdoc": { + "kind": "dev", + "methods": {}, + "version": 1 + }, + "evm": { + "bytecode": { + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "deployedBytecode": { + "immutableReferences": {}, + "linkReferences": {}, + "object": "", + "opcodes": "", + "sourceMap": "" + }, + "gasEstimates": null, + "methodIdentifiers": { + "onSushiReward(uint256,address,address,uint256,uint256)": "8bf63742", + "pendingTokens(uint256,address,uint256)": "d63b3c49" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"pid\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"sushiAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newLpAmount\",\"type\":\"uint256\"}],\"name\":\"onSushiReward\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"pid\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"sushiAmount\",\"type\":\"uint256\"}],\"name\":\"pendingTokens\",\"outputs\":[{\"internalType\":\"contract IERC20[]\",\"name\":\"\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/interfaces/IRewarder.sol\":\"IRewarder\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@boringcrypto/boring-solidity/contracts/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\npragma solidity 0.6.12;\\r\\n\\r\\ninterface IERC20 {\\r\\n function totalSupply() external view returns (uint256);\\r\\n function balanceOf(address account) external view returns (uint256);\\r\\n function allowance(address owner, address spender) external view returns (uint256);\\r\\n function approve(address spender, uint256 amount) external returns (bool);\\r\\n event Transfer(address indexed from, address indexed to, uint256 value);\\r\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\r\\n\\r\\n // EIP 2612\\r\\n function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;\\r\\n}\",\"keccak256\":\"0x8004f86e4536cca55b8eeb2621fe18e1ee57d779396ddef50bce5bf70fb59867\",\"license\":\"MIT\"},\"@boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\r\\npragma solidity 0.6.12;\\r\\n\\r\\nimport \\\"../interfaces/IERC20.sol\\\";\\r\\n\\r\\nlibrary BoringERC20 {\\r\\n function safeSymbol(IERC20 token) internal view returns(string memory) {\\r\\n (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(0x95d89b41));\\r\\n return success && data.length > 0 ? abi.decode(data, (string)) : \\\"???\\\";\\r\\n }\\r\\n\\r\\n function safeName(IERC20 token) internal view returns(string memory) {\\r\\n (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(0x06fdde03));\\r\\n return success && data.length > 0 ? abi.decode(data, (string)) : \\\"???\\\";\\r\\n }\\r\\n\\r\\n function safeDecimals(IERC20 token) internal view returns (uint8) {\\r\\n (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(0x313ce567));\\r\\n return success && data.length == 32 ? abi.decode(data, (uint8)) : 18;\\r\\n }\\r\\n\\r\\n function safeTransfer(IERC20 token, address to, uint256 amount) internal {\\r\\n (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(0xa9059cbb, to, amount));\\r\\n require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: Transfer failed\\\");\\r\\n }\\r\\n\\r\\n function safeTransferFrom(IERC20 token, address from, address to, uint256 amount) internal {\\r\\n (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(0x23b872dd, from, to, amount));\\r\\n require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: TransferFrom failed\\\");\\r\\n }\\r\\n}\",\"keccak256\":\"0x69f1ccf716991e5d6d64dc0e3bc3828fd1990bc18400d680b1aa1960675daaaa\",\"license\":\"UNLICENSED\"},\"contracts/interfaces/IRewarder.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.6.12;\\nimport \\\"@boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol\\\";\\ninterface IRewarder {\\n using BoringERC20 for IERC20;\\n function onSushiReward(uint256 pid, address user, address recipient, uint256 sushiAmount, uint256 newLpAmount) external;\\n function pendingTokens(uint256 pid, address user, uint256 sushiAmount) external returns (IERC20[] memory, uint256[] memory);\\n}\\n\",\"keccak256\":\"0xf9fa549b5fe5d156c908a3ca612b1acd219666dbadc195d9bea4dd34d3cec94a\",\"license\":\"MIT\"}},\"version\":1}", + "storageLayout": { + "storage": [], + "types": null + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + } + }, + "contracts/libraries/SignedSafeMath.sol": { + "SignedSafeMath": { + "abi": [], + "devdoc": { + "kind": "dev", + "methods": {}, + "version": 1 + }, + "evm": { + "bytecode": { + "linkReferences": {}, + "object": "60566023600b82828239805160001a607314601657fe5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212208f1943d7a24d29ff6e71807b2650b06004a17b500d0dd71e9ef3c5aa567a16d464736f6c634300060c0033", + "opcodes": "PUSH1 0x56 PUSH1 0x23 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x16 JUMPI INVALID JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DUP16 NOT NUMBER 0xD7 LOG2 0x4D 0x29 SELFDESTRUCT PUSH15 0x71807B2650B06004A17B500D0DD71E SWAP15 RETURN 0xC5 0xAA JUMP PUSH27 0x16D464736F6C634300060C00330000000000000000000000000000 ", + "sourceMap": "58:2636:8:-:0;;;;;;;;;;;;;;;;;;;;;;;;;" + }, + "deployedBytecode": { + "immutableReferences": {}, + "linkReferences": {}, + "object": "73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212208f1943d7a24d29ff6e71807b2650b06004a17b500d0dd71e9ef3c5aa567a16d464736f6c634300060c0033", + "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DUP16 NOT NUMBER 0xD7 LOG2 0x4D 0x29 SELFDESTRUCT PUSH15 0x71807B2650B06004A17B500D0DD71E SWAP15 RETURN 0xC5 0xAA JUMP PUSH27 0x16D464736F6C634300060C00330000000000000000000000000000 ", + "sourceMap": "58:2636:8:-:0;;;;;;;;" + }, + "gasEstimates": { + "creation": { + "codeDepositCost": "17200", + "executionCost": "97", + "totalCost": "17297" + }, + "internal": { + "add(int256,int256)": "infinite", + "div(int256,int256)": "infinite", + "mul(int256,int256)": "infinite", + "sub(int256,int256)": "infinite", + "toUInt256(int256)": "infinite" + } + }, + "methodIdentifiers": {} + }, + "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/libraries/SignedSafeMath.sol\":\"SignedSafeMath\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/libraries/SignedSafeMath.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.6.12;\\n\\nlibrary SignedSafeMath {\\n int256 constant private _INT256_MIN = -2**255;\\n\\n /**\\n * @dev Returns the multiplication of two signed integers, reverting on\\n * overflow.\\n *\\n * Counterpart to Solidity's `*` operator.\\n *\\n * Requirements:\\n *\\n * - Multiplication cannot overflow.\\n */\\n function mul(int256 a, int256 b) internal pure returns (int256) {\\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n // benefit is lost if 'b' is also tested.\\n // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n if (a == 0) {\\n return 0;\\n }\\n\\n require(!(a == -1 && b == _INT256_MIN), \\\"SignedSafeMath: multiplication overflow\\\");\\n\\n int256 c = a * b;\\n require(c / a == b, \\\"SignedSafeMath: multiplication overflow\\\");\\n\\n return c;\\n }\\n\\n /**\\n * @dev Returns the integer division of two signed integers. Reverts on\\n * division by zero. The result is rounded towards zero.\\n *\\n * Counterpart to Solidity's `/` operator. Note: this function uses a\\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n * uses an invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function div(int256 a, int256 b) internal pure returns (int256) {\\n require(b != 0, \\\"SignedSafeMath: division by zero\\\");\\n require(!(b == -1 && a == _INT256_MIN), \\\"SignedSafeMath: division overflow\\\");\\n\\n int256 c = a / b;\\n\\n return c;\\n }\\n\\n /**\\n * @dev Returns the subtraction of two signed integers, reverting on\\n * overflow.\\n *\\n * Counterpart to Solidity's `-` operator.\\n *\\n * Requirements:\\n *\\n * - Subtraction cannot overflow.\\n */\\n function sub(int256 a, int256 b) internal pure returns (int256) {\\n int256 c = a - b;\\n require((b >= 0 && c <= a) || (b < 0 && c > a), \\\"SignedSafeMath: subtraction overflow\\\");\\n\\n return c;\\n }\\n\\n /**\\n * @dev Returns the addition of two signed integers, reverting on\\n * overflow.\\n *\\n * Counterpart to Solidity's `+` operator.\\n *\\n * Requirements:\\n *\\n * - Addition cannot overflow.\\n */\\n function add(int256 a, int256 b) internal pure returns (int256) {\\n int256 c = a + b;\\n require((b >= 0 && c >= a) || (b < 0 && c < a), \\\"SignedSafeMath: addition overflow\\\");\\n\\n return c;\\n }\\n\\n function toUInt256(int256 a) internal pure returns (uint256) {\\n require(a >= 0, \\\"Integer < 0\\\");\\n return uint256(a);\\n }\\n}\",\"keccak256\":\"0x4991beb21b224dfcdc3d251e0a60fdc304d4f6b699b2c35d08f3974e5b84c86a\",\"license\":\"MIT\"}},\"version\":1}", + "storageLayout": { + "storage": [], + "types": null + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + } + } + }, + "contracts/mocks/ComplexRewarder.sol": { + "ComplexRewarder": { + "abi": [ + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "_rewardToken", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_tokenPerBlock", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_MASTERCHEF_V2", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [], + "name": "LogInit", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "pid", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + } + ], + "name": "LogOnReward", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "pid", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "allocPoint", + "type": "uint256" + } + ], + "name": "LogPoolAddition", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "pid", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "allocPoint", + "type": "uint256" + } + ], + "name": "LogSetPool", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "pid", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "lastRewardBlock", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "lpSupply", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "accSushiPerShare", + "type": "uint256" + } + ], + "name": "LogUpdatePool", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "allocPoint", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_pid", + "type": "uint256" + } + ], + "name": "add", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "claimOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "pids", + "type": "uint256[]" + } + ], + "name": "massUpdatePools", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pid", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_user", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lpToken", + "type": "uint256" + } + ], + "name": "onSushiReward", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pendingOwner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_pid", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_user", + "type": "address" + } + ], + "name": "pendingToken", + "outputs": [ + { + "internalType": "uint256", + "name": "pending", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pid", + "type": "uint256" + }, + { + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "pendingTokens", + "outputs": [ + { + "internalType": "contract IERC20[]", + "name": "rewardTokens", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "rewardAmounts", + "type": "uint256[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "poolIds", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "poolInfo", + "outputs": [ + { + "internalType": "uint128", + "name": "accSushiPerShare", + "type": "uint128" + }, + { + "internalType": "uint64", + "name": "lastRewardBlock", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "allocPoint", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "poolLength", + "outputs": [ + { + "internalType": "uint256", + "name": "pools", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_pid", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_allocPoint", + "type": "uint256" + } + ], + "name": "set", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "tokenPerBlock", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + }, + { + "internalType": "bool", + "name": "direct", + "type": "bool" + }, + { + "internalType": "bool", + "name": "renounce", + "type": "bool" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pid", + "type": "uint256" + } + ], + "name": "updatePool", + "outputs": [ + { + "components": [ + { + "internalType": "uint128", + "name": "accSushiPerShare", + "type": "uint128" + }, + { + "internalType": "uint64", + "name": "lastRewardBlock", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "allocPoint", + "type": "uint64" + } + ], + "internalType": "struct ComplexRewarder.PoolInfo", + "name": "pool", + "type": "tuple" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "userInfo", + "outputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rewardDebt", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "devdoc": { + "author": "@0xKeno", + "kind": "dev", + "methods": { + "add(uint256,uint256)": { + "params": { + "_pid": "Pid on MCV2", + "allocPoint": "AP of the new pool." + } + }, + "massUpdatePools(uint256[])": { + "params": { + "pids": "Pool IDs of all to be updated. Make sure to update all active pools." + } + }, + "pendingToken(uint256,address)": { + "params": { + "_pid": "The index of the pool. See `poolInfo`.", + "_user": "Address of user." + }, + "returns": { + "pending": "SUSHI reward for a given user." + } + }, + "set(uint256,uint256)": { + "params": { + "_allocPoint": "New AP of the pool.", + "_pid": "The index of the pool. See `poolInfo`." + } + }, + "updatePool(uint256)": { + "params": { + "pid": "The index of the pool. See `poolInfo`." + }, + "returns": { + "pool": "Returns the pool that was updated." + } + } + }, + "stateVariables": { + "totalAllocPoint": { + "details": "Total allocation points. Must be the sum of all allocation points in all pools." + } + }, + "version": 1 + }, + "evm": { + "bytecode": { + "linkReferences": {}, + "object": "60c060405234801561001057600080fd5b50604051620018673803806200186783398101604081905261003191610095565b600080546001600160a01b0319163390811782556040519091907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a36001600160601b0319606093841b811660805260069290925590911b1660a0526100ef565b6000806000606084860312156100a9578283fd5b83516100b4816100d7565b6020850151604086015191945092506100cc816100d7565b809150509250925092565b6001600160a01b03811681146100ec57600080fd5b50565b60805160601c60a05160601c61173562000132600039806104fb5280610590528061080052806108955280610c7a525080610d2b5280610e3352506117356000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c806357a5b58c116100975780638da5cb5b116100665780638da5cb5b146101fc57806393f1a40b14610211578063d63b3c4914610232578063e30c39781461025357610100565b806357a5b58c146101b057806369883b4e146101c3578063771602f7146101d65780638bf63742146101e957610100565b80634198709a116100d35780634198709a1461016d57806348e43af4146101755780634e71e0c81461018857806351eb05a61461019057610100565b8063078dfbe714610105578063081e3eda1461011a5780631526fe27146101385780631ab06ee51461015a575b600080fd5b6101186101133660046110ef565b61025b565b005b61012261034a565b60405161012f9190611698565b60405180910390f35b61014b6101463660046111e6565b610350565b60405161012f9392919061166e565b6101186101683660046112cd565b610387565b610122610466565b610122610183366004611216565b61046c565b6101186106fa565b6101a361019e3660046111e6565b610787565b60405161012f9190611635565b6101186101be366004611139565b610a85565b6101226101d13660046111e6565b610abb565b6101186101e43660046112cd565b610ad9565b6101186101f7366004611245565b610c6f565b610204610dd8565b60405161012f919061132f565b61022461021f366004611216565b610de7565b60405161012f9291906116a1565b610245610240366004611296565b610e0b565b60405161012f92919061135c565b610204610eca565b6000546001600160a01b0316331461028e5760405162461bcd60e51b81526004016102859061155d565b60405180910390fd5b8115610329576001600160a01b0383161515806102a85750805b6102c45760405162461bcd60e51b8152600401610285906114c0565b600080546040516001600160a01b03808716939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0385166001600160a01b031991821617909155600180549091169055610345565b600180546001600160a01b0319166001600160a01b0385161790555b505050565b60035490565b6002602052600090815260409020546001600160801b038116906001600160401b03600160801b8204811691600160c01b90041683565b6000546001600160a01b031633146103b15760405162461bcd60e51b81526004016102859061155d565b6000828152600260205260409020546005546103e89183916103e291600160c01b90046001600160401b0316610ed9565b90610f02565b6005556103f481610f25565b6000838152600260205260409081902080546001600160401b0393909316600160c01b026001600160c01b03909316929092179091555182907f942cc7e17a17c164bd977f32ab8c54265d5b9d481e4e352bf874f1e568874e7c9061045a908490611698565b60405180910390a25050565b60065481565b60006104766110cf565b506000838152600260209081526040808320815160608101835290546001600160801b0380821683526001600160401b03600160801b8304811684870152600160c01b9092049091168284015287855260048085528386206001600160a01b03808a1688529552838620835194516378ed5d1f60e01b815293969095949092169391927f0000000000000000000000000000000000000000000000000000000000000000909216916378ed5d1f91610530918b9101611698565b60206040518083038186803b15801561054857600080fd5b505afa15801561055c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061058091906111ca565b6001600160a01b03166370a082317f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b81526004016105cb919061132f565b60206040518083038186803b1580156105e357600080fd5b505afa1580156105f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061061b91906111fe565b905083602001516001600160401b03164311801561063857508015155b156106c457600061065f85602001516001600160401b031643610ed990919063ffffffff16565b9050600060055461069287604001516001600160401b031661068c60065486610f5290919063ffffffff16565b90610f52565b8161069957fe5b0490506106bf836106af8364e8d4a51000610f52565b816106b657fe5b86919004610f02565b935050505b600183015483546106ef919064e8d4a51000906106e19086610f52565b816106e857fe5b0490610ed9565b979650505050505050565b6001546001600160a01b03163381146107255760405162461bcd60e51b815260040161028590611592565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b039092166001600160a01b0319928316179055600180549091169055565b61078f6110cf565b50600081815260026020908152604091829020825160608101845290546001600160801b03811682526001600160401b03600160801b82048116938301849052600160c01b9091041692810192909252431115610a80576040516378ed5d1f60e01b81526000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906378ed5d1f90610835908690600401611698565b60206040518083038186803b15801561084d57600080fd5b505afa158015610861573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088591906111ca565b6001600160a01b03166370a082317f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b81526004016108d0919061132f565b60206040518083038186803b1580156108e857600080fd5b505afa1580156108fc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061092091906111fe565b905080156109c357600061094a83602001516001600160401b031643610ed990919063ffffffff16565b9050600060055461097785604001516001600160401b031661068c60065486610f5290919063ffffffff16565b8161097e57fe5b0490506109b56109a4846109978464e8d4a51000610f52565b8161099e57fe5b04610f89565b85516001600160801b031690610fb2565b6001600160801b0316845250505b6109cc43610f25565b6001600160401b03908116602084810191825260008681526002909152604090819020855181549351838801516001600160801b03199095166001600160801b0383161767ffffffffffffffff60801b1916600160801b82881602176001600160c01b0316600160c01b95909616949094029490941790555185927f0fc9545022a542541ad085d091fb09a2ab36fee366a4576ab63714ea907ad35392610a7692909186916116af565b60405180910390a2505b919050565b8060005b81811015610ab557610aac848483818110610aa057fe5b90506020020135610787565b50600101610a89565b50505050565b60038181548110610ac857fe5b600091825260209091200154905081565b6000546001600160a01b03163314610b035760405162461bcd60e51b81526004016102859061155d565b600081815260026020526040902054600160801b90046001600160401b031615610b3f5760405162461bcd60e51b81526004016102859061141b565b6005544390610b4e9084610f02565b60055560408051606081019091526000815260208101610b6d83610f25565b6001600160401b03168152602001610b8485610f25565b6001600160401b0390811690915260008481526002602090815260408083208551815493870151968301518616600160c01b026001600160c01b0397909616600160801b0267ffffffffffffffff60801b196001600160801b039092166001600160801b031990951694909417169290921794909416929092179091556003805460018101825591527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b018390555182907f38410508059921573ab9ebdca2a5034be738d236366b8f32de4434ea95ed3c8190610c62908690611698565b60405180910390a2505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610cb75760405162461bcd60e51b81526004016102859061147f565b610cbf6110cf565b610cc886610787565b60008781526004602090815260408083206001600160a01b038a168452909152812080549293509115610d5257600182015483518354610d1c929164e8d4a51000916106e1916001600160801b0316610f52565b9050610d526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168783610fe1565b838255825164e8d4a5100090610d729086906001600160801b0316610f52565b81610d7957fe5b048260010181905550856001600160a01b031688886001600160a01b03167f2ece88ca2bc08dd018db50e1d25a20bf1241e5fab1c396caa51f01a54bd2f75b84604051610dc69190611698565b60405180910390a45050505050505050565b6000546001600160a01b031681565b60046020908152600092835260408084209091529082529020805460019091015482565b60408051600180825281830190925260609182918291602080830190803683370190505090507f000000000000000000000000000000000000000000000000000000000000000081600081518110610e5f57fe5b6001600160a01b039290921660209283029190910190910152604080516001808252818301909252606091816020016020820280368337019050509050610ea6878761046c565b81600081518110610eb357fe5b602090810291909101015290969095509350505050565b6001546001600160a01b031681565b80820382811115610efc5760405162461bcd60e51b8152600401610285906113ec565b92915050565b81810181811015610efc5760405162461bcd60e51b815260040161028590611526565b60006001600160401b03821115610f4e5760405162461bcd60e51b8152600401610285906115c7565b5090565b6000811580610f6d57505080820282828281610f6a57fe5b04145b610efc5760405162461bcd60e51b8152600401610285906115fe565b60006001600160801b03821115610f4e5760405162461bcd60e51b8152600401610285906114ef565b8181016001600160801b038083169082161015610efc5760405162461bcd60e51b815260040161028590611526565b60006060846001600160a01b031663a9059cbb8585604051602401611007929190611343565b6040516020818303038152906040529060e01b6020820180516001600160e01b03838183161783525050505060405161104091906112f6565b6000604051808303816000865af19150503d806000811461107d576040519150601f19603f3d011682016040523d82523d6000602084013e611082565b606091505b50915091508180156110ac5750805115806110ac5750808060200190518101906110ac91906111a7565b6110c85760405162461bcd60e51b815260040161028590611448565b5050505050565b604080516060810182526000808252602082018190529181019190915290565b600080600060608486031215611103578283fd5b833561110e816116d9565b9250602084013561111e816116f1565b9150604084013561112e816116f1565b809150509250925092565b6000806020838503121561114b578182fd5b82356001600160401b0380821115611161578384fd5b818501915085601f830112611174578384fd5b813581811115611182578485fd5b8660208083028501011115611195578485fd5b60209290920196919550909350505050565b6000602082840312156111b8578081fd5b81516111c3816116f1565b9392505050565b6000602082840312156111db578081fd5b81516111c3816116d9565b6000602082840312156111f7578081fd5b5035919050565b60006020828403121561120f578081fd5b5051919050565b60008060408385031215611228578182fd5b82359150602083013561123a816116d9565b809150509250929050565b600080600080600060a0868803121561125c578081fd5b85359450602086013561126e816116d9565b9350604086013561127e816116d9565b94979396509394606081013594506080013592915050565b6000806000606084860312156112aa578283fd5b8335925060208401356112bc816116d9565b929592945050506040919091013590565b600080604083850312156112df578182fd5b50508035926020909101359150565b815260200190565b60008251815b8181101561131657602081860181015185830152016112fc565b818111156113245782828501525b509190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b604080825283519082018190526000906020906060840190828701845b8281101561139e5781516001600160a01b031684529284019290840190600101611379565b505050838103828501528085516113b58184611698565b91508387019250845b818110156113df576113d18385516112ee565b9385019392506001016113be565b5090979650505050505050565b602080825260159082015274426f72696e674d6174683a20556e646572666c6f7760581b604082015260600190565b602080825260139082015272506f6f6c20616c72656164792065786973747360681b604082015260600190565b6020808252601c908201527f426f72696e6745524332303a205472616e73666572206661696c656400000000604082015260600190565b60208082526021908201527f4f6e6c79204d4356322063616e2063616c6c20746869732066756e6374696f6e6040820152601760f91b606082015260800190565b6020808252601590820152744f776e61626c653a207a65726f206164647265737360581b604082015260600190565b6020808252601c908201527f426f72696e674d6174683a2075696e74313238204f766572666c6f7700000000604082015260600190565b60208082526018908201527f426f72696e674d6174683a20416464204f766572666c6f770000000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c657220213d2070656e64696e67206f776e6572604082015260600190565b6020808252601b908201527f426f72696e674d6174683a2075696e743634204f766572666c6f770000000000604082015260600190565b60208082526018908201527f426f72696e674d6174683a204d756c204f766572666c6f770000000000000000604082015260600190565b81516001600160801b031681526020808301516001600160401b0390811691830191909152604092830151169181019190915260600190565b6001600160801b039390931683526001600160401b03918216602084015216604082015260600190565b90815260200190565b918252602082015260400190565b6001600160401b0393909316835260208301919091526001600160801b0316604082015260600190565b6001600160a01b03811681146116ee57600080fd5b50565b80151581146116ee57600080fdfea26469706673582212205b02e67e50616308de8a2a0ea092220cbb6bab154c4c12313ce97766220ac5f864736f6c634300060c0033", + "opcodes": "PUSH1 0xC0 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x1867 CODESIZE SUB DUP1 PUSH3 0x1867 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH2 0x31 SWAP2 PUSH2 0x95 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND CALLER SWAP1 DUP2 OR DUP3 SSTORE PUSH1 0x40 MLOAD SWAP1 SWAP2 SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP3 SWAP1 LOG3 PUSH1 0x1 PUSH1 0x1 PUSH1 0x60 SHL SUB NOT PUSH1 0x60 SWAP4 DUP5 SHL DUP2 AND PUSH1 0x80 MSTORE PUSH1 0x6 SWAP3 SWAP1 SWAP3 SSTORE SWAP1 SWAP2 SHL AND PUSH1 0xA0 MSTORE PUSH2 0xEF JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0xA9 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 MLOAD PUSH2 0xB4 DUP2 PUSH2 0xD7 JUMP JUMPDEST PUSH1 0x20 DUP6 ADD MLOAD PUSH1 0x40 DUP7 ADD MLOAD SWAP2 SWAP5 POP SWAP3 POP PUSH2 0xCC DUP2 PUSH2 0xD7 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0xEC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x80 MLOAD PUSH1 0x60 SHR PUSH1 0xA0 MLOAD PUSH1 0x60 SHR PUSH2 0x1735 PUSH3 0x132 PUSH1 0x0 CODECOPY DUP1 PUSH2 0x4FB MSTORE DUP1 PUSH2 0x590 MSTORE DUP1 PUSH2 0x800 MSTORE DUP1 PUSH2 0x895 MSTORE DUP1 PUSH2 0xC7A MSTORE POP DUP1 PUSH2 0xD2B MSTORE DUP1 PUSH2 0xE33 MSTORE POP PUSH2 0x1735 PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x100 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x57A5B58C GT PUSH2 0x97 JUMPI DUP1 PUSH4 0x8DA5CB5B GT PUSH2 0x66 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x1FC JUMPI DUP1 PUSH4 0x93F1A40B EQ PUSH2 0x211 JUMPI DUP1 PUSH4 0xD63B3C49 EQ PUSH2 0x232 JUMPI DUP1 PUSH4 0xE30C3978 EQ PUSH2 0x253 JUMPI PUSH2 0x100 JUMP JUMPDEST DUP1 PUSH4 0x57A5B58C EQ PUSH2 0x1B0 JUMPI DUP1 PUSH4 0x69883B4E EQ PUSH2 0x1C3 JUMPI DUP1 PUSH4 0x771602F7 EQ PUSH2 0x1D6 JUMPI DUP1 PUSH4 0x8BF63742 EQ PUSH2 0x1E9 JUMPI PUSH2 0x100 JUMP JUMPDEST DUP1 PUSH4 0x4198709A GT PUSH2 0xD3 JUMPI DUP1 PUSH4 0x4198709A EQ PUSH2 0x16D JUMPI DUP1 PUSH4 0x48E43AF4 EQ PUSH2 0x175 JUMPI DUP1 PUSH4 0x4E71E0C8 EQ PUSH2 0x188 JUMPI DUP1 PUSH4 0x51EB05A6 EQ PUSH2 0x190 JUMPI PUSH2 0x100 JUMP JUMPDEST DUP1 PUSH4 0x78DFBE7 EQ PUSH2 0x105 JUMPI DUP1 PUSH4 0x81E3EDA EQ PUSH2 0x11A JUMPI DUP1 PUSH4 0x1526FE27 EQ PUSH2 0x138 JUMPI DUP1 PUSH4 0x1AB06EE5 EQ PUSH2 0x15A JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x118 PUSH2 0x113 CALLDATASIZE PUSH1 0x4 PUSH2 0x10EF JUMP JUMPDEST PUSH2 0x25B JUMP JUMPDEST STOP JUMPDEST PUSH2 0x122 PUSH2 0x34A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x12F SWAP2 SWAP1 PUSH2 0x1698 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x14B PUSH2 0x146 CALLDATASIZE PUSH1 0x4 PUSH2 0x11E6 JUMP JUMPDEST PUSH2 0x350 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x12F SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x166E JUMP JUMPDEST PUSH2 0x118 PUSH2 0x168 CALLDATASIZE PUSH1 0x4 PUSH2 0x12CD JUMP JUMPDEST PUSH2 0x387 JUMP JUMPDEST PUSH2 0x122 PUSH2 0x466 JUMP JUMPDEST PUSH2 0x122 PUSH2 0x183 CALLDATASIZE PUSH1 0x4 PUSH2 0x1216 JUMP JUMPDEST PUSH2 0x46C JUMP JUMPDEST PUSH2 0x118 PUSH2 0x6FA JUMP JUMPDEST PUSH2 0x1A3 PUSH2 0x19E CALLDATASIZE PUSH1 0x4 PUSH2 0x11E6 JUMP JUMPDEST PUSH2 0x787 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x12F SWAP2 SWAP1 PUSH2 0x1635 JUMP JUMPDEST PUSH2 0x118 PUSH2 0x1BE CALLDATASIZE PUSH1 0x4 PUSH2 0x1139 JUMP JUMPDEST PUSH2 0xA85 JUMP JUMPDEST PUSH2 0x122 PUSH2 0x1D1 CALLDATASIZE PUSH1 0x4 PUSH2 0x11E6 JUMP JUMPDEST PUSH2 0xABB JUMP JUMPDEST PUSH2 0x118 PUSH2 0x1E4 CALLDATASIZE PUSH1 0x4 PUSH2 0x12CD JUMP JUMPDEST PUSH2 0xAD9 JUMP JUMPDEST PUSH2 0x118 PUSH2 0x1F7 CALLDATASIZE PUSH1 0x4 PUSH2 0x1245 JUMP JUMPDEST PUSH2 0xC6F JUMP JUMPDEST PUSH2 0x204 PUSH2 0xDD8 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x12F SWAP2 SWAP1 PUSH2 0x132F JUMP JUMPDEST PUSH2 0x224 PUSH2 0x21F CALLDATASIZE PUSH1 0x4 PUSH2 0x1216 JUMP JUMPDEST PUSH2 0xDE7 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x12F SWAP3 SWAP2 SWAP1 PUSH2 0x16A1 JUMP JUMPDEST PUSH2 0x245 PUSH2 0x240 CALLDATASIZE PUSH1 0x4 PUSH2 0x1296 JUMP JUMPDEST PUSH2 0xE0B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x12F SWAP3 SWAP2 SWAP1 PUSH2 0x135C JUMP JUMPDEST PUSH2 0x204 PUSH2 0xECA JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0x28E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x285 SWAP1 PUSH2 0x155D JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP2 ISZERO PUSH2 0x329 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND ISZERO ISZERO DUP1 PUSH2 0x2A8 JUMPI POP DUP1 JUMPDEST PUSH2 0x2C4 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x285 SWAP1 PUSH2 0x14C0 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP8 AND SWAP4 SWAP3 AND SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 LOG3 PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP2 DUP3 AND OR SWAP1 SWAP2 SSTORE PUSH1 0x1 DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SSTORE PUSH2 0x345 JUMP JUMPDEST PUSH1 0x1 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND OR SWAP1 SSTORE JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x3 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP2 AND SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB PUSH1 0x1 PUSH1 0x80 SHL DUP3 DIV DUP2 AND SWAP2 PUSH1 0x1 PUSH1 0xC0 SHL SWAP1 DIV AND DUP4 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0x3B1 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x285 SWAP1 PUSH2 0x155D JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x5 SLOAD PUSH2 0x3E8 SWAP2 DUP4 SWAP2 PUSH2 0x3E2 SWAP2 PUSH1 0x1 PUSH1 0xC0 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND PUSH2 0xED9 JUMP JUMPDEST SWAP1 PUSH2 0xF02 JUMP JUMPDEST PUSH1 0x5 SSTORE PUSH2 0x3F4 DUP2 PUSH2 0xF25 JUMP JUMPDEST PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB SWAP4 SWAP1 SWAP4 AND PUSH1 0x1 PUSH1 0xC0 SHL MUL PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 SSTORE MLOAD DUP3 SWAP1 PUSH32 0x942CC7E17A17C164BD977F32AB8C54265D5B9D481E4E352BF874F1E568874E7C SWAP1 PUSH2 0x45A SWAP1 DUP5 SWAP1 PUSH2 0x1698 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP JUMP JUMPDEST PUSH1 0x6 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x476 PUSH2 0x10CF JUMP JUMPDEST POP PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP2 MLOAD PUSH1 0x60 DUP2 ADD DUP4 MSTORE SWAP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP3 AND DUP4 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB PUSH1 0x1 PUSH1 0x80 SHL DUP4 DIV DUP2 AND DUP5 DUP8 ADD MSTORE PUSH1 0x1 PUSH1 0xC0 SHL SWAP1 SWAP3 DIV SWAP1 SWAP2 AND DUP3 DUP5 ADD MSTORE DUP8 DUP6 MSTORE PUSH1 0x4 DUP1 DUP6 MSTORE DUP4 DUP7 KECCAK256 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP11 AND DUP9 MSTORE SWAP6 MSTORE DUP4 DUP7 KECCAK256 DUP4 MLOAD SWAP5 MLOAD PUSH4 0x78ED5D1F PUSH1 0xE0 SHL DUP2 MSTORE SWAP4 SWAP7 SWAP1 SWAP6 SWAP5 SWAP1 SWAP3 AND SWAP4 SWAP2 SWAP3 PUSH32 0x0 SWAP1 SWAP3 AND SWAP2 PUSH4 0x78ED5D1F SWAP2 PUSH2 0x530 SWAP2 DUP12 SWAP2 ADD PUSH2 0x1698 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x548 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x55C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x580 SWAP2 SWAP1 PUSH2 0x11CA JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 PUSH32 0x0 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x5CB SWAP2 SWAP1 PUSH2 0x132F JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x5E3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x5F7 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x61B SWAP2 SWAP1 PUSH2 0x11FE JUMP JUMPDEST SWAP1 POP DUP4 PUSH1 0x20 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND NUMBER GT DUP1 ISZERO PUSH2 0x638 JUMPI POP DUP1 ISZERO ISZERO JUMPDEST ISZERO PUSH2 0x6C4 JUMPI PUSH1 0x0 PUSH2 0x65F DUP6 PUSH1 0x20 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND NUMBER PUSH2 0xED9 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH1 0x5 SLOAD PUSH2 0x692 DUP8 PUSH1 0x40 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND PUSH2 0x68C PUSH1 0x6 SLOAD DUP7 PUSH2 0xF52 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 PUSH2 0xF52 JUMP JUMPDEST DUP2 PUSH2 0x699 JUMPI INVALID JUMPDEST DIV SWAP1 POP PUSH2 0x6BF DUP4 PUSH2 0x6AF DUP4 PUSH5 0xE8D4A51000 PUSH2 0xF52 JUMP JUMPDEST DUP2 PUSH2 0x6B6 JUMPI INVALID JUMPDEST DUP7 SWAP2 SWAP1 DIV PUSH2 0xF02 JUMP JUMPDEST SWAP4 POP POP POP JUMPDEST PUSH1 0x1 DUP4 ADD SLOAD DUP4 SLOAD PUSH2 0x6EF SWAP2 SWAP1 PUSH5 0xE8D4A51000 SWAP1 PUSH2 0x6E1 SWAP1 DUP7 PUSH2 0xF52 JUMP JUMPDEST DUP2 PUSH2 0x6E8 JUMPI INVALID JUMPDEST DIV SWAP1 PUSH2 0xED9 JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER DUP2 EQ PUSH2 0x725 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x285 SWAP1 PUSH2 0x1592 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND SWAP4 SWAP3 AND SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 LOG3 PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP3 DUP4 AND OR SWAP1 SSTORE PUSH1 0x1 DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x78F PUSH2 0x10CF JUMP JUMPDEST POP PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP3 MLOAD PUSH1 0x60 DUP2 ADD DUP5 MSTORE SWAP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP2 AND DUP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB PUSH1 0x1 PUSH1 0x80 SHL DUP3 DIV DUP2 AND SWAP4 DUP4 ADD DUP5 SWAP1 MSTORE PUSH1 0x1 PUSH1 0xC0 SHL SWAP1 SWAP2 DIV AND SWAP3 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE NUMBER GT ISZERO PUSH2 0xA80 JUMPI PUSH1 0x40 MLOAD PUSH4 0x78ED5D1F PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x0 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 AND SWAP1 PUSH4 0x78ED5D1F SWAP1 PUSH2 0x835 SWAP1 DUP7 SWAP1 PUSH1 0x4 ADD PUSH2 0x1698 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x84D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x861 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x885 SWAP2 SWAP1 PUSH2 0x11CA JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 PUSH32 0x0 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8D0 SWAP2 SWAP1 PUSH2 0x132F JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x8E8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x8FC JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x920 SWAP2 SWAP1 PUSH2 0x11FE JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x9C3 JUMPI PUSH1 0x0 PUSH2 0x94A DUP4 PUSH1 0x20 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND NUMBER PUSH2 0xED9 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH1 0x5 SLOAD PUSH2 0x977 DUP6 PUSH1 0x40 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND PUSH2 0x68C PUSH1 0x6 SLOAD DUP7 PUSH2 0xF52 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP2 PUSH2 0x97E JUMPI INVALID JUMPDEST DIV SWAP1 POP PUSH2 0x9B5 PUSH2 0x9A4 DUP5 PUSH2 0x997 DUP5 PUSH5 0xE8D4A51000 PUSH2 0xF52 JUMP JUMPDEST DUP2 PUSH2 0x99E JUMPI INVALID JUMPDEST DIV PUSH2 0xF89 JUMP JUMPDEST DUP6 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND SWAP1 PUSH2 0xFB2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP5 MSTORE POP POP JUMPDEST PUSH2 0x9CC NUMBER PUSH2 0xF25 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB SWAP1 DUP2 AND PUSH1 0x20 DUP5 DUP2 ADD SWAP2 DUP3 MSTORE PUSH1 0x0 DUP7 DUP2 MSTORE PUSH1 0x2 SWAP1 SWAP2 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP6 MLOAD DUP2 SLOAD SWAP4 MLOAD DUP4 DUP9 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB NOT SWAP1 SWAP6 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP4 AND OR PUSH8 0xFFFFFFFFFFFFFFFF PUSH1 0x80 SHL NOT AND PUSH1 0x1 PUSH1 0x80 SHL DUP3 DUP9 AND MUL OR PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND PUSH1 0x1 PUSH1 0xC0 SHL SWAP6 SWAP1 SWAP7 AND SWAP5 SWAP1 SWAP5 MUL SWAP5 SWAP1 SWAP5 OR SWAP1 SSTORE MLOAD DUP6 SWAP3 PUSH32 0xFC9545022A542541AD085D091FB09A2AB36FEE366A4576AB63714EA907AD353 SWAP3 PUSH2 0xA76 SWAP3 SWAP1 SWAP2 DUP7 SWAP2 PUSH2 0x16AF JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST DUP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xAB5 JUMPI PUSH2 0xAAC DUP5 DUP5 DUP4 DUP2 DUP2 LT PUSH2 0xAA0 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD PUSH2 0x787 JUMP JUMPDEST POP PUSH1 0x1 ADD PUSH2 0xA89 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x3 DUP2 DUP2 SLOAD DUP2 LT PUSH2 0xAC8 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD SWAP1 POP DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0xB03 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x285 SWAP1 PUSH2 0x155D JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x80 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND ISZERO PUSH2 0xB3F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x285 SWAP1 PUSH2 0x141B JUMP JUMPDEST PUSH1 0x5 SLOAD NUMBER SWAP1 PUSH2 0xB4E SWAP1 DUP5 PUSH2 0xF02 JUMP JUMPDEST PUSH1 0x5 SSTORE PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 DUP2 ADD PUSH2 0xB6D DUP4 PUSH2 0xF25 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xB84 DUP6 PUSH2 0xF25 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB SWAP1 DUP2 AND SWAP1 SWAP2 MSTORE PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP6 MLOAD DUP2 SLOAD SWAP4 DUP8 ADD MLOAD SWAP7 DUP4 ADD MLOAD DUP7 AND PUSH1 0x1 PUSH1 0xC0 SHL MUL PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB SWAP8 SWAP1 SWAP7 AND PUSH1 0x1 PUSH1 0x80 SHL MUL PUSH8 0xFFFFFFFFFFFFFFFF PUSH1 0x80 SHL NOT PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP1 SWAP3 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB NOT SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 OR AND SWAP3 SWAP1 SWAP3 OR SWAP5 SWAP1 SWAP5 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 SSTORE PUSH1 0x3 DUP1 SLOAD PUSH1 0x1 DUP2 ADD DUP3 SSTORE SWAP2 MSTORE PUSH32 0xC2575A0E9E593C00F959F8C92F12DB2869C3395A3B0502D05E2516446F71F85B ADD DUP4 SWAP1 SSTORE MLOAD DUP3 SWAP1 PUSH32 0x38410508059921573AB9EBDCA2A5034BE738D236366B8F32DE4434EA95ED3C81 SWAP1 PUSH2 0xC62 SWAP1 DUP7 SWAP1 PUSH2 0x1698 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP POP JUMP JUMPDEST CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 AND EQ PUSH2 0xCB7 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x285 SWAP1 PUSH2 0x147F JUMP JUMPDEST PUSH2 0xCBF PUSH2 0x10CF JUMP JUMPDEST PUSH2 0xCC8 DUP7 PUSH2 0x787 JUMP JUMPDEST PUSH1 0x0 DUP8 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP11 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE DUP2 KECCAK256 DUP1 SLOAD SWAP3 SWAP4 POP SWAP2 ISZERO PUSH2 0xD52 JUMPI PUSH1 0x1 DUP3 ADD SLOAD DUP4 MLOAD DUP4 SLOAD PUSH2 0xD1C SWAP3 SWAP2 PUSH5 0xE8D4A51000 SWAP2 PUSH2 0x6E1 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0xF52 JUMP JUMPDEST SWAP1 POP PUSH2 0xD52 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 AND DUP8 DUP4 PUSH2 0xFE1 JUMP JUMPDEST DUP4 DUP3 SSTORE DUP3 MLOAD PUSH5 0xE8D4A51000 SWAP1 PUSH2 0xD72 SWAP1 DUP7 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0xF52 JUMP JUMPDEST DUP2 PUSH2 0xD79 JUMPI INVALID JUMPDEST DIV DUP3 PUSH1 0x1 ADD DUP2 SWAP1 SSTORE POP DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP9 DUP9 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x2ECE88CA2BC08DD018DB50E1D25A20BF1241E5FAB1C396CAA51F01A54BD2F75B DUP5 PUSH1 0x40 MLOAD PUSH2 0xDC6 SWAP2 SWAP1 PUSH2 0x1698 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x4 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 SWAP1 SWAP2 ADD SLOAD DUP3 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 DUP1 DUP3 MSTORE DUP2 DUP4 ADD SWAP1 SWAP3 MSTORE PUSH1 0x60 SWAP2 DUP3 SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP1 DUP4 ADD SWAP1 DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP POP SWAP1 POP PUSH32 0x0 DUP2 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0xE5F JUMPI INVALID JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND PUSH1 0x20 SWAP3 DUP4 MUL SWAP2 SWAP1 SWAP2 ADD SWAP1 SWAP2 ADD MSTORE PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 DUP1 DUP3 MSTORE DUP2 DUP4 ADD SWAP1 SWAP3 MSTORE PUSH1 0x60 SWAP2 DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP POP SWAP1 POP PUSH2 0xEA6 DUP8 DUP8 PUSH2 0x46C JUMP JUMPDEST DUP2 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0xEB3 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE SWAP1 SWAP7 SWAP1 SWAP6 POP SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST DUP1 DUP3 SUB DUP3 DUP2 GT ISZERO PUSH2 0xEFC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x285 SWAP1 PUSH2 0x13EC JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP2 DUP2 ADD DUP2 DUP2 LT ISZERO PUSH2 0xEFC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x285 SWAP1 PUSH2 0x1526 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP3 GT ISZERO PUSH2 0xF4E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x285 SWAP1 PUSH2 0x15C7 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 ISZERO DUP1 PUSH2 0xF6D JUMPI POP POP DUP1 DUP3 MUL DUP3 DUP3 DUP3 DUP2 PUSH2 0xF6A JUMPI INVALID JUMPDEST DIV EQ JUMPDEST PUSH2 0xEFC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x285 SWAP1 PUSH2 0x15FE JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP3 GT ISZERO PUSH2 0xF4E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x285 SWAP1 PUSH2 0x14EF JUMP JUMPDEST DUP2 DUP2 ADD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP4 AND SWAP1 DUP3 AND LT ISZERO PUSH2 0xEFC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x285 SWAP1 PUSH2 0x1526 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xA9059CBB DUP6 DUP6 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x1007 SWAP3 SWAP2 SWAP1 PUSH2 0x1343 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP1 PUSH1 0xE0 SHL PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB DUP4 DUP2 DUP4 AND OR DUP4 MSTORE POP POP POP POP PUSH1 0x40 MLOAD PUSH2 0x1040 SWAP2 SWAP1 PUSH2 0x12F6 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x107D JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x1082 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 DUP1 ISZERO PUSH2 0x10AC JUMPI POP DUP1 MLOAD ISZERO DUP1 PUSH2 0x10AC JUMPI POP DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x10AC SWAP2 SWAP1 PUSH2 0x11A7 JUMP JUMPDEST PUSH2 0x10C8 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x285 SWAP1 PUSH2 0x1448 JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1103 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x110E DUP2 PUSH2 0x16D9 JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x111E DUP2 PUSH2 0x16F1 JUMP JUMPDEST SWAP2 POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH2 0x112E DUP2 PUSH2 0x16F1 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x20 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x114B JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 GT ISZERO PUSH2 0x1161 JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 DUP6 ADD SWAP2 POP DUP6 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x1174 JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x1182 JUMPI DUP5 DUP6 REVERT JUMPDEST DUP7 PUSH1 0x20 DUP1 DUP4 MUL DUP6 ADD ADD GT ISZERO PUSH2 0x1195 JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH1 0x20 SWAP3 SWAP1 SWAP3 ADD SWAP7 SWAP2 SWAP6 POP SWAP1 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x11B8 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x11C3 DUP2 PUSH2 0x16F1 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x11DB JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x11C3 DUP2 PUSH2 0x16D9 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x11F7 JUMPI DUP1 DUP2 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x120F JUMPI DUP1 DUP2 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1228 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH2 0x123A DUP2 PUSH2 0x16D9 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x125C JUMPI DUP1 DUP2 REVERT JUMPDEST DUP6 CALLDATALOAD SWAP5 POP PUSH1 0x20 DUP7 ADD CALLDATALOAD PUSH2 0x126E DUP2 PUSH2 0x16D9 JUMP JUMPDEST SWAP4 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD PUSH2 0x127E DUP2 PUSH2 0x16D9 JUMP JUMPDEST SWAP5 SWAP8 SWAP4 SWAP7 POP SWAP4 SWAP5 PUSH1 0x60 DUP2 ADD CALLDATALOAD SWAP5 POP PUSH1 0x80 ADD CALLDATALOAD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x12AA JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 CALLDATALOAD SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x12BC DUP2 PUSH2 0x16D9 JUMP JUMPDEST SWAP3 SWAP6 SWAP3 SWAP5 POP POP POP PUSH1 0x40 SWAP2 SWAP1 SWAP2 ADD CALLDATALOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x12DF JUMPI DUP2 DUP3 REVERT JUMPDEST POP POP DUP1 CALLDATALOAD SWAP3 PUSH1 0x20 SWAP1 SWAP2 ADD CALLDATALOAD SWAP2 POP JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD DUP2 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1316 JUMPI PUSH1 0x20 DUP2 DUP7 ADD DUP2 ADD MLOAD DUP6 DUP4 ADD MSTORE ADD PUSH2 0x12FC JUMP JUMPDEST DUP2 DUP2 GT ISZERO PUSH2 0x1324 JUMPI DUP3 DUP3 DUP6 ADD MSTORE JUMPDEST POP SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 DUP3 MSTORE DUP4 MLOAD SWAP1 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP1 PUSH1 0x20 SWAP1 PUSH1 0x60 DUP5 ADD SWAP1 DUP3 DUP8 ADD DUP5 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x139E JUMPI DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 MSTORE SWAP3 DUP5 ADD SWAP3 SWAP1 DUP5 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x1379 JUMP JUMPDEST POP POP POP DUP4 DUP2 SUB DUP3 DUP6 ADD MSTORE DUP1 DUP6 MLOAD PUSH2 0x13B5 DUP2 DUP5 PUSH2 0x1698 JUMP JUMPDEST SWAP2 POP DUP4 DUP8 ADD SWAP3 POP DUP5 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x13DF JUMPI PUSH2 0x13D1 DUP4 DUP6 MLOAD PUSH2 0x12EE JUMP JUMPDEST SWAP4 DUP6 ADD SWAP4 SWAP3 POP PUSH1 0x1 ADD PUSH2 0x13BE JUMP JUMPDEST POP SWAP1 SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x15 SWAP1 DUP3 ADD MSTORE PUSH21 0x426F72696E674D6174683A20556E646572666C6F77 PUSH1 0x58 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x13 SWAP1 DUP3 ADD MSTORE PUSH19 0x506F6F6C20616C726561647920657869737473 PUSH1 0x68 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1C SWAP1 DUP3 ADD MSTORE PUSH32 0x426F72696E6745524332303A205472616E73666572206661696C656400000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x21 SWAP1 DUP3 ADD MSTORE PUSH32 0x4F6E6C79204D4356322063616E2063616C6C20746869732066756E6374696F6E PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0xF9 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x15 SWAP1 DUP3 ADD MSTORE PUSH21 0x4F776E61626C653A207A65726F2061646472657373 PUSH1 0x58 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1C SWAP1 DUP3 ADD MSTORE PUSH32 0x426F72696E674D6174683A2075696E74313238204F766572666C6F7700000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x18 SWAP1 DUP3 ADD MSTORE PUSH32 0x426F72696E674D6174683A20416464204F766572666C6F770000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C657220213D2070656E64696E67206F776E6572 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1B SWAP1 DUP3 ADD MSTORE PUSH32 0x426F72696E674D6174683A2075696E743634204F766572666C6F770000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x18 SWAP1 DUP3 ADD MSTORE PUSH32 0x426F72696E674D6174683A204D756C204F766572666C6F770000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH1 0x20 DUP1 DUP4 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB SWAP1 DUP2 AND SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 SWAP3 DUP4 ADD MLOAD AND SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP4 SWAP1 SWAP4 AND DUP4 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB SWAP2 DUP3 AND PUSH1 0x20 DUP5 ADD MSTORE AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB SWAP4 SWAP1 SWAP4 AND DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x16EE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x16EE JUMPI PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 JUMPDEST MUL 0xE6 PUSH31 0x50616308DE8A2A0EA092220CBB6BAB154C4C12313CE97766220AC5F864736F PUSH13 0x634300060C0033000000000000 ", + "sourceMap": "399:6863:9:-:0;;;2028:212;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;639:5:1;:18;;-1:-1:-1;;;;;;639:18:1;647:10;639:18;;;;;673:44;;647:10;;639:5;673:44;;639:5;;673:44;-1:-1:-1;;;;;;2127:26:9;;;;;;;;2163:13;:30;;;;2203;;;;;;399:6863;;456:563:-1;;;;619:2;607:9;598:7;594:23;590:32;587:2;;;-1:-1;;625:12;587:2;244:6;238:13;256:47;297:5;256:47;:::i;:::-;802:2;852:22;;393:13;921:2;971:22;;83:13;677:88;;-1:-1;393:13;-1:-1;101:33;83:13;101:33;:::i;:::-;929:74;;;;581:438;;;;;:::o;1443:117::-;-1:-1;;;;;1298:54;;1502:35;;1492:2;;1551:1;;1541:12;1492:2;1486:74;:::o;:::-;399:6863:9;;;;;;;;;;;;;;;;" + }, + "deployedBytecode": { + "immutableReferences": { + "2389": [ + { + "length": 32, + "start": 3371 + }, + { + "length": 32, + "start": 3635 + } + ], + "2426": [ + { + "length": 32, + "start": 1275 + }, + { + "length": 32, + "start": 1424 + }, + { + "length": 32, + "start": 2048 + }, + { + "length": 32, + "start": 2197 + }, + { + "length": 32, + "start": 3194 + } + ] + }, + "linkReferences": {}, + "object": "608060405234801561001057600080fd5b50600436106101005760003560e01c806357a5b58c116100975780638da5cb5b116100665780638da5cb5b146101fc57806393f1a40b14610211578063d63b3c4914610232578063e30c39781461025357610100565b806357a5b58c146101b057806369883b4e146101c3578063771602f7146101d65780638bf63742146101e957610100565b80634198709a116100d35780634198709a1461016d57806348e43af4146101755780634e71e0c81461018857806351eb05a61461019057610100565b8063078dfbe714610105578063081e3eda1461011a5780631526fe27146101385780631ab06ee51461015a575b600080fd5b6101186101133660046110ef565b61025b565b005b61012261034a565b60405161012f9190611698565b60405180910390f35b61014b6101463660046111e6565b610350565b60405161012f9392919061166e565b6101186101683660046112cd565b610387565b610122610466565b610122610183366004611216565b61046c565b6101186106fa565b6101a361019e3660046111e6565b610787565b60405161012f9190611635565b6101186101be366004611139565b610a85565b6101226101d13660046111e6565b610abb565b6101186101e43660046112cd565b610ad9565b6101186101f7366004611245565b610c6f565b610204610dd8565b60405161012f919061132f565b61022461021f366004611216565b610de7565b60405161012f9291906116a1565b610245610240366004611296565b610e0b565b60405161012f92919061135c565b610204610eca565b6000546001600160a01b0316331461028e5760405162461bcd60e51b81526004016102859061155d565b60405180910390fd5b8115610329576001600160a01b0383161515806102a85750805b6102c45760405162461bcd60e51b8152600401610285906114c0565b600080546040516001600160a01b03808716939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0385166001600160a01b031991821617909155600180549091169055610345565b600180546001600160a01b0319166001600160a01b0385161790555b505050565b60035490565b6002602052600090815260409020546001600160801b038116906001600160401b03600160801b8204811691600160c01b90041683565b6000546001600160a01b031633146103b15760405162461bcd60e51b81526004016102859061155d565b6000828152600260205260409020546005546103e89183916103e291600160c01b90046001600160401b0316610ed9565b90610f02565b6005556103f481610f25565b6000838152600260205260409081902080546001600160401b0393909316600160c01b026001600160c01b03909316929092179091555182907f942cc7e17a17c164bd977f32ab8c54265d5b9d481e4e352bf874f1e568874e7c9061045a908490611698565b60405180910390a25050565b60065481565b60006104766110cf565b506000838152600260209081526040808320815160608101835290546001600160801b0380821683526001600160401b03600160801b8304811684870152600160c01b9092049091168284015287855260048085528386206001600160a01b03808a1688529552838620835194516378ed5d1f60e01b815293969095949092169391927f0000000000000000000000000000000000000000000000000000000000000000909216916378ed5d1f91610530918b9101611698565b60206040518083038186803b15801561054857600080fd5b505afa15801561055c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061058091906111ca565b6001600160a01b03166370a082317f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b81526004016105cb919061132f565b60206040518083038186803b1580156105e357600080fd5b505afa1580156105f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061061b91906111fe565b905083602001516001600160401b03164311801561063857508015155b156106c457600061065f85602001516001600160401b031643610ed990919063ffffffff16565b9050600060055461069287604001516001600160401b031661068c60065486610f5290919063ffffffff16565b90610f52565b8161069957fe5b0490506106bf836106af8364e8d4a51000610f52565b816106b657fe5b86919004610f02565b935050505b600183015483546106ef919064e8d4a51000906106e19086610f52565b816106e857fe5b0490610ed9565b979650505050505050565b6001546001600160a01b03163381146107255760405162461bcd60e51b815260040161028590611592565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b039092166001600160a01b0319928316179055600180549091169055565b61078f6110cf565b50600081815260026020908152604091829020825160608101845290546001600160801b03811682526001600160401b03600160801b82048116938301849052600160c01b9091041692810192909252431115610a80576040516378ed5d1f60e01b81526000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906378ed5d1f90610835908690600401611698565b60206040518083038186803b15801561084d57600080fd5b505afa158015610861573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088591906111ca565b6001600160a01b03166370a082317f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b81526004016108d0919061132f565b60206040518083038186803b1580156108e857600080fd5b505afa1580156108fc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061092091906111fe565b905080156109c357600061094a83602001516001600160401b031643610ed990919063ffffffff16565b9050600060055461097785604001516001600160401b031661068c60065486610f5290919063ffffffff16565b8161097e57fe5b0490506109b56109a4846109978464e8d4a51000610f52565b8161099e57fe5b04610f89565b85516001600160801b031690610fb2565b6001600160801b0316845250505b6109cc43610f25565b6001600160401b03908116602084810191825260008681526002909152604090819020855181549351838801516001600160801b03199095166001600160801b0383161767ffffffffffffffff60801b1916600160801b82881602176001600160c01b0316600160c01b95909616949094029490941790555185927f0fc9545022a542541ad085d091fb09a2ab36fee366a4576ab63714ea907ad35392610a7692909186916116af565b60405180910390a2505b919050565b8060005b81811015610ab557610aac848483818110610aa057fe5b90506020020135610787565b50600101610a89565b50505050565b60038181548110610ac857fe5b600091825260209091200154905081565b6000546001600160a01b03163314610b035760405162461bcd60e51b81526004016102859061155d565b600081815260026020526040902054600160801b90046001600160401b031615610b3f5760405162461bcd60e51b81526004016102859061141b565b6005544390610b4e9084610f02565b60055560408051606081019091526000815260208101610b6d83610f25565b6001600160401b03168152602001610b8485610f25565b6001600160401b0390811690915260008481526002602090815260408083208551815493870151968301518616600160c01b026001600160c01b0397909616600160801b0267ffffffffffffffff60801b196001600160801b039092166001600160801b031990951694909417169290921794909416929092179091556003805460018101825591527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b018390555182907f38410508059921573ab9ebdca2a5034be738d236366b8f32de4434ea95ed3c8190610c62908690611698565b60405180910390a2505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610cb75760405162461bcd60e51b81526004016102859061147f565b610cbf6110cf565b610cc886610787565b60008781526004602090815260408083206001600160a01b038a168452909152812080549293509115610d5257600182015483518354610d1c929164e8d4a51000916106e1916001600160801b0316610f52565b9050610d526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168783610fe1565b838255825164e8d4a5100090610d729086906001600160801b0316610f52565b81610d7957fe5b048260010181905550856001600160a01b031688886001600160a01b03167f2ece88ca2bc08dd018db50e1d25a20bf1241e5fab1c396caa51f01a54bd2f75b84604051610dc69190611698565b60405180910390a45050505050505050565b6000546001600160a01b031681565b60046020908152600092835260408084209091529082529020805460019091015482565b60408051600180825281830190925260609182918291602080830190803683370190505090507f000000000000000000000000000000000000000000000000000000000000000081600081518110610e5f57fe5b6001600160a01b039290921660209283029190910190910152604080516001808252818301909252606091816020016020820280368337019050509050610ea6878761046c565b81600081518110610eb357fe5b602090810291909101015290969095509350505050565b6001546001600160a01b031681565b80820382811115610efc5760405162461bcd60e51b8152600401610285906113ec565b92915050565b81810181811015610efc5760405162461bcd60e51b815260040161028590611526565b60006001600160401b03821115610f4e5760405162461bcd60e51b8152600401610285906115c7565b5090565b6000811580610f6d57505080820282828281610f6a57fe5b04145b610efc5760405162461bcd60e51b8152600401610285906115fe565b60006001600160801b03821115610f4e5760405162461bcd60e51b8152600401610285906114ef565b8181016001600160801b038083169082161015610efc5760405162461bcd60e51b815260040161028590611526565b60006060846001600160a01b031663a9059cbb8585604051602401611007929190611343565b6040516020818303038152906040529060e01b6020820180516001600160e01b03838183161783525050505060405161104091906112f6565b6000604051808303816000865af19150503d806000811461107d576040519150601f19603f3d011682016040523d82523d6000602084013e611082565b606091505b50915091508180156110ac5750805115806110ac5750808060200190518101906110ac91906111a7565b6110c85760405162461bcd60e51b815260040161028590611448565b5050505050565b604080516060810182526000808252602082018190529181019190915290565b600080600060608486031215611103578283fd5b833561110e816116d9565b9250602084013561111e816116f1565b9150604084013561112e816116f1565b809150509250925092565b6000806020838503121561114b578182fd5b82356001600160401b0380821115611161578384fd5b818501915085601f830112611174578384fd5b813581811115611182578485fd5b8660208083028501011115611195578485fd5b60209290920196919550909350505050565b6000602082840312156111b8578081fd5b81516111c3816116f1565b9392505050565b6000602082840312156111db578081fd5b81516111c3816116d9565b6000602082840312156111f7578081fd5b5035919050565b60006020828403121561120f578081fd5b5051919050565b60008060408385031215611228578182fd5b82359150602083013561123a816116d9565b809150509250929050565b600080600080600060a0868803121561125c578081fd5b85359450602086013561126e816116d9565b9350604086013561127e816116d9565b94979396509394606081013594506080013592915050565b6000806000606084860312156112aa578283fd5b8335925060208401356112bc816116d9565b929592945050506040919091013590565b600080604083850312156112df578182fd5b50508035926020909101359150565b815260200190565b60008251815b8181101561131657602081860181015185830152016112fc565b818111156113245782828501525b509190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b604080825283519082018190526000906020906060840190828701845b8281101561139e5781516001600160a01b031684529284019290840190600101611379565b505050838103828501528085516113b58184611698565b91508387019250845b818110156113df576113d18385516112ee565b9385019392506001016113be565b5090979650505050505050565b602080825260159082015274426f72696e674d6174683a20556e646572666c6f7760581b604082015260600190565b602080825260139082015272506f6f6c20616c72656164792065786973747360681b604082015260600190565b6020808252601c908201527f426f72696e6745524332303a205472616e73666572206661696c656400000000604082015260600190565b60208082526021908201527f4f6e6c79204d4356322063616e2063616c6c20746869732066756e6374696f6e6040820152601760f91b606082015260800190565b6020808252601590820152744f776e61626c653a207a65726f206164647265737360581b604082015260600190565b6020808252601c908201527f426f72696e674d6174683a2075696e74313238204f766572666c6f7700000000604082015260600190565b60208082526018908201527f426f72696e674d6174683a20416464204f766572666c6f770000000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c657220213d2070656e64696e67206f776e6572604082015260600190565b6020808252601b908201527f426f72696e674d6174683a2075696e743634204f766572666c6f770000000000604082015260600190565b60208082526018908201527f426f72696e674d6174683a204d756c204f766572666c6f770000000000000000604082015260600190565b81516001600160801b031681526020808301516001600160401b0390811691830191909152604092830151169181019190915260600190565b6001600160801b039390931683526001600160401b03918216602084015216604082015260600190565b90815260200190565b918252602082015260400190565b6001600160401b0393909316835260208301919091526001600160801b0316604082015260600190565b6001600160a01b03811681146116ee57600080fd5b50565b80151581146116ee57600080fdfea26469706673582212205b02e67e50616308de8a2a0ea092220cbb6bab154c4c12313ce97766220ac5f864736f6c634300060c0033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x100 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x57A5B58C GT PUSH2 0x97 JUMPI DUP1 PUSH4 0x8DA5CB5B GT PUSH2 0x66 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x1FC JUMPI DUP1 PUSH4 0x93F1A40B EQ PUSH2 0x211 JUMPI DUP1 PUSH4 0xD63B3C49 EQ PUSH2 0x232 JUMPI DUP1 PUSH4 0xE30C3978 EQ PUSH2 0x253 JUMPI PUSH2 0x100 JUMP JUMPDEST DUP1 PUSH4 0x57A5B58C EQ PUSH2 0x1B0 JUMPI DUP1 PUSH4 0x69883B4E EQ PUSH2 0x1C3 JUMPI DUP1 PUSH4 0x771602F7 EQ PUSH2 0x1D6 JUMPI DUP1 PUSH4 0x8BF63742 EQ PUSH2 0x1E9 JUMPI PUSH2 0x100 JUMP JUMPDEST DUP1 PUSH4 0x4198709A GT PUSH2 0xD3 JUMPI DUP1 PUSH4 0x4198709A EQ PUSH2 0x16D JUMPI DUP1 PUSH4 0x48E43AF4 EQ PUSH2 0x175 JUMPI DUP1 PUSH4 0x4E71E0C8 EQ PUSH2 0x188 JUMPI DUP1 PUSH4 0x51EB05A6 EQ PUSH2 0x190 JUMPI PUSH2 0x100 JUMP JUMPDEST DUP1 PUSH4 0x78DFBE7 EQ PUSH2 0x105 JUMPI DUP1 PUSH4 0x81E3EDA EQ PUSH2 0x11A JUMPI DUP1 PUSH4 0x1526FE27 EQ PUSH2 0x138 JUMPI DUP1 PUSH4 0x1AB06EE5 EQ PUSH2 0x15A JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x118 PUSH2 0x113 CALLDATASIZE PUSH1 0x4 PUSH2 0x10EF JUMP JUMPDEST PUSH2 0x25B JUMP JUMPDEST STOP JUMPDEST PUSH2 0x122 PUSH2 0x34A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x12F SWAP2 SWAP1 PUSH2 0x1698 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x14B PUSH2 0x146 CALLDATASIZE PUSH1 0x4 PUSH2 0x11E6 JUMP JUMPDEST PUSH2 0x350 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x12F SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x166E JUMP JUMPDEST PUSH2 0x118 PUSH2 0x168 CALLDATASIZE PUSH1 0x4 PUSH2 0x12CD JUMP JUMPDEST PUSH2 0x387 JUMP JUMPDEST PUSH2 0x122 PUSH2 0x466 JUMP JUMPDEST PUSH2 0x122 PUSH2 0x183 CALLDATASIZE PUSH1 0x4 PUSH2 0x1216 JUMP JUMPDEST PUSH2 0x46C JUMP JUMPDEST PUSH2 0x118 PUSH2 0x6FA JUMP JUMPDEST PUSH2 0x1A3 PUSH2 0x19E CALLDATASIZE PUSH1 0x4 PUSH2 0x11E6 JUMP JUMPDEST PUSH2 0x787 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x12F SWAP2 SWAP1 PUSH2 0x1635 JUMP JUMPDEST PUSH2 0x118 PUSH2 0x1BE CALLDATASIZE PUSH1 0x4 PUSH2 0x1139 JUMP JUMPDEST PUSH2 0xA85 JUMP JUMPDEST PUSH2 0x122 PUSH2 0x1D1 CALLDATASIZE PUSH1 0x4 PUSH2 0x11E6 JUMP JUMPDEST PUSH2 0xABB JUMP JUMPDEST PUSH2 0x118 PUSH2 0x1E4 CALLDATASIZE PUSH1 0x4 PUSH2 0x12CD JUMP JUMPDEST PUSH2 0xAD9 JUMP JUMPDEST PUSH2 0x118 PUSH2 0x1F7 CALLDATASIZE PUSH1 0x4 PUSH2 0x1245 JUMP JUMPDEST PUSH2 0xC6F JUMP JUMPDEST PUSH2 0x204 PUSH2 0xDD8 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x12F SWAP2 SWAP1 PUSH2 0x132F JUMP JUMPDEST PUSH2 0x224 PUSH2 0x21F CALLDATASIZE PUSH1 0x4 PUSH2 0x1216 JUMP JUMPDEST PUSH2 0xDE7 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x12F SWAP3 SWAP2 SWAP1 PUSH2 0x16A1 JUMP JUMPDEST PUSH2 0x245 PUSH2 0x240 CALLDATASIZE PUSH1 0x4 PUSH2 0x1296 JUMP JUMPDEST PUSH2 0xE0B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x12F SWAP3 SWAP2 SWAP1 PUSH2 0x135C JUMP JUMPDEST PUSH2 0x204 PUSH2 0xECA JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0x28E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x285 SWAP1 PUSH2 0x155D JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP2 ISZERO PUSH2 0x329 JUMPI PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND ISZERO ISZERO DUP1 PUSH2 0x2A8 JUMPI POP DUP1 JUMPDEST PUSH2 0x2C4 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x285 SWAP1 PUSH2 0x14C0 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP8 AND SWAP4 SWAP3 AND SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 LOG3 PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP2 DUP3 AND OR SWAP1 SWAP2 SSTORE PUSH1 0x1 DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SSTORE PUSH2 0x345 JUMP JUMPDEST PUSH1 0x1 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND OR SWAP1 SSTORE JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x3 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP2 AND SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB PUSH1 0x1 PUSH1 0x80 SHL DUP3 DIV DUP2 AND SWAP2 PUSH1 0x1 PUSH1 0xC0 SHL SWAP1 DIV AND DUP4 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0x3B1 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x285 SWAP1 PUSH2 0x155D JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x5 SLOAD PUSH2 0x3E8 SWAP2 DUP4 SWAP2 PUSH2 0x3E2 SWAP2 PUSH1 0x1 PUSH1 0xC0 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND PUSH2 0xED9 JUMP JUMPDEST SWAP1 PUSH2 0xF02 JUMP JUMPDEST PUSH1 0x5 SSTORE PUSH2 0x3F4 DUP2 PUSH2 0xF25 JUMP JUMPDEST PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB SWAP4 SWAP1 SWAP4 AND PUSH1 0x1 PUSH1 0xC0 SHL MUL PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 SSTORE MLOAD DUP3 SWAP1 PUSH32 0x942CC7E17A17C164BD977F32AB8C54265D5B9D481E4E352BF874F1E568874E7C SWAP1 PUSH2 0x45A SWAP1 DUP5 SWAP1 PUSH2 0x1698 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP JUMP JUMPDEST PUSH1 0x6 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x476 PUSH2 0x10CF JUMP JUMPDEST POP PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP2 MLOAD PUSH1 0x60 DUP2 ADD DUP4 MSTORE SWAP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP3 AND DUP4 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB PUSH1 0x1 PUSH1 0x80 SHL DUP4 DIV DUP2 AND DUP5 DUP8 ADD MSTORE PUSH1 0x1 PUSH1 0xC0 SHL SWAP1 SWAP3 DIV SWAP1 SWAP2 AND DUP3 DUP5 ADD MSTORE DUP8 DUP6 MSTORE PUSH1 0x4 DUP1 DUP6 MSTORE DUP4 DUP7 KECCAK256 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP11 AND DUP9 MSTORE SWAP6 MSTORE DUP4 DUP7 KECCAK256 DUP4 MLOAD SWAP5 MLOAD PUSH4 0x78ED5D1F PUSH1 0xE0 SHL DUP2 MSTORE SWAP4 SWAP7 SWAP1 SWAP6 SWAP5 SWAP1 SWAP3 AND SWAP4 SWAP2 SWAP3 PUSH32 0x0 SWAP1 SWAP3 AND SWAP2 PUSH4 0x78ED5D1F SWAP2 PUSH2 0x530 SWAP2 DUP12 SWAP2 ADD PUSH2 0x1698 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x548 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x55C JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x580 SWAP2 SWAP1 PUSH2 0x11CA JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 PUSH32 0x0 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x5CB SWAP2 SWAP1 PUSH2 0x132F JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x5E3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x5F7 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x61B SWAP2 SWAP1 PUSH2 0x11FE JUMP JUMPDEST SWAP1 POP DUP4 PUSH1 0x20 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND NUMBER GT DUP1 ISZERO PUSH2 0x638 JUMPI POP DUP1 ISZERO ISZERO JUMPDEST ISZERO PUSH2 0x6C4 JUMPI PUSH1 0x0 PUSH2 0x65F DUP6 PUSH1 0x20 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND NUMBER PUSH2 0xED9 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH1 0x5 SLOAD PUSH2 0x692 DUP8 PUSH1 0x40 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND PUSH2 0x68C PUSH1 0x6 SLOAD DUP7 PUSH2 0xF52 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 PUSH2 0xF52 JUMP JUMPDEST DUP2 PUSH2 0x699 JUMPI INVALID JUMPDEST DIV SWAP1 POP PUSH2 0x6BF DUP4 PUSH2 0x6AF DUP4 PUSH5 0xE8D4A51000 PUSH2 0xF52 JUMP JUMPDEST DUP2 PUSH2 0x6B6 JUMPI INVALID JUMPDEST DUP7 SWAP2 SWAP1 DIV PUSH2 0xF02 JUMP JUMPDEST SWAP4 POP POP POP JUMPDEST PUSH1 0x1 DUP4 ADD SLOAD DUP4 SLOAD PUSH2 0x6EF SWAP2 SWAP1 PUSH5 0xE8D4A51000 SWAP1 PUSH2 0x6E1 SWAP1 DUP7 PUSH2 0xF52 JUMP JUMPDEST DUP2 PUSH2 0x6E8 JUMPI INVALID JUMPDEST DIV SWAP1 PUSH2 0xED9 JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER DUP2 EQ PUSH2 0x725 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x285 SWAP1 PUSH2 0x1592 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP6 AND SWAP4 SWAP3 AND SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 LOG3 PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP3 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT SWAP3 DUP4 AND OR SWAP1 SSTORE PUSH1 0x1 DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x78F PUSH2 0x10CF JUMP JUMPDEST POP PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP3 MLOAD PUSH1 0x60 DUP2 ADD DUP5 MSTORE SWAP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP2 AND DUP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB PUSH1 0x1 PUSH1 0x80 SHL DUP3 DIV DUP2 AND SWAP4 DUP4 ADD DUP5 SWAP1 MSTORE PUSH1 0x1 PUSH1 0xC0 SHL SWAP1 SWAP2 DIV AND SWAP3 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE NUMBER GT ISZERO PUSH2 0xA80 JUMPI PUSH1 0x40 MLOAD PUSH4 0x78ED5D1F PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x0 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 AND SWAP1 PUSH4 0x78ED5D1F SWAP1 PUSH2 0x835 SWAP1 DUP7 SWAP1 PUSH1 0x4 ADD PUSH2 0x1698 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x84D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x861 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x885 SWAP2 SWAP1 PUSH2 0x11CA JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0x70A08231 PUSH32 0x0 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8D0 SWAP2 SWAP1 PUSH2 0x132F JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x8E8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x8FC JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x920 SWAP2 SWAP1 PUSH2 0x11FE JUMP JUMPDEST SWAP1 POP DUP1 ISZERO PUSH2 0x9C3 JUMPI PUSH1 0x0 PUSH2 0x94A DUP4 PUSH1 0x20 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND NUMBER PUSH2 0xED9 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH1 0x5 SLOAD PUSH2 0x977 DUP6 PUSH1 0x40 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND PUSH2 0x68C PUSH1 0x6 SLOAD DUP7 PUSH2 0xF52 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST DUP2 PUSH2 0x97E JUMPI INVALID JUMPDEST DIV SWAP1 POP PUSH2 0x9B5 PUSH2 0x9A4 DUP5 PUSH2 0x997 DUP5 PUSH5 0xE8D4A51000 PUSH2 0xF52 JUMP JUMPDEST DUP2 PUSH2 0x99E JUMPI INVALID JUMPDEST DIV PUSH2 0xF89 JUMP JUMPDEST DUP6 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND SWAP1 PUSH2 0xFB2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP5 MSTORE POP POP JUMPDEST PUSH2 0x9CC NUMBER PUSH2 0xF25 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB SWAP1 DUP2 AND PUSH1 0x20 DUP5 DUP2 ADD SWAP2 DUP3 MSTORE PUSH1 0x0 DUP7 DUP2 MSTORE PUSH1 0x2 SWAP1 SWAP2 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP6 MLOAD DUP2 SLOAD SWAP4 MLOAD DUP4 DUP9 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB NOT SWAP1 SWAP6 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP4 AND OR PUSH8 0xFFFFFFFFFFFFFFFF PUSH1 0x80 SHL NOT AND PUSH1 0x1 PUSH1 0x80 SHL DUP3 DUP9 AND MUL OR PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB AND PUSH1 0x1 PUSH1 0xC0 SHL SWAP6 SWAP1 SWAP7 AND SWAP5 SWAP1 SWAP5 MUL SWAP5 SWAP1 SWAP5 OR SWAP1 SSTORE MLOAD DUP6 SWAP3 PUSH32 0xFC9545022A542541AD085D091FB09A2AB36FEE366A4576AB63714EA907AD353 SWAP3 PUSH2 0xA76 SWAP3 SWAP1 SWAP2 DUP7 SWAP2 PUSH2 0x16AF JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST DUP1 PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0xAB5 JUMPI PUSH2 0xAAC DUP5 DUP5 DUP4 DUP2 DUP2 LT PUSH2 0xAA0 JUMPI INVALID JUMPDEST SWAP1 POP PUSH1 0x20 MUL ADD CALLDATALOAD PUSH2 0x787 JUMP JUMPDEST POP PUSH1 0x1 ADD PUSH2 0xA89 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x3 DUP2 DUP2 SLOAD DUP2 LT PUSH2 0xAC8 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD SWAP1 POP DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0xB03 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x285 SWAP1 PUSH2 0x155D JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0x1 PUSH1 0x80 SHL SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND ISZERO PUSH2 0xB3F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x285 SWAP1 PUSH2 0x141B JUMP JUMPDEST PUSH1 0x5 SLOAD NUMBER SWAP1 PUSH2 0xB4E SWAP1 DUP5 PUSH2 0xF02 JUMP JUMPDEST PUSH1 0x5 SSTORE PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 DUP2 ADD PUSH2 0xB6D DUP4 PUSH2 0xF25 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xB84 DUP6 PUSH2 0xF25 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB SWAP1 DUP2 AND SWAP1 SWAP2 MSTORE PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP6 MLOAD DUP2 SLOAD SWAP4 DUP8 ADD MLOAD SWAP7 DUP4 ADD MLOAD DUP7 AND PUSH1 0x1 PUSH1 0xC0 SHL MUL PUSH1 0x1 PUSH1 0x1 PUSH1 0xC0 SHL SUB SWAP8 SWAP1 SWAP7 AND PUSH1 0x1 PUSH1 0x80 SHL MUL PUSH8 0xFFFFFFFFFFFFFFFF PUSH1 0x80 SHL NOT PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP1 SWAP3 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB NOT SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 OR AND SWAP3 SWAP1 SWAP3 OR SWAP5 SWAP1 SWAP5 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 SSTORE PUSH1 0x3 DUP1 SLOAD PUSH1 0x1 DUP2 ADD DUP3 SSTORE SWAP2 MSTORE PUSH32 0xC2575A0E9E593C00F959F8C92F12DB2869C3395A3B0502D05E2516446F71F85B ADD DUP4 SWAP1 SSTORE MLOAD DUP3 SWAP1 PUSH32 0x38410508059921573AB9EBDCA2A5034BE738D236366B8F32DE4434EA95ED3C81 SWAP1 PUSH2 0xC62 SWAP1 DUP7 SWAP1 PUSH2 0x1698 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP POP JUMP JUMPDEST CALLER PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 AND EQ PUSH2 0xCB7 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x285 SWAP1 PUSH2 0x147F JUMP JUMPDEST PUSH2 0xCBF PUSH2 0x10CF JUMP JUMPDEST PUSH2 0xCC8 DUP7 PUSH2 0x787 JUMP JUMPDEST PUSH1 0x0 DUP8 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP11 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE DUP2 KECCAK256 DUP1 SLOAD SWAP3 SWAP4 POP SWAP2 ISZERO PUSH2 0xD52 JUMPI PUSH1 0x1 DUP3 ADD SLOAD DUP4 MLOAD DUP4 SLOAD PUSH2 0xD1C SWAP3 SWAP2 PUSH5 0xE8D4A51000 SWAP2 PUSH2 0x6E1 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0xF52 JUMP JUMPDEST SWAP1 POP PUSH2 0xD52 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB PUSH32 0x0 AND DUP8 DUP4 PUSH2 0xFE1 JUMP JUMPDEST DUP4 DUP3 SSTORE DUP3 MLOAD PUSH5 0xE8D4A51000 SWAP1 PUSH2 0xD72 SWAP1 DUP7 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH2 0xF52 JUMP JUMPDEST DUP2 PUSH2 0xD79 JUMPI INVALID JUMPDEST DIV DUP3 PUSH1 0x1 ADD DUP2 SWAP1 SSTORE POP DUP6 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP9 DUP9 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0x2ECE88CA2BC08DD018DB50E1D25A20BF1241E5FAB1C396CAA51F01A54BD2F75B DUP5 PUSH1 0x40 MLOAD PUSH2 0xDC6 SWAP2 SWAP1 PUSH2 0x1698 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST PUSH1 0x4 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 SWAP1 SWAP2 ADD SLOAD DUP3 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 DUP1 DUP3 MSTORE DUP2 DUP4 ADD SWAP1 SWAP3 MSTORE PUSH1 0x60 SWAP2 DUP3 SWAP2 DUP3 SWAP2 PUSH1 0x20 DUP1 DUP4 ADD SWAP1 DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP POP SWAP1 POP PUSH32 0x0 DUP2 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0xE5F JUMPI INVALID JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND PUSH1 0x20 SWAP3 DUP4 MUL SWAP2 SWAP1 SWAP2 ADD SWAP1 SWAP2 ADD MSTORE PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 DUP1 DUP3 MSTORE DUP2 DUP4 ADD SWAP1 SWAP3 MSTORE PUSH1 0x60 SWAP2 DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY ADD SWAP1 POP POP SWAP1 POP PUSH2 0xEA6 DUP8 DUP8 PUSH2 0x46C JUMP JUMPDEST DUP2 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0xEB3 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD ADD MSTORE SWAP1 SWAP7 SWAP1 SWAP6 POP SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 JUMP JUMPDEST DUP1 DUP3 SUB DUP3 DUP2 GT ISZERO PUSH2 0xEFC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x285 SWAP1 PUSH2 0x13EC JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST DUP2 DUP2 ADD DUP2 DUP2 LT ISZERO PUSH2 0xEFC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x285 SWAP1 PUSH2 0x1526 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP3 GT ISZERO PUSH2 0xF4E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x285 SWAP1 PUSH2 0x15C7 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 ISZERO DUP1 PUSH2 0xF6D JUMPI POP POP DUP1 DUP3 MUL DUP3 DUP3 DUP3 DUP2 PUSH2 0xF6A JUMPI INVALID JUMPDEST DIV EQ JUMPDEST PUSH2 0xEFC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x285 SWAP1 PUSH2 0x15FE JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP3 GT ISZERO PUSH2 0xF4E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x285 SWAP1 PUSH2 0x14EF JUMP JUMPDEST DUP2 DUP2 ADD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB DUP1 DUP4 AND SWAP1 DUP3 AND LT ISZERO PUSH2 0xEFC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x285 SWAP1 PUSH2 0x1526 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH4 0xA9059CBB DUP6 DUP6 PUSH1 0x40 MLOAD PUSH1 0x24 ADD PUSH2 0x1007 SWAP3 SWAP2 SWAP1 PUSH2 0x1343 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP1 PUSH1 0xE0 SHL PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB DUP4 DUP2 DUP4 AND OR DUP4 MSTORE POP POP POP POP PUSH1 0x40 MLOAD PUSH2 0x1040 SWAP2 SWAP1 PUSH2 0x12F6 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP2 POP POP RETURNDATASIZE DUP1 PUSH1 0x0 DUP2 EQ PUSH2 0x107D JUMPI PUSH1 0x40 MLOAD SWAP2 POP PUSH1 0x1F NOT PUSH1 0x3F RETURNDATASIZE ADD AND DUP3 ADD PUSH1 0x40 MSTORE RETURNDATASIZE DUP3 MSTORE RETURNDATASIZE PUSH1 0x0 PUSH1 0x20 DUP5 ADD RETURNDATACOPY PUSH2 0x1082 JUMP JUMPDEST PUSH1 0x60 SWAP2 POP JUMPDEST POP SWAP2 POP SWAP2 POP DUP2 DUP1 ISZERO PUSH2 0x10AC JUMPI POP DUP1 MLOAD ISZERO DUP1 PUSH2 0x10AC JUMPI POP DUP1 DUP1 PUSH1 0x20 ADD SWAP1 MLOAD DUP2 ADD SWAP1 PUSH2 0x10AC SWAP2 SWAP1 PUSH2 0x11A7 JUMP JUMPDEST PUSH2 0x10C8 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x285 SWAP1 PUSH2 0x1448 JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1103 JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH2 0x110E DUP2 PUSH2 0x16D9 JUMP JUMPDEST SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x111E DUP2 PUSH2 0x16F1 JUMP JUMPDEST SWAP2 POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH2 0x112E DUP2 PUSH2 0x16F1 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x20 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x114B JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB DUP1 DUP3 GT ISZERO PUSH2 0x1161 JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 DUP6 ADD SWAP2 POP DUP6 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x1174 JUMPI DUP4 DUP5 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x1182 JUMPI DUP5 DUP6 REVERT JUMPDEST DUP7 PUSH1 0x20 DUP1 DUP4 MUL DUP6 ADD ADD GT ISZERO PUSH2 0x1195 JUMPI DUP5 DUP6 REVERT JUMPDEST PUSH1 0x20 SWAP3 SWAP1 SWAP3 ADD SWAP7 SWAP2 SWAP6 POP SWAP1 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x11B8 JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x11C3 DUP2 PUSH2 0x16F1 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x11DB JUMPI DUP1 DUP2 REVERT JUMPDEST DUP2 MLOAD PUSH2 0x11C3 DUP2 PUSH2 0x16D9 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x11F7 JUMPI DUP1 DUP2 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x120F JUMPI DUP1 DUP2 REVERT JUMPDEST POP MLOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1228 JUMPI DUP2 DUP3 REVERT JUMPDEST DUP3 CALLDATALOAD SWAP2 POP PUSH1 0x20 DUP4 ADD CALLDATALOAD PUSH2 0x123A DUP2 PUSH2 0x16D9 JUMP JUMPDEST DUP1 SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x125C JUMPI DUP1 DUP2 REVERT JUMPDEST DUP6 CALLDATALOAD SWAP5 POP PUSH1 0x20 DUP7 ADD CALLDATALOAD PUSH2 0x126E DUP2 PUSH2 0x16D9 JUMP JUMPDEST SWAP4 POP PUSH1 0x40 DUP7 ADD CALLDATALOAD PUSH2 0x127E DUP2 PUSH2 0x16D9 JUMP JUMPDEST SWAP5 SWAP8 SWAP4 SWAP7 POP SWAP4 SWAP5 PUSH1 0x60 DUP2 ADD CALLDATALOAD SWAP5 POP PUSH1 0x80 ADD CALLDATALOAD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x12AA JUMPI DUP3 DUP4 REVERT JUMPDEST DUP4 CALLDATALOAD SWAP3 POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH2 0x12BC DUP2 PUSH2 0x16D9 JUMP JUMPDEST SWAP3 SWAP6 SWAP3 SWAP5 POP POP POP PUSH1 0x40 SWAP2 SWAP1 SWAP2 ADD CALLDATALOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x12DF JUMPI DUP2 DUP3 REVERT JUMPDEST POP POP DUP1 CALLDATALOAD SWAP3 PUSH1 0x20 SWAP1 SWAP2 ADD CALLDATALOAD SWAP2 POP JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 MLOAD DUP2 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1316 JUMPI PUSH1 0x20 DUP2 DUP7 ADD DUP2 ADD MLOAD DUP6 DUP4 ADD MSTORE ADD PUSH2 0x12FC JUMP JUMPDEST DUP2 DUP2 GT ISZERO PUSH2 0x1324 JUMPI DUP3 DUP3 DUP6 ADD MSTORE JUMPDEST POP SWAP2 SWAP1 SWAP2 ADD SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 DUP3 MSTORE DUP4 MLOAD SWAP1 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x0 SWAP1 PUSH1 0x20 SWAP1 PUSH1 0x60 DUP5 ADD SWAP1 DUP3 DUP8 ADD DUP5 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x139E JUMPI DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 MSTORE SWAP3 DUP5 ADD SWAP3 SWAP1 DUP5 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x1379 JUMP JUMPDEST POP POP POP DUP4 DUP2 SUB DUP3 DUP6 ADD MSTORE DUP1 DUP6 MLOAD PUSH2 0x13B5 DUP2 DUP5 PUSH2 0x1698 JUMP JUMPDEST SWAP2 POP DUP4 DUP8 ADD SWAP3 POP DUP5 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x13DF JUMPI PUSH2 0x13D1 DUP4 DUP6 MLOAD PUSH2 0x12EE JUMP JUMPDEST SWAP4 DUP6 ADD SWAP4 SWAP3 POP PUSH1 0x1 ADD PUSH2 0x13BE JUMP JUMPDEST POP SWAP1 SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x15 SWAP1 DUP3 ADD MSTORE PUSH21 0x426F72696E674D6174683A20556E646572666C6F77 PUSH1 0x58 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x13 SWAP1 DUP3 ADD MSTORE PUSH19 0x506F6F6C20616C726561647920657869737473 PUSH1 0x68 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1C SWAP1 DUP3 ADD MSTORE PUSH32 0x426F72696E6745524332303A205472616E73666572206661696C656400000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x21 SWAP1 DUP3 ADD MSTORE PUSH32 0x4F6E6C79204D4356322063616E2063616C6C20746869732066756E6374696F6E PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x17 PUSH1 0xF9 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x15 SWAP1 DUP3 ADD MSTORE PUSH21 0x4F776E61626C653A207A65726F2061646472657373 PUSH1 0x58 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1C SWAP1 DUP3 ADD MSTORE PUSH32 0x426F72696E674D6174683A2075696E74313238204F766572666C6F7700000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x18 SWAP1 DUP3 ADD MSTORE PUSH32 0x426F72696E674D6174683A20416464204F766572666C6F770000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C657220213D2070656E64696E67206F776E6572 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1B SWAP1 DUP3 ADD MSTORE PUSH32 0x426F72696E674D6174683A2075696E743634204F766572666C6F770000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x18 SWAP1 DUP3 ADD MSTORE PUSH32 0x426F72696E674D6174683A204D756C204F766572666C6F770000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST DUP2 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND DUP2 MSTORE PUSH1 0x20 DUP1 DUP4 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB SWAP1 DUP2 AND SWAP2 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 SWAP3 DUP4 ADD MLOAD AND SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB SWAP4 SWAP1 SWAP4 AND DUP4 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB SWAP2 DUP3 AND PUSH1 0x20 DUP5 ADD MSTORE AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP2 DUP3 MSTORE PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0x40 SHL SUB SWAP4 SWAP1 SWAP4 AND DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0x80 SHL SUB AND PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x16EE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x16EE JUMPI PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 JUMPDEST MUL 0xE6 PUSH31 0x50616308DE8A2A0EA092220CBB6BAB154C4C12313CE97766220AC5F864736F PUSH13 0x634300060C0033000000000000 ", + "sourceMap": "399:6863:9:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;774:472:1;;;;;;:::i;:::-;;:::i;:::-;;3557:97:9;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1186:45;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;4645:263::-;;;;;;:::i;:::-;;:::i;1521:28::-;;;:::i;5117:798::-;;;;;;:::i;:::-;;:::i;1295:348:1:-;;;:::i;6460:799:9:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;6093:188::-;;;;;;:::i;:::-;;:::i;1238:24::-;;;;;;:::i;:::-;;:::i;3903:508::-;;;;;;:::i;:::-;;:::i;2247:670::-;;;;;;:::i;:::-;;:::i;350:20:1:-;;;:::i;:::-;;;;;;;:::i;1326:66:9:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;2927:415::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;397:27:1:-;;;:::i;774:472::-;1746:5;;-1:-1:-1;;;;;1746:5:1;1732:10;:19;1724:64;;;;-1:-1:-1;;;1724:64:1;;;;;;;:::i;:::-;;;;;;;;;879:6:::1;875:364;;;-1:-1:-1::0;;;;;933:22:1;::::1;::::0;::::1;::::0;:34:::1;;;959:8;933:34;925:68;;;;-1:-1:-1::0;;;925:68:1::1;;;;;;;:::i;:::-;1060:5;::::0;;1039:37:::1;::::0;-1:-1:-1;;;;;1039:37:1;;::::1;::::0;1060:5;::::1;::::0;1039:37:::1;::::0;::::1;1091:5;:16:::0;;-1:-1:-1;;;;;1091:16:1;::::1;-1:-1:-1::0;;;;;;1091:16:1;;::::1;;::::0;;;;1122:25;;;;::::1;::::0;;875:364:::1;;;1204:12;:23:::0;;-1:-1:-1;;;;;;1204:23:1::1;-1:-1:-1::0;;;;;1204:23:1;::::1;;::::0;;875:364:::1;774:472:::0;;;:::o;3557:97:9:-;3633:7;:14;;3557:97::o;1186:45::-;;;;;;;;;;;;-1:-1:-1;;;;;1186:45:9;;;-1:-1:-1;;;;;;;;1186:45:9;;;;;-1:-1:-1;;;1186:45:9;;;;:::o;4645:263::-;1746:5:1;;-1:-1:-1;;;;;1746:5:1;1732:10;:19;1724:64;;;;-1:-1:-1;;;1724:64:1;;;;;;;:::i;:::-;4758:14:9::1;::::0;;;:8:::1;:14;::::0;;;;:25;4738:15:::1;::::0;:63:::1;::::0;4789:11;;4738:46:::1;::::0;-1:-1:-1;;;4758:25:9;::::1;-1:-1:-1::0;;;;;4758:25:9::1;4738:19;:46::i;:::-;:50:::0;::::1;:63::i;:::-;4720:15;:81:::0;4839:18:::1;:11:::0;:16:::1;:18::i;:::-;4811:14;::::0;;;:8:::1;:14;::::0;;;;;;:46;;-1:-1:-1;;;;;4811:46:9;;;::::1;-1:-1:-1::0;;;4811:46:9::1;-1:-1:-1::0;;;;;4811:46:9;;::::1;::::0;;;::::1;::::0;;;4872:29;4820:4;;4872:29:::1;::::0;::::1;::::0;4889:11;;4872:29:::1;:::i;:::-;;;;;;;;4645:263:::0;;:::o;1521:28::-;;;;:::o;5117:798::-;5189:15;5216:20;;:::i;:::-;-1:-1:-1;5239:14:9;;;;:8;:14;;;;;;;;5216:37;;;;;;;;;-1:-1:-1;;;;;5216:37:9;;;;;-1:-1:-1;;;;;;;;5216:37:9;;;;;;;;-1:-1:-1;;;5216:37:9;;;;;;;;;;5287:14;;;:8;:14;;;;;;-1:-1:-1;;;;;5287:21:9;;;;;;;;;;5345;;5395:41;;-1:-1:-1;;;5395:41:9;;5216:37;;5287:21;;5318:48;;;;;5239:14;;5408:13;5395:35;;;;;;:41;;5248:4;;5395:41;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;5395:51:9;;5447:13;5395:66;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5376:85;;5490:4;:20;;;-1:-1:-1;;;;;5475:35:9;:12;:35;:52;;;;-1:-1:-1;5514:13:9;;;5475:52;5471:340;;;5543:14;5560:38;5577:4;:20;;;-1:-1:-1;;;;;5560:38:9;:12;:16;;:38;;;;:::i;:::-;5543:55;;5612:19;5683:15;;5634:46;5664:4;:15;;;-1:-1:-1;;;;;5634:46:9;:25;5645:13;;5634:6;:10;;:25;;;;:::i;:::-;:29;;:46::i;:::-;:64;;;;;;;-1:-1:-1;5731:69:9;5791:8;5752:36;5634:64;1602:4;5752:15;:36::i;:::-;:47;;;;;5731:16;;5752:47;;5731:20;:69::i;:::-;5712:88;;5471:340;;;5892:15;;;;5831:11;;5830:78;;5892:15;1602:4;;5831:33;;5847:16;5831:15;:33::i;:::-;:55;;;;;;;5830:61;:78::i;:::-;5820:88;5117:798;-1:-1:-1;;;;;;;5117:798:9:o;1295:348:1:-;1363:12;;-1:-1:-1;;;;;1363:12:1;1423:10;:27;;1415:72;;;;-1:-1:-1;;;1415:72:1;;;;;;;:::i;:::-;1546:5;;;1525:42;;-1:-1:-1;;;;;1525:42:1;;;;1546:5;;;1525:42;;;1578:5;:21;;-1:-1:-1;;;;;1578:21:1;;;-1:-1:-1;;;;;;1578:21:1;;;;;;;1610:25;;;;;;;1295:348::o;6460:799:9:-;6509:20;;:::i;:::-;-1:-1:-1;6548:13:9;;;;:8;:13;;;;;;;;;6541:20;;;;;;;;;-1:-1:-1;;;;;6541:20:9;;;;-1:-1:-1;;;;;;;;6541:20:9;;;;;;;;;;-1:-1:-1;;;6541:20:9;;;;;;;;;;;6575:12;:35;6571:682;;;6645:40;;-1:-1:-1;;;6645:40:9;;6626:16;;-1:-1:-1;;;;;6658:13:9;6645:35;;;;:40;;6681:3;;6645:40;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;6645:50:9;;6696:13;6645:65;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6626:84;-1:-1:-1;6729:12:9;;6725:336;;6761:14;6778:38;6795:4;:20;;;-1:-1:-1;;;;;6778:38:9;:12;:16;;:38;;;;:::i;:::-;6761:55;;6834:19;6905:15;;6856:46;6886:4;:15;;;-1:-1:-1;;;;;6856:46:9;:25;6867:13;;6856:6;:10;;:25;;;;:::i;:46::-;:64;;;;;;;-1:-1:-1;6962:84:9;6988:57;7028:8;6989:36;6856:64;1602:4;6989:15;:36::i;:::-;:47;;;;;;6988:55;:57::i;:::-;6962:21;;-1:-1:-1;;;;;6962:25:9;;;:84::i;:::-;-1:-1:-1;;;;;6938:108:9;;;-1:-1:-1;;6725:336:9;7097:19;:12;:17;:19::i;:::-;-1:-1:-1;;;;;7074:42:9;;;:20;;;;:42;;;7130:13;;;;:8;:13;;;;;;;;:20;;;;;;;;;;-1:-1:-1;;;;;;7130:20:9;;;-1:-1:-1;;;;;7130:20:9;;;-1:-1:-1;;;;7130:20:9;-1:-1:-1;;;7130:20:9;;;;;-1:-1:-1;;;;;7130:20:9;-1:-1:-1;;;7130:20:9;;;;;;;;;;;;;;7169:73;7130:13;;7169:73;;;;7130:20;;7210:8;;7169:73;:::i;:::-;;;;;;;;6571:682;;6460:799;;;:::o;6093:188::-;6176:4;6162:11;6197:78;6221:3;6217:1;:7;6197:78;;;6245:19;6256:4;;6261:1;6256:7;;;;;;;;;;;;;6245:10;:19::i;:::-;-1:-1:-1;6226:3:9;;6197:78;;;;6093:188;;;:::o;1238:24::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1238:24:9;:::o;3903:508::-;1746:5:1;;-1:-1:-1;;;;;1746:5:1;1732:10;:19;1724:64;;;;-1:-1:-1;;;1724:64:1;;;;;;;:::i;:::-;3985:14:9::1;::::0;;;:8:::1;:14;::::0;;;;:30;-1:-1:-1;;;3985:30:9;::::1;-1:-1:-1::0;;;;;3985:30:9::1;:35:::0;3977:67:::1;;;;-1:-1:-1::0;;;3977:67:9::1;;;;;;;:::i;:::-;4120:15;::::0;4080:12:::1;::::0;4120:31:::1;::::0;4140:10;4120:19:::1;:31::i;:::-;4102:15;:49:::0;4179:149:::1;::::0;;::::1;::::0;::::1;::::0;;;-1:-1:-1;4179:149:9;;::::1;::::0;::::1;4262:22;:15:::0;:20:::1;:22::i;:::-;-1:-1:-1::0;;;;;4179:149:9::1;;;;;4214:17;:10;:15;:17::i;:::-;-1:-1:-1::0;;;;;4179:149:9;;::::1;::::0;;;4162:14:::1;::::0;;;:8:::1;:14;::::0;;;;;;;:166;;;;;;::::1;::::0;;;::::1;::::0;;::::1;-1:-1:-1::0;;;4162:166:9::1;-1:-1:-1::0;;;;;4162:166:9;;;::::1;-1:-1:-1::0;;;4162:166:9::1;-1:-1:-1::0;;;;;;;;;4162:166:9;;::::1;-1:-1:-1::0;;;;;;4162:166:9;;::::1;::::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;4338:7:::1;:18:::0;;4162:166;4338:18;::::1;::::0;;;;;::::1;::::0;;;4371:33;4171:4;;4371:33:::1;::::0;::::1;::::0;4393:10;;4371:33:::1;:::i;:::-;;;;;;;;1799:1:1;3903:508:9::0;;:::o;2247:670::-;3397:10;-1:-1:-1;;;;;3411:13:9;3397:27;;3376:107;;;;-1:-1:-1;;;3376:107:9;;;;;;;:::i;:::-;2374:20:::1;;:::i;:::-;2397:15;2408:3;2397:10;:15::i;:::-;2422:21;2446:13:::0;;;:8:::1;:13;::::0;;;;;;;-1:-1:-1;;;;;2446:20:9;::::1;::::0;;;;;;;2505:11;;2374:38;;-1:-1:-1;2446:20:9;2505:15;2501:244:::1;;2650:15;::::0;::::1;::::0;2579:21;;2563:11;;2562:121:::1;::::0;2650:15;1602:4:::1;::::0;2563:38:::1;::::0;-1:-1:-1;;;;;2563:38:9::1;:15;:38::i;2562:121::-;2536:147:::0;-1:-1:-1;2697:37:9::1;-1:-1:-1::0;;;;;2697:11:9::1;:24;2722:2:::0;2536:147;2697:24:::1;:37::i;:::-;2754:21:::0;;;2815;;1602:4:::1;::::0;2803:34:::1;::::0;2768:7;;-1:-1:-1;;;;;2803:34:9::1;:11;:34::i;:::-;:56;;;;;;2785:4;:15;;:74;;;;2907:2;-1:-1:-1::0;;;;;2874:36:9::1;2893:3;2886:5;-1:-1:-1::0;;;;;2874:36:9::1;;2898:7;2874:36;;;;;;:::i;:::-;;;;;;;;3493:1;;;2247:670:::0;;;;;:::o;350:20:1:-;;;-1:-1:-1;;;;;350:20:1;;:::o;1326:66:9:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2927:415::-;3117:15;;;3130:1;3117:15;;;;;;;;;3013:28;;;;;;3117:15;;;;;;;;;;;-1:-1:-1;3117:15:9;3085:47;;3162:11;3142:13;3156:1;3142:16;;;;;;;;-1:-1:-1;;;;;3142:32:9;;;;:16;;;;;;;;;;;:32;3218:16;;;3232:1;3218:16;;;;;;;;;3184:31;;3218:16;;;;;;;;;;;;-1:-1:-1;3218:16:9;3184:50;;3264:23;3277:3;3282:4;3264:12;:23::i;:::-;3244:14;3259:1;3244:17;;;;;;;;;;;;;;;;;:43;3305:13;;;;-1:-1:-1;2927:415:9;-1:-1:-1;;;;2927:415:9:o;397:27:1:-;;;-1:-1:-1;;;;;397:27:1;;:::o;342:122:4:-;425:5;;;420:16;;;;412:50;;;;-1:-1:-1;;;412:50:4;;;;;;;:::i;:::-;342:122;;;;:::o;211:125::-;294:5;;;289:16;;;;281:53;;;;-1:-1:-1;;;281:53:4;;;;;;;:::i;780:156::-;828:8;-1:-1:-1;;;;;857:15:4;;;849:55;;;;-1:-1:-1;;;849:55:4;;;;;;;:::i;:::-;-1:-1:-1;926:1:4;780:156::o;470:137::-;528:9;548:6;;;:28;;-1:-1:-1;;563:5:4;;;575:1;570;563:5;570:1;558:13;;;;;:18;548:28;540:65;;;;-1:-1:-1;;;540:65:4;;;;;;;:::i;613:161::-;662:9;-1:-1:-1;;;;;692:16:4;;;684:57;;;;-1:-1:-1;;;684:57:4;;;;;;;:::i;1134:125::-;1217:5;;;-1:-1:-1;;;;;1212:16:4;;;;;;;;1204:53;;;;-1:-1:-1;;;1204:53:4;;;;;;;:::i;951:304:3:-;1036:12;1050:17;1079:5;-1:-1:-1;;;;;1071:19:3;1114:10;1126:2;1130:6;1091:46;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1091:46:3;;;;;;;;;;;1071:67;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1035:103;;;;1157:7;:57;;;;-1:-1:-1;1169:11:3;;:16;;:44;;;1200:4;1189:24;;;;;;;;;;;;:::i;:::-;1149:98;;;;-1:-1:-1;;;1149:98:3;;;;;;;:::i;:::-;951:304;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1233:479::-;;;;1365:2;1353:9;1344:7;1340:23;1336:32;1333:2;;;-1:-1;;1371:12;1333:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;1423:63;-1:-1;1523:2;1559:22;;584:20;609:30;584:20;609:30;:::i;:::-;1531:60;-1:-1;1628:2;1664:22;;584:20;609:30;584:20;609:30;:::i;:::-;1636:60;;;;1327:385;;;;;:::o;1719:397::-;;;1858:2;1846:9;1837:7;1833:23;1829:32;1826:2;;;-1:-1;;1864:12;1826:2;1922:17;1909:31;-1:-1;;;;;1960:18;1952:6;1949:30;1946:2;;;-1:-1;;1982:12;1946:2;2083:6;2072:9;2068:22;;;290:3;283:4;275:6;271:17;267:27;257:2;;-1:-1;;298:12;257:2;341:6;328:20;1960:18;360:6;357:30;354:2;;;-1:-1;;390:12;354:2;485:3;1858:2;;469:6;465:17;426:6;451:32;;448:41;445:2;;;-1:-1;;492:12;445:2;1858;422:17;;;;;2002:98;;-1:-1;1820:296;;-1:-1;;;;1820:296::o;2123:257::-;;2235:2;2223:9;2214:7;2210:23;2206:32;2203:2;;;-1:-1;;2241:12;2203:2;732:6;726:13;744:30;768:5;744:30;:::i;:::-;2293:71;2197:183;-1:-1;;;2197:183::o;2387:291::-;;2516:2;2504:9;2495:7;2491:23;2487:32;2484:2;;;-1:-1;;2522:12;2484:2;884:6;878:13;896:47;937:5;896:47;:::i;2685:241::-;;2789:2;2777:9;2768:7;2764:23;2760:32;2757:2;;;-1:-1;;2795:12;2757:2;-1:-1;1022:20;;2751:175;-1:-1;2751:175::o;2933:263::-;;3048:2;3036:9;3027:7;3023:23;3019:32;3016:2;;;-1:-1;;3054:12;3016:2;-1:-1;1170:13;;3010:186;-1:-1;3010:186::o;3203:366::-;;;3324:2;3312:9;3303:7;3299:23;3295:32;3292:2;;;-1:-1;;3330:12;3292:2;1035:6;1022:20;3382:63;;3482:2;3525:9;3521:22;72:20;97:33;124:5;97:33;:::i;:::-;3490:63;;;;3286:283;;;;;:::o;3576:743::-;;;;;;3748:3;3736:9;3727:7;3723:23;3719:33;3716:2;;;-1:-1;;3755:12;3716:2;1035:6;1022:20;3807:63;;3907:2;3950:9;3946:22;72:20;97:33;124:5;97:33;:::i;:::-;3915:63;-1:-1;4015:2;4054:22;;72:20;97:33;72:20;97:33;:::i;:::-;3710:609;;;;-1:-1;4023:63;;4123:2;4162:22;;1022:20;;-1:-1;4231:3;4271:22;1022:20;;3710:609;-1:-1;;3710:609::o;4326:491::-;;;;4464:2;4452:9;4443:7;4439:23;4435:32;4432:2;;;-1:-1;;4470:12;4432:2;1035:6;1022:20;4522:63;;4622:2;4665:9;4661:22;72:20;97:33;124:5;97:33;:::i;:::-;4426:391;;4630:63;;-1:-1;;;4730:2;4769:22;;;;1022:20;;4426:391::o;4824:366::-;;;4945:2;4933:9;4924:7;4920:23;4916:32;4913:2;;;-1:-1;;4951:12;4913:2;-1:-1;;1022:20;;;5103:2;5142:22;;;1022:20;;-1:-1;4907:283::o;5408:173::-;12645:37;;5570:4;5561:14;;5488:93::o;13038:271::-;;7405:5;21441:12;-1:-1;23902:101;23916:6;23913:1;23910:13;23902:101;;;7549:4;23983:11;;;;;23977:18;23964:11;;;23957:39;23931:10;23902:101;;;24018:6;24015:1;24012:13;24009:2;;;-1:-1;24074:6;24069:3;24065:16;24058:27;24009:2;-1:-1;7580:16;;;;;13172:137;-1:-1;;13172:137::o;13316:222::-;-1:-1;;;;;23181:54;;;;5660:37;;13443:2;13428:18;;13414:124::o;13545:333::-;-1:-1;;;;;23181:54;;;;5660:37;;13864:2;13849:18;;12645:37;13700:2;13685:18;;13671:207::o;13885:657::-;14154:2;14168:47;;;21441:12;;14139:18;;;22117:19;;;13885:657;;22166:4;;22157:14;;;;21123;;;13885:657;6198:288;6223:6;6220:1;6217:13;6198:288;;;6284:13;;-1:-1;;;;;23181:54;7683:64;;5379:14;;;;21857;;;;1960:18;6238:9;6198:288;;;6202:14;;;14399:9;14393:4;14389:20;22166:4;14373:9;14369:18;14362:48;14424:108;6740:5;21441:12;6759:86;6838:6;6833:3;6759:86;:::i;:::-;6752:93;;22166:4;6916:5;21123:14;6928:21;;-1:-1;6955:260;6980:6;6977:1;6974:13;6955:260;;;7068:63;7127:3;7047:6;7041:13;7068:63;:::i;:::-;21857:14;;;;7061:70;-1:-1;6245:1;6995:9;6955:260;;;-1:-1;14416:116;;14125:417;-1:-1;;;;;;;14125:417::o;14549:416::-;14749:2;14763:47;;;7984:2;14734:18;;;22117:19;-1:-1;;;22157:14;;;8000:44;8063:12;;;14720:245::o;14972:416::-;15172:2;15186:47;;;8314:2;15157:18;;;22117:19;-1:-1;;;22157:14;;;8330:42;8391:12;;;15143:245::o;15395:416::-;15595:2;15609:47;;;8642:2;15580:18;;;22117:19;8678:30;22157:14;;;8658:51;8728:12;;;15566:245::o;15818:416::-;16018:2;16032:47;;;8979:2;16003:18;;;22117:19;9015:34;22157:14;;;8995:55;-1:-1;;;9070:12;;;9063:25;9107:12;;;15989:245::o;16241:416::-;16441:2;16455:47;;;9358:2;16426:18;;;22117:19;-1:-1;;;22157:14;;;9374:44;9437:12;;;16412:245::o;16664:416::-;16864:2;16878:47;;;9688:2;16849:18;;;22117:19;9724:30;22157:14;;;9704:51;9774:12;;;16835:245::o;17087:416::-;17287:2;17301:47;;;10025:2;17272:18;;;22117:19;10061:26;22157:14;;;10041:47;10107:12;;;17258:245::o;17510:416::-;17710:2;17724:47;;;17695:18;;;22117:19;10394:34;22157:14;;;10374:55;10448:12;;;17681:245::o;17933:416::-;18133:2;18147:47;;;18118:18;;;22117:19;10735:34;22157:14;;;10715:55;10789:12;;;18104:245::o;18356:416::-;18556:2;18570:47;;;11040:2;18541:18;;;22117:19;11076:29;22157:14;;;11056:50;11125:12;;;18527:245::o;18779:416::-;18979:2;18993:47;;;11376:2;18964:18;;;22117:19;11412:26;22157:14;;;11392:47;11458:12;;;18950:245::o;19202:326::-;11780:23;;-1:-1;;;;;23061:46;12282:37;;11962:4;11951:16;;;11945:23;-1:-1;;;;;23387:30;;;12020:14;;;12873:36;;;;12120:4;12109:16;;;12103:23;23387:30;12178:14;;;12873:36;;;;19381:2;19366:18;;19352:176::o;19535:436::-;-1:-1;;;;;23061:46;;;;12282:37;;-1:-1;;;;;23387:30;;;19876:2;19861:18;;12873:36;23387:30;19957:2;19942:18;;12873:36;19714:2;19699:18;;19685:286::o;19978:222::-;12645:37;;;20105:2;20090:18;;20076:124::o;20207:333::-;12645:37;;;20526:2;20511:18;;12645:37;20362:2;20347:18;;20333:207::o;20547:440::-;-1:-1;;;;;23387:30;;;;12873:36;;20890:2;20875:18;;12645:37;;;;-1:-1;;;;;23061:46;20973:2;20958:18;;12522:50;20728:2;20713:18;;20699:288::o;24106:117::-;-1:-1;;;;;23181:54;;24165:35;;24155:2;;24214:1;;24204:12;24155:2;24149:74;:::o;24230:111::-;24311:5;22861:13;22854:21;24289:5;24286:32;24276:2;;24332:1;;24322:12" + }, + "gasEstimates": { + "creation": { + "codeDepositCost": "1188200", + "executionCost": "infinite", + "totalCost": "infinite" + }, + "external": { + "add(uint256,uint256)": "infinite", + "claimOwnership()": "45089", + "massUpdatePools(uint256[])": "infinite", + "onSushiReward(uint256,address,address,uint256,uint256)": "infinite", + "owner()": "1092", + "pendingOwner()": "1158", + "pendingToken(uint256,address)": "infinite", + "pendingTokens(uint256,address,uint256)": "infinite", + "poolIds(uint256)": "2041", + "poolInfo(uint256)": "1411", + "poolLength()": "1074", + "set(uint256,uint256)": "infinite", + "tokenPerBlock()": "1051", + "transferOwnership(address,bool,bool)": "infinite", + "updatePool(uint256)": "infinite", + "userInfo(uint256,address)": "2226" + } + }, + "methodIdentifiers": { + "add(uint256,uint256)": "771602f7", + "claimOwnership()": "4e71e0c8", + "massUpdatePools(uint256[])": "57a5b58c", + "onSushiReward(uint256,address,address,uint256,uint256)": "8bf63742", + "owner()": "8da5cb5b", + "pendingOwner()": "e30c3978", + "pendingToken(uint256,address)": "48e43af4", + "pendingTokens(uint256,address,uint256)": "d63b3c49", + "poolIds(uint256)": "69883b4e", + "poolInfo(uint256)": "1526fe27", + "poolLength()": "081e3eda", + "set(uint256,uint256)": "1ab06ee5", + "tokenPerBlock()": "4198709a", + "transferOwnership(address,bool,bool)": "078dfbe7", + "updatePool(uint256)": "51eb05a6", + "userInfo(uint256,address)": "93f1a40b" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"_rewardToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_tokenPerBlock\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_MASTERCHEF_V2\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"LogInit\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"pid\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"LogOnReward\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"pid\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"allocPoint\",\"type\":\"uint256\"}],\"name\":\"LogPoolAddition\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"pid\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"allocPoint\",\"type\":\"uint256\"}],\"name\":\"LogSetPool\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"pid\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"lastRewardBlock\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"lpSupply\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"accSushiPerShare\",\"type\":\"uint256\"}],\"name\":\"LogUpdatePool\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"allocPoint\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_pid\",\"type\":\"uint256\"}],\"name\":\"add\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"claimOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"pids\",\"type\":\"uint256[]\"}],\"name\":\"massUpdatePools\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"pid\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_user\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lpToken\",\"type\":\"uint256\"}],\"name\":\"onSushiReward\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pendingOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_pid\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_user\",\"type\":\"address\"}],\"name\":\"pendingToken\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"pending\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"pid\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"pendingTokens\",\"outputs\":[{\"internalType\":\"contract IERC20[]\",\"name\":\"rewardTokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"rewardAmounts\",\"type\":\"uint256[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"poolIds\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"poolInfo\",\"outputs\":[{\"internalType\":\"uint128\",\"name\":\"accSushiPerShare\",\"type\":\"uint128\"},{\"internalType\":\"uint64\",\"name\":\"lastRewardBlock\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"allocPoint\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"poolLength\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"pools\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_pid\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_allocPoint\",\"type\":\"uint256\"}],\"name\":\"set\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"tokenPerBlock\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"direct\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"renounce\",\"type\":\"bool\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"pid\",\"type\":\"uint256\"}],\"name\":\"updatePool\",\"outputs\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"accSushiPerShare\",\"type\":\"uint128\"},{\"internalType\":\"uint64\",\"name\":\"lastRewardBlock\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"allocPoint\",\"type\":\"uint64\"}],\"internalType\":\"struct ComplexRewarder.PoolInfo\",\"name\":\"pool\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"userInfo\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rewardDebt\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"@0xKeno\",\"kind\":\"dev\",\"methods\":{\"add(uint256,uint256)\":{\"params\":{\"_pid\":\"Pid on MCV2\",\"allocPoint\":\"AP of the new pool.\"}},\"massUpdatePools(uint256[])\":{\"params\":{\"pids\":\"Pool IDs of all to be updated. Make sure to update all active pools.\"}},\"pendingToken(uint256,address)\":{\"params\":{\"_pid\":\"The index of the pool. See `poolInfo`.\",\"_user\":\"Address of user.\"},\"returns\":{\"pending\":\"SUSHI reward for a given user.\"}},\"set(uint256,uint256)\":{\"params\":{\"_allocPoint\":\"New AP of the pool.\",\"_pid\":\"The index of the pool. See `poolInfo`.\"}},\"updatePool(uint256)\":{\"params\":{\"pid\":\"The index of the pool. See `poolInfo`.\"},\"returns\":{\"pool\":\"Returns the pool that was updated.\"}}},\"stateVariables\":{\"totalAllocPoint\":{\"details\":\"Total allocation points. Must be the sum of all allocation points in all pools.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"add(uint256,uint256)\":{\"notice\":\"Add a new LP to the pool. Can only be called by the owner. DO NOT add the same LP token more than once. Rewards will be messed up if you do.\"},\"massUpdatePools(uint256[])\":{\"notice\":\"Update reward variables for all pools. Be careful of gas spending!\"},\"pendingToken(uint256,address)\":{\"notice\":\"View function to see pending Token\"},\"poolInfo(uint256)\":{\"notice\":\"Info of each pool.\"},\"poolLength()\":{\"notice\":\"Returns the number of MCV2 pools.\"},\"set(uint256,uint256)\":{\"notice\":\"Update the given pool's SUSHI allocation point and `IRewarder` contract. Can only be called by the owner.\"},\"updatePool(uint256)\":{\"notice\":\"Update reward variables of the given pool.\"},\"userInfo(uint256,address)\":{\"notice\":\"Info of each user that stakes LP tokens.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/ComplexRewarder.sol\":\"ComplexRewarder\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@boringcrypto/boring-solidity/contracts/BoringBatchable.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\r\\n// Audit on 5-Jan-2021 by Keno and BoringCrypto\\r\\n\\r\\n// P1 - P3: OK\\r\\npragma solidity 0.6.12;\\r\\npragma experimental ABIEncoderV2;\\r\\n// solhint-disable avoid-low-level-calls\\r\\n\\r\\nimport \\\"./libraries/BoringERC20.sol\\\";\\r\\n\\r\\n// T1 - T4: OK\\r\\ncontract BaseBoringBatchable {\\r\\n function _getRevertMsg(bytes memory _returnData) internal pure returns (string memory) {\\r\\n // If the _res length is less than 68, then the transaction failed silently (without a revert message)\\r\\n if (_returnData.length < 68) return \\\"Transaction reverted silently\\\";\\r\\n\\r\\n assembly {\\r\\n // Slice the sighash.\\r\\n _returnData := add(_returnData, 0x04)\\r\\n }\\r\\n return abi.decode(_returnData, (string)); // All that remains is the revert string\\r\\n } \\r\\n \\r\\n // F3 - F9: OK\\r\\n // F1: External is ok here because this is the batch function, adding it to a batch makes no sense\\r\\n // F2: Calls in the batch may be payable, delegatecall operates in the same context, so each call in the batch has access to msg.value\\r\\n // C1 - C21: OK\\r\\n // C3: The length of the loop is fully under user control, so can't be exploited\\r\\n // C7: Delegatecall is only used on the same contract, so it's safe\\r\\n function batch(bytes[] calldata calls, bool revertOnFail) external payable returns(bool[] memory successes, bytes[] memory results) {\\r\\n // Interactions\\r\\n successes = new bool[](calls.length);\\r\\n results = new bytes[](calls.length);\\r\\n for (uint256 i = 0; i < calls.length; i++) {\\r\\n (bool success, bytes memory result) = address(this).delegatecall(calls[i]);\\r\\n require(success || !revertOnFail, _getRevertMsg(result));\\r\\n successes[i] = success;\\r\\n results[i] = result;\\r\\n }\\r\\n }\\r\\n}\\r\\n\\r\\n// T1 - T4: OK\\r\\ncontract BoringBatchable is BaseBoringBatchable {\\r\\n // F1 - F9: OK\\r\\n // F6: Parameters can be used front-run the permit and the user's permit will fail (due to nonce or other revert)\\r\\n // if part of a batch this could be used to grief once as the second call would not need the permit\\r\\n // C1 - C21: OK\\r\\n function permitToken(IERC20 token, address from, address to, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public {\\r\\n // Interactions\\r\\n // X1 - X5\\r\\n token.permit(from, to, amount, deadline, v, r, s);\\r\\n }\\r\\n}\",\"keccak256\":\"0xe0b0316b015447ee28c6b7d96c4347b410a66e5d26e922ef3bcccc22f3b4d590\",\"license\":\"UNLICENSED\"},\"@boringcrypto/boring-solidity/contracts/BoringOwnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\n// Audit on 5-Jan-2021 by Keno and BoringCrypto\\r\\n\\r\\n// P1 - P3: OK\\r\\npragma solidity 0.6.12;\\r\\n\\r\\n// Source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol + Claimable.sol\\r\\n// Edited by BoringCrypto\\r\\n\\r\\n// T1 - T4: OK\\r\\ncontract BoringOwnableData {\\r\\n // V1 - V5: OK\\r\\n address public owner;\\r\\n // V1 - V5: OK\\r\\n address public pendingOwner;\\r\\n}\\r\\n\\r\\n// T1 - T4: OK\\r\\ncontract BoringOwnable is BoringOwnableData {\\r\\n // E1: OK\\r\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\r\\n\\r\\n constructor () public {\\r\\n owner = msg.sender;\\r\\n emit OwnershipTransferred(address(0), msg.sender);\\r\\n }\\r\\n\\r\\n // F1 - F9: OK\\r\\n // C1 - C21: OK\\r\\n function transferOwnership(address newOwner, bool direct, bool renounce) public onlyOwner {\\r\\n if (direct) {\\r\\n // Checks\\r\\n require(newOwner != address(0) || renounce, \\\"Ownable: zero address\\\");\\r\\n\\r\\n // Effects\\r\\n emit OwnershipTransferred(owner, newOwner);\\r\\n owner = newOwner;\\r\\n pendingOwner = address(0);\\r\\n } else {\\r\\n // Effects\\r\\n pendingOwner = newOwner;\\r\\n }\\r\\n }\\r\\n\\r\\n // F1 - F9: OK\\r\\n // C1 - C21: OK\\r\\n function claimOwnership() public {\\r\\n address _pendingOwner = pendingOwner;\\r\\n \\r\\n // Checks\\r\\n require(msg.sender == _pendingOwner, \\\"Ownable: caller != pending owner\\\");\\r\\n\\r\\n // Effects\\r\\n emit OwnershipTransferred(owner, _pendingOwner);\\r\\n owner = _pendingOwner;\\r\\n pendingOwner = address(0);\\r\\n }\\r\\n\\r\\n // M1 - M5: OK\\r\\n // C1 - C21: OK\\r\\n modifier onlyOwner() {\\r\\n require(msg.sender == owner, \\\"Ownable: caller is not the owner\\\");\\r\\n _;\\r\\n }\\r\\n}\",\"keccak256\":\"0xfafb586b248c1c697227f5745397562cfe5be2f04e19fb80fc79fc94e3afaba1\",\"license\":\"MIT\"},\"@boringcrypto/boring-solidity/contracts/interfaces/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\npragma solidity 0.6.12;\\r\\n\\r\\ninterface IERC20 {\\r\\n function totalSupply() external view returns (uint256);\\r\\n function balanceOf(address account) external view returns (uint256);\\r\\n function allowance(address owner, address spender) external view returns (uint256);\\r\\n function approve(address spender, uint256 amount) external returns (bool);\\r\\n event Transfer(address indexed from, address indexed to, uint256 value);\\r\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\r\\n\\r\\n // EIP 2612\\r\\n function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;\\r\\n}\",\"keccak256\":\"0x8004f86e4536cca55b8eeb2621fe18e1ee57d779396ddef50bce5bf70fb59867\",\"license\":\"MIT\"},\"@boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\r\\npragma solidity 0.6.12;\\r\\n\\r\\nimport \\\"../interfaces/IERC20.sol\\\";\\r\\n\\r\\nlibrary BoringERC20 {\\r\\n function safeSymbol(IERC20 token) internal view returns(string memory) {\\r\\n (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(0x95d89b41));\\r\\n return success && data.length > 0 ? abi.decode(data, (string)) : \\\"???\\\";\\r\\n }\\r\\n\\r\\n function safeName(IERC20 token) internal view returns(string memory) {\\r\\n (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(0x06fdde03));\\r\\n return success && data.length > 0 ? abi.decode(data, (string)) : \\\"???\\\";\\r\\n }\\r\\n\\r\\n function safeDecimals(IERC20 token) internal view returns (uint8) {\\r\\n (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(0x313ce567));\\r\\n return success && data.length == 32 ? abi.decode(data, (uint8)) : 18;\\r\\n }\\r\\n\\r\\n function safeTransfer(IERC20 token, address to, uint256 amount) internal {\\r\\n (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(0xa9059cbb, to, amount));\\r\\n require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: Transfer failed\\\");\\r\\n }\\r\\n\\r\\n function safeTransferFrom(IERC20 token, address from, address to, uint256 amount) internal {\\r\\n (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(0x23b872dd, from, to, amount));\\r\\n require(success && (data.length == 0 || abi.decode(data, (bool))), \\\"BoringERC20: TransferFrom failed\\\");\\r\\n }\\r\\n}\",\"keccak256\":\"0x69f1ccf716991e5d6d64dc0e3bc3828fd1990bc18400d680b1aa1960675daaaa\",\"license\":\"UNLICENSED\"},\"@boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\r\\npragma solidity 0.6.12;\\r\\n// a library for performing overflow-safe math, updated with awesomeness from of DappHub (https://github.com/dapphub/ds-math)\\r\\nlibrary BoringMath {\\r\\n function add(uint256 a, uint256 b) internal pure returns (uint256 c) {require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");}\\r\\n function sub(uint256 a, uint256 b) internal pure returns (uint256 c) {require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");}\\r\\n function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {require(b == 0 || (c = a * b)/b == a, \\\"BoringMath: Mul Overflow\\\");}\\r\\n function to128(uint256 a) internal pure returns (uint128 c) {\\r\\n require(a <= uint128(-1), \\\"BoringMath: uint128 Overflow\\\");\\r\\n c = uint128(a);\\r\\n }\\r\\n function to64(uint256 a) internal pure returns (uint64 c) {\\r\\n require(a <= uint64(-1), \\\"BoringMath: uint64 Overflow\\\");\\r\\n c = uint64(a);\\r\\n }\\r\\n function to32(uint256 a) internal pure returns (uint32 c) {\\r\\n require(a <= uint32(-1), \\\"BoringMath: uint32 Overflow\\\");\\r\\n c = uint32(a);\\r\\n }\\r\\n}\\r\\n\\r\\nlibrary BoringMath128 {\\r\\n function add(uint128 a, uint128 b) internal pure returns (uint128 c) {require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");}\\r\\n function sub(uint128 a, uint128 b) internal pure returns (uint128 c) {require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");}\\r\\n}\\r\\n\\r\\nlibrary BoringMath64 {\\r\\n function add(uint64 a, uint64 b) internal pure returns (uint64 c) {require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");}\\r\\n function sub(uint64 a, uint64 b) internal pure returns (uint64 c) {require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");}\\r\\n}\\r\\n\\r\\nlibrary BoringMath32 {\\r\\n function add(uint32 a, uint32 b) internal pure returns (uint32 c) {require((c = a + b) >= b, \\\"BoringMath: Add Overflow\\\");}\\r\\n function sub(uint32 a, uint32 b) internal pure returns (uint32 c) {require((c = a - b) <= a, \\\"BoringMath: Underflow\\\");}\\r\\n}\",\"keccak256\":\"0x2d0e99483c5618251d4b52e8551918253bf044c63e0d09a2f1f652671f9ff762\",\"license\":\"MIT\"},\"contracts/MasterChefV2.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\n\\nimport \\\"@boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol\\\";\\nimport \\\"@boringcrypto/boring-solidity/contracts/BoringBatchable.sol\\\";\\nimport \\\"@boringcrypto/boring-solidity/contracts/BoringOwnable.sol\\\";\\nimport \\\"./libraries/SignedSafeMath.sol\\\";\\nimport \\\"./interfaces/IRewarder.sol\\\";\\nimport \\\"./interfaces/IMasterChef.sol\\\";\\n\\ninterface IMigratorChef {\\n // Take the current LP token address and return the new LP token address.\\n // Migrator should have full access to the caller's LP token.\\n function migrate(IERC20 token) external returns (IERC20);\\n}\\n\\n/// @notice The (older) MasterChef contract gives out a constant number of SUSHI tokens per block.\\n/// It is the only address with minting rights for SUSHI.\\n/// The idea for this MasterChef V2 (MCV2) contract is therefore to be the owner of a dummy token\\n/// that is deposited into the MasterChef V1 (MCV1) contract.\\n/// The allocation point for this pool on MCV1 is the total allocation point for all pools that receive double incentives.\\ncontract MasterChefV2 is BoringOwnable, BoringBatchable {\\n using BoringMath for uint256;\\n using BoringMath128 for uint128;\\n using BoringERC20 for IERC20;\\n using SignedSafeMath for int256;\\n\\n /// @notice Info of each MCV2 user.\\n /// `amount` LP token amount the user has provided.\\n /// `rewardDebt` The amount of SUSHI entitled to the user.\\n struct UserInfo {\\n uint256 amount;\\n int256 rewardDebt;\\n }\\n\\n /// @notice Info of each MCV2 pool.\\n /// `allocPoint` The amount of allocation points assigned to the pool.\\n /// Also known as the amount of SUSHI to distribute per block.\\n struct PoolInfo {\\n uint128 accSushiPerShare;\\n uint64 lastRewardBlock;\\n uint64 allocPoint;\\n }\\n\\n /// @notice Address of MCV1 contract.\\n IMasterChef public immutable MASTER_CHEF;\\n /// @notice Address of SUSHI contract.\\n IERC20 public immutable SUSHI;\\n /// @notice The index of MCV2 master pool in MCV1.\\n uint256 public immutable MASTER_PID;\\n // @notice The migrator contract. It has a lot of power. Can only be set through governance (owner).\\n IMigratorChef public migrator;\\n\\n /// @notice Info of each MCV2 pool.\\n PoolInfo[] public poolInfo;\\n /// @notice Address of the LP token for each MCV2 pool.\\n IERC20[] public lpToken;\\n /// @notice Address of each `IRewarder` contract in MCV2.\\n IRewarder[] public rewarder;\\n\\n /// @notice Info of each user that stakes LP tokens.\\n mapping (uint256 => mapping (address => UserInfo)) public userInfo;\\n /// @dev Total allocation points. Must be the sum of all allocation points in all pools.\\n uint256 public totalAllocPoint;\\n\\n uint256 private constant MASTERCHEF_SUSHI_PER_BLOCK = 1e20;\\n uint256 private constant ACC_SUSHI_PRECISION = 1e12;\\n\\n event Deposit(address indexed user, uint256 indexed pid, uint256 amount, address indexed to);\\n event Withdraw(address indexed user, uint256 indexed pid, uint256 amount, address indexed to);\\n event EmergencyWithdraw(address indexed user, uint256 indexed pid, uint256 amount, address indexed to);\\n event Harvest(address indexed user, uint256 indexed pid, uint256 amount);\\n event LogPoolAddition(uint256 indexed pid, uint256 allocPoint, IERC20 indexed lpToken, IRewarder indexed rewarder);\\n event LogSetPool(uint256 indexed pid, uint256 allocPoint, IRewarder indexed rewarder, bool overwrite);\\n event LogUpdatePool(uint256 indexed pid, uint64 lastRewardBlock, uint256 lpSupply, uint256 accSushiPerShare);\\n event LogInit();\\n\\n /// @param _MASTER_CHEF The SushiSwap MCV1 contract address.\\n /// @param _sushi The SUSHI token contract address.\\n /// @param _MASTER_PID The pool ID of the dummy token on the base MCV1 contract.\\n constructor(IMasterChef _MASTER_CHEF, IERC20 _sushi, uint256 _MASTER_PID) public {\\n MASTER_CHEF = _MASTER_CHEF;\\n SUSHI = _sushi;\\n MASTER_PID = _MASTER_PID;\\n }\\n\\n /// @notice Deposits a dummy token to `MASTER_CHEF` MCV1. This is required because MCV1 holds the minting rights for SUSHI.\\n /// Any balance of transaction sender in `dummyToken` is transferred.\\n /// The allocation point for the pool on MCV1 is the total allocation point for all pools that receive double incentives.\\n /// @param dummyToken The address of the ERC-20 token to deposit into MCV1.\\n function init(IERC20 dummyToken) external {\\n uint256 balance = dummyToken.balanceOf(msg.sender);\\n require(balance != 0, \\\"MasterChefV2: Balance must exceed 0\\\");\\n dummyToken.safeTransferFrom(msg.sender, address(this), balance);\\n dummyToken.approve(address(MASTER_CHEF), balance);\\n MASTER_CHEF.deposit(MASTER_PID, balance);\\n emit LogInit();\\n }\\n\\n /// @notice Returns the number of MCV2 pools.\\n function poolLength() public view returns (uint256 pools) {\\n pools = poolInfo.length;\\n }\\n\\n /// @notice Add a new LP to the pool. Can only be called by the owner.\\n /// DO NOT add the same LP token more than once. Rewards will be messed up if you do.\\n /// @param allocPoint AP of the new pool.\\n /// @param _lpToken Address of the LP ERC-20 token.\\n /// @param _rewarder Address of the rewarder delegate.\\n function add(uint256 allocPoint, IERC20 _lpToken, IRewarder _rewarder) public onlyOwner {\\n uint256 lastRewardBlock = block.number;\\n totalAllocPoint = totalAllocPoint.add(allocPoint);\\n lpToken.push(_lpToken);\\n rewarder.push(_rewarder);\\n\\n poolInfo.push(PoolInfo({\\n allocPoint: allocPoint.to64(),\\n lastRewardBlock: lastRewardBlock.to64(),\\n accSushiPerShare: 0\\n }));\\n emit LogPoolAddition(lpToken.length.sub(1), allocPoint, _lpToken, _rewarder);\\n }\\n\\n /// @notice Update the given pool's SUSHI allocation point and `IRewarder` contract. Can only be called by the owner.\\n /// @param _pid The index of the pool. See `poolInfo`.\\n /// @param _allocPoint New AP of the pool.\\n /// @param _rewarder Address of the rewarder delegate.\\n /// @param overwrite True if _rewarder should be `set`. Otherwise `_rewarder` is ignored.\\n function set(uint256 _pid, uint256 _allocPoint, IRewarder _rewarder, bool overwrite) public onlyOwner {\\n totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add(_allocPoint);\\n poolInfo[_pid].allocPoint = _allocPoint.to64();\\n if (overwrite) { rewarder[_pid] = _rewarder; }\\n emit LogSetPool(_pid, _allocPoint, overwrite ? _rewarder : rewarder[_pid], overwrite);\\n }\\n\\n /// @notice Set the `migrator` contract. Can only be called by the owner.\\n /// @param _migrator The contract address to set.\\n function setMigrator(IMigratorChef _migrator) public onlyOwner {\\n migrator = _migrator;\\n }\\n\\n /// @notice Migrate LP token to another LP contract through the `migrator` contract.\\n /// @param _pid The index of the pool. See `poolInfo`.\\n function migrate(uint256 _pid) public {\\n require(address(migrator) != address(0), \\\"MasterChefV2: no migrator set\\\");\\n IERC20 _lpToken = lpToken[_pid];\\n uint256 bal = _lpToken.balanceOf(address(this));\\n _lpToken.approve(address(migrator), bal);\\n IERC20 newLpToken = migrator.migrate(_lpToken);\\n require(bal == newLpToken.balanceOf(address(this)), \\\"MasterChefV2: migrated balance must match\\\");\\n lpToken[_pid] = newLpToken;\\n }\\n\\n /// @notice View function to see pending SUSHI on frontend.\\n /// @param _pid The index of the pool. See `poolInfo`.\\n /// @param _user Address of user.\\n /// @return pending SUSHI reward for a given user.\\n function pendingSushi(uint256 _pid, address _user) external view returns (uint256 pending) {\\n PoolInfo memory pool = poolInfo[_pid];\\n UserInfo storage user = userInfo[_pid][_user];\\n uint256 accSushiPerShare = pool.accSushiPerShare;\\n uint256 lpSupply = lpToken[_pid].balanceOf(address(this));\\n if (block.number > pool.lastRewardBlock && lpSupply != 0) {\\n uint256 blocks = block.number.sub(pool.lastRewardBlock);\\n uint256 sushiReward = blocks.mul(sushiPerBlock()).mul(pool.allocPoint) / totalAllocPoint;\\n accSushiPerShare = accSushiPerShare.add(sushiReward.mul(ACC_SUSHI_PRECISION) / lpSupply);\\n }\\n pending = int256(user.amount.mul(accSushiPerShare) / ACC_SUSHI_PRECISION).sub(user.rewardDebt).toUInt256();\\n }\\n\\n /// @notice Update reward variables for all pools. Be careful of gas spending!\\n /// @param pids Pool IDs of all to be updated. Make sure to update all active pools.\\n function massUpdatePools(uint256[] calldata pids) external {\\n uint256 len = pids.length;\\n for (uint256 i = 0; i < len; ++i) {\\n updatePool(pids[i]);\\n }\\n }\\n\\n /// @notice Calculates and returns the `amount` of SUSHI per block.\\n function sushiPerBlock() public view returns (uint256 amount) {\\n amount = uint256(MASTERCHEF_SUSHI_PER_BLOCK)\\n .mul(MASTER_CHEF.poolInfo(MASTER_PID).allocPoint) / MASTER_CHEF.totalAllocPoint();\\n }\\n\\n /// @notice Update reward variables of the given pool.\\n /// @param pid The index of the pool. See `poolInfo`.\\n /// @return pool Returns the pool that was updated.\\n function updatePool(uint256 pid) public returns (PoolInfo memory pool) {\\n pool = poolInfo[pid];\\n if (block.number > pool.lastRewardBlock) {\\n uint256 lpSupply = lpToken[pid].balanceOf(address(this));\\n if (lpSupply > 0) {\\n uint256 blocks = block.number.sub(pool.lastRewardBlock);\\n uint256 sushiReward = blocks.mul(sushiPerBlock()).mul(pool.allocPoint) / totalAllocPoint;\\n pool.accSushiPerShare = pool.accSushiPerShare.add((sushiReward.mul(ACC_SUSHI_PRECISION) / lpSupply).to128());\\n }\\n pool.lastRewardBlock = block.number.to64();\\n poolInfo[pid] = pool;\\n emit LogUpdatePool(pid, pool.lastRewardBlock, lpSupply, pool.accSushiPerShare);\\n }\\n }\\n\\n /// @notice Deposit LP tokens to MCV2 for SUSHI allocation.\\n /// @param pid The index of the pool. See `poolInfo`.\\n /// @param amount LP token amount to deposit.\\n /// @param to The receiver of `amount` deposit benefit.\\n function deposit(uint256 pid, uint256 amount, address to) public {\\n PoolInfo memory pool = updatePool(pid);\\n UserInfo storage user = userInfo[pid][to];\\n\\n // Effects\\n user.amount = user.amount.add(amount);\\n user.rewardDebt = user.rewardDebt.add(int256(amount.mul(pool.accSushiPerShare) / ACC_SUSHI_PRECISION));\\n\\n // Interactions\\n IRewarder _rewarder = rewarder[pid];\\n if (address(_rewarder) != address(0)) {\\n _rewarder.onSushiReward(pid, to, to, 0, user.amount);\\n }\\n\\n lpToken[pid].safeTransferFrom(msg.sender, address(this), amount);\\n\\n emit Deposit(msg.sender, pid, amount, to);\\n }\\n\\n /// @notice Withdraw LP tokens from MCV2.\\n /// @param pid The index of the pool. See `poolInfo`.\\n /// @param amount LP token amount to withdraw.\\n /// @param to Receiver of the LP tokens.\\n function withdraw(uint256 pid, uint256 amount, address to) public {\\n PoolInfo memory pool = updatePool(pid);\\n UserInfo storage user = userInfo[pid][msg.sender];\\n\\n // Effects\\n user.rewardDebt = user.rewardDebt.sub(int256(amount.mul(pool.accSushiPerShare) / ACC_SUSHI_PRECISION));\\n user.amount = user.amount.sub(amount);\\n\\n // Interactions\\n IRewarder _rewarder = rewarder[pid];\\n if (address(_rewarder) != address(0)) {\\n _rewarder.onSushiReward(pid, msg.sender, to, 0, user.amount);\\n }\\n \\n lpToken[pid].safeTransfer(to, amount);\\n\\n emit Withdraw(msg.sender, pid, amount, to);\\n }\\n\\n /// @notice Harvest proceeds for transaction sender to `to`.\\n /// @param pid The index of the pool. See `poolInfo`.\\n /// @param to Receiver of SUSHI rewards.\\n function harvest(uint256 pid, address to) public {\\n PoolInfo memory pool = updatePool(pid);\\n UserInfo storage user = userInfo[pid][msg.sender];\\n int256 accumulatedSushi = int256(user.amount.mul(pool.accSushiPerShare) / ACC_SUSHI_PRECISION);\\n uint256 _pendingSushi = accumulatedSushi.sub(user.rewardDebt).toUInt256();\\n\\n // Effects\\n user.rewardDebt = accumulatedSushi;\\n\\n // Interactions\\n if (_pendingSushi != 0) {\\n SUSHI.safeTransfer(to, _pendingSushi);\\n }\\n \\n IRewarder _rewarder = rewarder[pid];\\n if (address(_rewarder) != address(0)) {\\n _rewarder.onSushiReward( pid, msg.sender, to, _pendingSushi, user.amount);\\n }\\n\\n emit Harvest(msg.sender, pid, _pendingSushi);\\n }\\n \\n /// @notice Withdraw LP tokens from MCV2 and harvest proceeds for transaction sender to `to`.\\n /// @param pid The index of the pool. See `poolInfo`.\\n /// @param amount LP token amount to withdraw.\\n /// @param to Receiver of the LP tokens and SUSHI rewards.\\n function withdrawAndHarvest(uint256 pid, uint256 amount, address to) public {\\n PoolInfo memory pool = updatePool(pid);\\n UserInfo storage user = userInfo[pid][msg.sender];\\n int256 accumulatedSushi = int256(user.amount.mul(pool.accSushiPerShare) / ACC_SUSHI_PRECISION);\\n uint256 _pendingSushi = accumulatedSushi.sub(user.rewardDebt).toUInt256();\\n\\n // Effects\\n user.rewardDebt = accumulatedSushi.sub(int256(amount.mul(pool.accSushiPerShare) / ACC_SUSHI_PRECISION));\\n user.amount = user.amount.sub(amount);\\n \\n // Interactions\\n SUSHI.safeTransfer(to, _pendingSushi);\\n\\n IRewarder _rewarder = rewarder[pid];\\n if (address(_rewarder) != address(0)) {\\n _rewarder.onSushiReward(pid, msg.sender, to, _pendingSushi, user.amount);\\n }\\n\\n lpToken[pid].safeTransfer(to, amount);\\n\\n emit Withdraw(msg.sender, pid, amount, to);\\n emit Harvest(msg.sender, pid, _pendingSushi);\\n }\\n\\n /// @notice Harvests SUSHI from `MASTER_CHEF` MCV1 and pool `MASTER_PID` to this MCV2 contract.\\n function harvestFromMasterChef() public {\\n MASTER_CHEF.deposit(MASTER_PID, 0);\\n }\\n\\n /// @notice Withdraw without caring about rewards. EMERGENCY ONLY.\\n /// @param pid The index of the pool. See `poolInfo`.\\n /// @param to Receiver of the LP tokens.\\n function emergencyWithdraw(uint256 pid, address to) public {\\n UserInfo storage user = userInfo[pid][msg.sender];\\n uint256 amount = user.amount;\\n user.amount = 0;\\n user.rewardDebt = 0;\\n\\n IRewarder _rewarder = rewarder[pid];\\n if (address(_rewarder) != address(0)) {\\n _rewarder.onSushiReward(pid, msg.sender, to, 0, 0);\\n }\\n\\n // Note: transfer can fail or succeed if `amount` is zero.\\n lpToken[pid].safeTransfer(to, amount);\\n emit EmergencyWithdraw(msg.sender, pid, amount, to);\\n }\\n}\\n\",\"keccak256\":\"0x2048c5e7b174e2f8f931045df32b1d56f09f488cfac3c87632b9730e0aba9bc3\",\"license\":\"MIT\"},\"contracts/interfaces/IMasterChef.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\nimport \\\"@boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol\\\";\\n\\ninterface IMasterChef {\\n using BoringERC20 for IERC20;\\n struct UserInfo {\\n uint256 amount; // How many LP tokens the user has provided.\\n uint256 rewardDebt; // Reward debt. See explanation below.\\n }\\n\\n struct PoolInfo {\\n IERC20 lpToken; // Address of LP token contract.\\n uint256 allocPoint; // How many allocation points assigned to this pool. SUSHI to distribute per block.\\n uint256 lastRewardBlock; // Last block number that SUSHI distribution occurs.\\n uint256 accSushiPerShare; // Accumulated SUSHI per share, times 1e12. See below.\\n }\\n\\n function poolInfo(uint256 pid) external view returns (IMasterChef.PoolInfo memory);\\n function totalAllocPoint() external view returns (uint256);\\n function deposit(uint256 _pid, uint256 _amount) external;\\n}\\n\",\"keccak256\":\"0xbbb2138d7b8be86b5d0bed347ab7f6d2d3e66043393abc882ad37a75fdd860d3\",\"license\":\"MIT\"},\"contracts/interfaces/IRewarder.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.6.12;\\nimport \\\"@boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol\\\";\\ninterface IRewarder {\\n using BoringERC20 for IERC20;\\n function onSushiReward(uint256 pid, address user, address recipient, uint256 sushiAmount, uint256 newLpAmount) external;\\n function pendingTokens(uint256 pid, address user, uint256 sushiAmount) external returns (IERC20[] memory, uint256[] memory);\\n}\\n\",\"keccak256\":\"0xf9fa549b5fe5d156c908a3ca612b1acd219666dbadc195d9bea4dd34d3cec94a\",\"license\":\"MIT\"},\"contracts/libraries/SignedSafeMath.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.6.12;\\n\\nlibrary SignedSafeMath {\\n int256 constant private _INT256_MIN = -2**255;\\n\\n /**\\n * @dev Returns the multiplication of two signed integers, reverting on\\n * overflow.\\n *\\n * Counterpart to Solidity's `*` operator.\\n *\\n * Requirements:\\n *\\n * - Multiplication cannot overflow.\\n */\\n function mul(int256 a, int256 b) internal pure returns (int256) {\\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\\n // benefit is lost if 'b' is also tested.\\n // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\\n if (a == 0) {\\n return 0;\\n }\\n\\n require(!(a == -1 && b == _INT256_MIN), \\\"SignedSafeMath: multiplication overflow\\\");\\n\\n int256 c = a * b;\\n require(c / a == b, \\\"SignedSafeMath: multiplication overflow\\\");\\n\\n return c;\\n }\\n\\n /**\\n * @dev Returns the integer division of two signed integers. Reverts on\\n * division by zero. The result is rounded towards zero.\\n *\\n * Counterpart to Solidity's `/` operator. Note: this function uses a\\n * `revert` opcode (which leaves remaining gas untouched) while Solidity\\n * uses an invalid opcode to revert (consuming all remaining gas).\\n *\\n * Requirements:\\n *\\n * - The divisor cannot be zero.\\n */\\n function div(int256 a, int256 b) internal pure returns (int256) {\\n require(b != 0, \\\"SignedSafeMath: division by zero\\\");\\n require(!(b == -1 && a == _INT256_MIN), \\\"SignedSafeMath: division overflow\\\");\\n\\n int256 c = a / b;\\n\\n return c;\\n }\\n\\n /**\\n * @dev Returns the subtraction of two signed integers, reverting on\\n * overflow.\\n *\\n * Counterpart to Solidity's `-` operator.\\n *\\n * Requirements:\\n *\\n * - Subtraction cannot overflow.\\n */\\n function sub(int256 a, int256 b) internal pure returns (int256) {\\n int256 c = a - b;\\n require((b >= 0 && c <= a) || (b < 0 && c > a), \\\"SignedSafeMath: subtraction overflow\\\");\\n\\n return c;\\n }\\n\\n /**\\n * @dev Returns the addition of two signed integers, reverting on\\n * overflow.\\n *\\n * Counterpart to Solidity's `+` operator.\\n *\\n * Requirements:\\n *\\n * - Addition cannot overflow.\\n */\\n function add(int256 a, int256 b) internal pure returns (int256) {\\n int256 c = a + b;\\n require((b >= 0 && c >= a) || (b < 0 && c < a), \\\"SignedSafeMath: addition overflow\\\");\\n\\n return c;\\n }\\n\\n function toUInt256(int256 a) internal pure returns (uint256) {\\n require(a >= 0, \\\"Integer < 0\\\");\\n return uint256(a);\\n }\\n}\",\"keccak256\":\"0x4991beb21b224dfcdc3d251e0a60fdc304d4f6b699b2c35d08f3974e5b84c86a\",\"license\":\"MIT\"},\"contracts/mocks/ComplexRewarder.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.6.12;\\npragma experimental ABIEncoderV2;\\nimport \\\"../interfaces/IRewarder.sol\\\";\\nimport \\\"@boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol\\\";\\nimport \\\"@boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol\\\";\\nimport \\\"@boringcrypto/boring-solidity/contracts/BoringOwnable.sol\\\";\\nimport \\\"../MasterChefV2.sol\\\";\\n\\n/// @author @0xKeno\\ncontract ComplexRewarder is IRewarder, BoringOwnable{\\n using BoringMath for uint256;\\n using BoringMath128 for uint128;\\n using BoringERC20 for IERC20;\\n\\n IERC20 private immutable rewardToken;\\n\\n /// @notice Info of each MCV2 user.\\n /// `amount` LP token amount the user has provided.\\n /// `rewardDebt` The amount of SUSHI entitled to the user.\\n struct UserInfo {\\n uint256 amount;\\n uint256 rewardDebt;\\n }\\n\\n /// @notice Info of each MCV2 pool.\\n /// `allocPoint` The amount of allocation points assigned to the pool.\\n /// Also known as the amount of SUSHI to distribute per block.\\n struct PoolInfo {\\n uint128 accSushiPerShare;\\n uint64 lastRewardBlock;\\n uint64 allocPoint;\\n }\\n\\n /// @notice Info of each pool.\\n mapping (uint256 => PoolInfo) public poolInfo;\\n\\n uint256[] public poolIds;\\n\\n /// @notice Info of each user that stakes LP tokens.\\n mapping (uint256 => mapping (address => UserInfo)) public userInfo;\\n /// @dev Total allocation points. Must be the sum of all allocation points in all pools.\\n uint256 totalAllocPoint;\\n\\n uint256 public tokenPerBlock;\\n uint256 private constant ACC_TOKEN_PRECISION = 1e12;\\n\\n address private immutable MASTERCHEF_V2;\\n\\n event LogOnReward(address indexed user, uint256 indexed pid, uint256 amount, address indexed to);\\n event LogPoolAddition(uint256 indexed pid, uint256 allocPoint);\\n event LogSetPool(uint256 indexed pid, uint256 allocPoint);\\n event LogUpdatePool(uint256 indexed pid, uint64 lastRewardBlock, uint256 lpSupply, uint256 accSushiPerShare);\\n event LogInit();\\n\\n constructor (IERC20 _rewardToken, uint256 _tokenPerBlock, address _MASTERCHEF_V2) public {\\n rewardToken = _rewardToken;\\n tokenPerBlock = _tokenPerBlock;\\n MASTERCHEF_V2 = _MASTERCHEF_V2;\\n }\\n\\n\\n function onSushiReward (uint256 pid, address _user, address to, uint256, uint256 lpToken) onlyMCV2 override external {\\n PoolInfo memory pool = updatePool(pid);\\n UserInfo storage user = userInfo[pid][_user];\\n uint256 pending;\\n if (user.amount > 0) {\\n pending =\\n (user.amount.mul(pool.accSushiPerShare) / ACC_TOKEN_PRECISION).sub(\\n user.rewardDebt\\n );\\n rewardToken.safeTransfer(to, pending);\\n }\\n user.amount = lpToken;\\n user.rewardDebt = lpToken.mul(pool.accSushiPerShare) / ACC_TOKEN_PRECISION;\\n emit LogOnReward(_user, pid, pending, to);\\n }\\n \\n function pendingTokens(uint256 pid, address user, uint256) override external returns (IERC20[] memory rewardTokens, uint256[] memory rewardAmounts) {\\n IERC20[] memory _rewardTokens = new IERC20[](1);\\n _rewardTokens[0] = (rewardToken);\\n uint256[] memory _rewardAmounts = new uint256[](1);\\n _rewardAmounts[0] = pendingToken(pid, user);\\n return (_rewardTokens, _rewardAmounts);\\n }\\n\\n modifier onlyMCV2 {\\n require(\\n msg.sender == MASTERCHEF_V2,\\n \\\"Only MCV2 can call this function.\\\"\\n );\\n _;\\n }\\n\\n /// @notice Returns the number of MCV2 pools.\\n function poolLength() public view returns (uint256 pools) {\\n pools = poolIds.length;\\n }\\n\\n /// @notice Add a new LP to the pool. Can only be called by the owner.\\n /// DO NOT add the same LP token more than once. Rewards will be messed up if you do.\\n /// @param allocPoint AP of the new pool.\\n /// @param _pid Pid on MCV2\\n function add(uint256 allocPoint, uint256 _pid) public onlyOwner {\\n require(poolInfo[_pid].lastRewardBlock == 0, \\\"Pool already exists\\\");\\n uint256 lastRewardBlock = block.number;\\n totalAllocPoint = totalAllocPoint.add(allocPoint);\\n\\n poolInfo[_pid] = PoolInfo({\\n allocPoint: allocPoint.to64(),\\n lastRewardBlock: lastRewardBlock.to64(),\\n accSushiPerShare: 0\\n });\\n poolIds.push(_pid);\\n emit LogPoolAddition(_pid, allocPoint);\\n }\\n\\n /// @notice Update the given pool's SUSHI allocation point and `IRewarder` contract. Can only be called by the owner.\\n /// @param _pid The index of the pool. See `poolInfo`.\\n /// @param _allocPoint New AP of the pool.\\n function set(uint256 _pid, uint256 _allocPoint) public onlyOwner {\\n totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add(_allocPoint);\\n poolInfo[_pid].allocPoint = _allocPoint.to64();\\n emit LogSetPool(_pid, _allocPoint);\\n }\\n\\n /// @notice View function to see pending Token\\n /// @param _pid The index of the pool. See `poolInfo`.\\n /// @param _user Address of user.\\n /// @return pending SUSHI reward for a given user.\\n function pendingToken(uint256 _pid, address _user) public view returns (uint256 pending) {\\n PoolInfo memory pool = poolInfo[_pid];\\n UserInfo storage user = userInfo[_pid][_user];\\n uint256 accSushiPerShare = pool.accSushiPerShare;\\n uint256 lpSupply = MasterChefV2(MASTERCHEF_V2).lpToken(_pid).balanceOf(MASTERCHEF_V2);\\n if (block.number > pool.lastRewardBlock && lpSupply != 0) {\\n uint256 blocks = block.number.sub(pool.lastRewardBlock);\\n uint256 sushiReward = blocks.mul(tokenPerBlock).mul(pool.allocPoint) / totalAllocPoint;\\n accSushiPerShare = accSushiPerShare.add(sushiReward.mul(ACC_TOKEN_PRECISION) / lpSupply);\\n }\\n pending = (user.amount.mul(accSushiPerShare) / ACC_TOKEN_PRECISION).sub(user.rewardDebt);\\n }\\n\\n /// @notice Update reward variables for all pools. Be careful of gas spending!\\n /// @param pids Pool IDs of all to be updated. Make sure to update all active pools.\\n function massUpdatePools(uint256[] calldata pids) external {\\n uint256 len = pids.length;\\n for (uint256 i = 0; i < len; ++i) {\\n updatePool(pids[i]);\\n }\\n }\\n\\n /// @notice Update reward variables of the given pool.\\n /// @param pid The index of the pool. See `poolInfo`.\\n /// @return pool Returns the pool that was updated.\\n function updatePool(uint256 pid) public returns (PoolInfo memory pool) {\\n pool = poolInfo[pid];\\n if (block.number > pool.lastRewardBlock) {\\n uint256 lpSupply = MasterChefV2(MASTERCHEF_V2).lpToken(pid).balanceOf(MASTERCHEF_V2);\\n\\n if (lpSupply > 0) {\\n uint256 blocks = block.number.sub(pool.lastRewardBlock);\\n uint256 sushiReward = blocks.mul(tokenPerBlock).mul(pool.allocPoint) / totalAllocPoint;\\n pool.accSushiPerShare = pool.accSushiPerShare.add((sushiReward.mul(ACC_TOKEN_PRECISION) / lpSupply).to128());\\n }\\n pool.lastRewardBlock = block.number.to64();\\n poolInfo[pid] = pool;\\n emit LogUpdatePool(pid, pool.lastRewardBlock, lpSupply, pool.accSushiPerShare);\\n }\\n }\\n\\n}\",\"keccak256\":\"0xfacc62575e2a6b8894e3bc2b031ddeaa2547dd2d84523f678a1a8876ef8831a2\",\"license\":\"MIT\"}},\"version\":1}", + "storageLayout": { + "storage": [ + { + "astId": 149, + "contract": "contracts/mocks/ComplexRewarder.sol:ComplexRewarder", + "label": "owner", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { + "astId": 151, + "contract": "contracts/mocks/ComplexRewarder.sol:ComplexRewarder", + "label": "pendingOwner", + "offset": 0, + "slot": "1", + "type": "t_address" + }, + { + "astId": 2406, + "contract": "contracts/mocks/ComplexRewarder.sol:ComplexRewarder", + "label": "poolInfo", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_uint256,t_struct(PoolInfo)2401_storage)" + }, + { + "astId": 2409, + "contract": "contracts/mocks/ComplexRewarder.sol:ComplexRewarder", + "label": "poolIds", + "offset": 0, + "slot": "3", + "type": "t_array(t_uint256)dyn_storage" + }, + { + "astId": 2416, + "contract": "contracts/mocks/ComplexRewarder.sol:ComplexRewarder", + "label": "userInfo", + "offset": 0, + "slot": "4", + "type": "t_mapping(t_uint256,t_mapping(t_address,t_struct(UserInfo)2394_storage))" + }, + { + "astId": 2419, + "contract": "contracts/mocks/ComplexRewarder.sol:ComplexRewarder", + "label": "totalAllocPoint", + "offset": 0, + "slot": "5", + "type": "t_uint256" + }, + { + "astId": 2421, + "contract": "contracts/mocks/ComplexRewarder.sol:ComplexRewarder", + "label": "tokenPerBlock", + "offset": 0, + "slot": "6", + "type": "t_uint256" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_uint256)dyn_storage": { + "base": "t_uint256", + "encoding": "dynamic_array", + "label": "uint256[]", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(UserInfo)2394_storage)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => struct ComplexRewarder.UserInfo)", + "numberOfBytes": "32", + "value": "t_struct(UserInfo)2394_storage" + }, + "t_mapping(t_uint256,t_mapping(t_address,t_struct(UserInfo)2394_storage))": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => mapping(address => struct ComplexRewarder.UserInfo))", + "numberOfBytes": "32", + "value": "t_mapping(t_address,t_struct(UserInfo)2394_storage)" + }, + "t_mapping(t_uint256,t_struct(PoolInfo)2401_storage)": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => struct ComplexRewarder.PoolInfo)", + "numberOfBytes": "32", + "value": "t_struct(PoolInfo)2401_storage" + }, + "t_struct(PoolInfo)2401_storage": { + "encoding": "inplace", + "label": "struct ComplexRewarder.PoolInfo", + "members": [ + { + "astId": 2396, + "contract": "contracts/mocks/ComplexRewarder.sol:ComplexRewarder", + "label": "accSushiPerShare", + "offset": 0, + "slot": "0", + "type": "t_uint128" + }, + { + "astId": 2398, + "contract": "contracts/mocks/ComplexRewarder.sol:ComplexRewarder", + "label": "lastRewardBlock", + "offset": 16, + "slot": "0", + "type": "t_uint64" + }, + { + "astId": 2400, + "contract": "contracts/mocks/ComplexRewarder.sol:ComplexRewarder", + "label": "allocPoint", + "offset": 24, + "slot": "0", + "type": "t_uint64" + } + ], + "numberOfBytes": "32" + }, + "t_struct(UserInfo)2394_storage": { + "encoding": "inplace", + "label": "struct ComplexRewarder.UserInfo", + "members": [ + { + "astId": 2391, + "contract": "contracts/mocks/ComplexRewarder.sol:ComplexRewarder", + "label": "amount", + "offset": 0, + "slot": "0", + "type": "t_uint256" + }, + { + "astId": 2393, + "contract": "contracts/mocks/ComplexRewarder.sol:ComplexRewarder", + "label": "rewardDebt", + "offset": 0, + "slot": "1", + "type": "t_uint256" + } + ], + "numberOfBytes": "64" + }, + "t_uint128": { + "encoding": "inplace", + "label": "uint128", + "numberOfBytes": "16" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint64": { + "encoding": "inplace", + "label": "uint64", + "numberOfBytes": "8" + } + } + }, + "userdoc": { + "kind": "user", + "methods": { + "add(uint256,uint256)": { + "notice": "Add a new LP to the pool. Can only be called by the owner. DO NOT add the same LP token more than once. Rewards will be messed up if you do." + }, + "massUpdatePools(uint256[])": { + "notice": "Update reward variables for all pools. Be careful of gas spending!" + }, + "pendingToken(uint256,address)": { + "notice": "View function to see pending Token" + }, + "poolInfo(uint256)": { + "notice": "Info of each pool." + }, + "poolLength()": { + "notice": "Returns the number of MCV2 pools." + }, + "set(uint256,uint256)": { + "notice": "Update the given pool's SUSHI allocation point and `IRewarder` contract. Can only be called by the owner." + }, + "updatePool(uint256)": { + "notice": "Update reward variables of the given pool." + }, + "userInfo(uint256,address)": { + "notice": "Info of each user that stakes LP tokens." + } + }, + "version": 1 + } + } + } + }, + "errors": [ + { + "component": "general", + "errorCode": "5667", + "formattedMessage": "contracts/mocks/RewarderBrokenMock.sol:13:28: Warning: Unused function parameter. Remove or comment out the variable name to silence this warning.\n function pendingTokens(uint256 pid, address user, uint256 sushiAmount ...\n ^---------^\n", + "message": "Unused function parameter. Remove or comment out the variable name to silence this warning.", + "severity": "warning", + "sourceLocation": { + "end": 297, + "file": "contracts/mocks/RewarderBrokenMock.sol", + "start": 286 + }, + "type": "Warning" + }, + { + "component": "general", + "errorCode": "5667", + "formattedMessage": "contracts/mocks/RewarderBrokenMock.sol:13:41: Warning: Unused function parameter. Remove or comment out the variable name to silence this warning.\n ... unction pendingTokens(uint256 pid, address user, uint256 sushiAmount) override ext ...\n ^----------^\n", + "message": "Unused function parameter. Remove or comment out the variable name to silence this warning.", + "severity": "warning", + "sourceLocation": { + "end": 311, + "file": "contracts/mocks/RewarderBrokenMock.sol", + "start": 299 + }, + "type": "Warning" + }, + { + "component": "general", + "errorCode": "5667", + "formattedMessage": "contracts/mocks/RewarderBrokenMock.sol:13:55: Warning: Unused function parameter. Remove or comment out the variable name to silence this warning.\n ... gTokens(uint256 pid, address user, uint256 sushiAmount) override external returns (IERC20 ...\n ^-----------------^\n", + "message": "Unused function parameter. Remove or comment out the variable name to silence this warning.", + "severity": "warning", + "sourceLocation": { + "end": 332, + "file": "contracts/mocks/RewarderBrokenMock.sol", + "start": 313 + }, + "type": "Warning" + }, + { + "component": "general", + "errorCode": "5667", + "formattedMessage": "contracts/mocks/RewarderBrokenMock.sol:13:103: Warning: Unused function parameter. Remove or comment out the variable name to silence this warning.\n ... Amount) override external returns (IERC20[] memory rewardTokens, uint256[] memory rewardAmounts){\n ^--------------------------^\n", + "message": "Unused function parameter. Remove or comment out the variable name to silence this warning.", + "severity": "warning", + "sourceLocation": { + "end": 389, + "file": "contracts/mocks/RewarderBrokenMock.sol", + "start": 361 + }, + "type": "Warning" + }, + { + "component": "general", + "errorCode": "5667", + "formattedMessage": "contracts/mocks/RewarderBrokenMock.sol:13:133: Warning: Unused function parameter. Remove or comment out the variable name to silence this warning.\n ... rns (IERC20[] memory rewardTokens, uint256[] memory rewardAmounts){\n ^----------------------------^\n", + "message": "Unused function parameter. Remove or comment out the variable name to silence this warning.", + "severity": "warning", + "sourceLocation": { + "end": 421, + "file": "contracts/mocks/RewarderBrokenMock.sol", + "start": 391 + }, + "type": "Warning" + }, + { + "component": "general", + "errorCode": "5667", + "formattedMessage": "contracts/mocks/RewarderMock.sol:23:38: Warning: Unused function parameter. Remove or comment out the variable name to silence this warning.\n function onSushiReward (uint256, address user, address to, uint256 sushiAmount, uint256) onlyMCV2 override external {\n ^----------^\n", + "message": "Unused function parameter. Remove or comment out the variable name to silence this warning.", + "severity": "warning", + "sourceLocation": { + "end": 823, + "file": "contracts/mocks/RewarderMock.sol", + "start": 811 + }, + "type": "Warning" + }, + { + "component": "general", + "errorCode": "5667", + "formattedMessage": "contracts/mocks/RewarderMock.sol:33:28: Warning: Unused function parameter. Remove or comment out the variable name to silence this warning.\n function pendingTokens(uint256 pid, address user, uint256 sushiAmount ...\n ^---------^\n", + "message": "Unused function parameter. Remove or comment out the variable name to silence this warning.", + "severity": "warning", + "sourceLocation": { + "end": 1279, + "file": "contracts/mocks/RewarderMock.sol", + "start": 1268 + }, + "type": "Warning" + }, + { + "component": "general", + "errorCode": "5667", + "formattedMessage": "contracts/mocks/RewarderMock.sol:33:41: Warning: Unused function parameter. Remove or comment out the variable name to silence this warning.\n ... unction pendingTokens(uint256 pid, address user, uint256 sushiAmount) override ext ...\n ^----------^\n", + "message": "Unused function parameter. Remove or comment out the variable name to silence this warning.", + "severity": "warning", + "sourceLocation": { + "end": 1293, + "file": "contracts/mocks/RewarderMock.sol", + "start": 1281 + }, + "type": "Warning" + } + ], + "sources": { + "@boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol": { + "ast": { + "absolutePath": "@boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol", + "exportedSymbols": { + "BoringERC20": [ + 553 + ] + }, + "id": 554, + "license": "UNLICENSED", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 339, + "literals": [ + "solidity", + "0.6", + ".12" + ], + "nodeType": "PragmaDirective", + "src": "40:23:3" + }, + { + "absolutePath": "@boringcrypto/boring-solidity/contracts/interfaces/IERC20.sol", + "file": "../interfaces/IERC20.sol", + "id": 340, + "nodeType": "ImportDirective", + "scope": 554, + "sourceUnit": 338, + "src": "67:34:3", + "symbolAliases": [], + "unitAlias": "" + }, + { + "abstract": false, + "baseContracts": [], + "contractDependencies": [], + "contractKind": "library", + "documentation": null, + "fullyImplemented": true, + "id": 553, + "linearizedBaseContracts": [ + 553 + ], + "name": "BoringERC20", + "nodeType": "ContractDefinition", + "nodes": [ + { + "body": { + "id": 378, + "nodeType": "Block", + "src": "203:197:3", + "statements": [ + { + "assignments": [ + 348, + 350 + ], + "declarations": [ + { + "constant": false, + "id": 348, + "mutability": "mutable", + "name": "success", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 378, + "src": "215:12:3", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 347, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "215:4:3", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 350, + "mutability": "mutable", + "name": "data", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 378, + "src": "229:17:3", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 349, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "229:5:3", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "value": null, + "visibility": "internal" + } + ], + "id": 361, + "initialValue": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "30783935643839623431", + "id": 358, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "299:10:3", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_2514000705_by_1", + "typeString": "int_const 2514000705" + }, + "value": "0x95d89b41" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_2514000705_by_1", + "typeString": "int_const 2514000705" + } + ], + "expression": { + "argumentTypes": null, + "id": 356, + "name": "abi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -1, + "src": "276:3:3", + "typeDescriptions": { + "typeIdentifier": "t_magic_abi", + "typeString": "abi" + } + }, + "id": 357, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "encodeWithSelector", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "276:22:3", + "typeDescriptions": { + "typeIdentifier": "t_function_abiencodewithselector_pure$_t_bytes4_$returns$_t_bytes_memory_ptr_$", + "typeString": "function (bytes4) pure returns (bytes memory)" + } + }, + "id": 359, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "276:34:3", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 353, + "name": "token", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 342, + "src": "258:5:3", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + ], + "id": 352, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "250:7:3", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 351, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "250:7:3", + "typeDescriptions": { + "typeIdentifier": null, + "typeString": null + } + } + }, + "id": 354, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "250:14:3", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "id": 355, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "staticcall", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "250:25:3", + "typeDescriptions": { + "typeIdentifier": "t_function_barestaticcall_view$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$", + "typeString": "function (bytes memory) view returns (bool,bytes memory)" + } + }, + "id": 360, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "250:61:3", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$", + "typeString": "tuple(bool,bytes memory)" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "214:97:3" + }, + { + "expression": { + "argumentTypes": null, + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 367, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 362, + "name": "success", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 348, + "src": "329:7:3", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 366, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 363, + "name": "data", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 350, + "src": "340:4:3", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "id": 364, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "length", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "340:11:3", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "argumentTypes": null, + "hexValue": "30", + "id": 365, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "354:1:3", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "340:15:3", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "329:26:3", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseExpression": { + "argumentTypes": null, + "hexValue": "3f3f3f", + "id": 375, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "387:5:3", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_ad68b4dd5516c9b8c2050c111c09e315e44fd13499c6724a87c1b4642b615187", + "typeString": "literal_string \"???\"" + }, + "value": "???" + }, + "id": 376, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "Conditional", + "src": "329:63:3", + "trueExpression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 370, + "name": "data", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 350, + "src": "369:4:3", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + { + "argumentTypes": null, + "components": [ + { + "argumentTypes": null, + "id": 372, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "376:6:3", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_string_storage_ptr_$", + "typeString": "type(string storage pointer)" + }, + "typeName": { + "id": 371, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "376:6:3", + "typeDescriptions": { + "typeIdentifier": null, + "typeString": null + } + } + } + ], + "id": 373, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "375:8:3", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_string_storage_ptr_$", + "typeString": "type(string storage pointer)" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + }, + { + "typeIdentifier": "t_type$_t_string_storage_ptr_$", + "typeString": "type(string storage pointer)" + } + ], + "expression": { + "argumentTypes": null, + "id": 368, + "name": "abi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -1, + "src": "358:3:3", + "typeDescriptions": { + "typeIdentifier": "t_magic_abi", + "typeString": "abi" + } + }, + "id": 369, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "decode", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "358:10:3", + "typeDescriptions": { + "typeIdentifier": "t_function_abidecode_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 374, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "358:26:3", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + "functionReturnParameters": 346, + "id": 377, + "nodeType": "Return", + "src": "322:70:3" + } + ] + }, + "documentation": null, + "id": 379, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "safeSymbol", + "nodeType": "FunctionDefinition", + "overrides": null, + "parameters": { + "id": 343, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 342, + "mutability": "mutable", + "name": "token", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 379, + "src": "152:12:3", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + }, + "typeName": { + "contractScope": null, + "id": 341, + "name": "IERC20", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 337, + "src": "152:6:3", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "151:14:3" + }, + "returnParameters": { + "id": 346, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 345, + "mutability": "mutable", + "name": "", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 379, + "src": "188:13:3", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string" + }, + "typeName": { + "id": 344, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "188:6:3", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "187:15:3" + }, + "scope": 553, + "src": "132:268:3", + "stateMutability": "view", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 417, + "nodeType": "Block", + "src": "477:197:3", + "statements": [ + { + "assignments": [ + 387, + 389 + ], + "declarations": [ + { + "constant": false, + "id": 387, + "mutability": "mutable", + "name": "success", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 417, + "src": "489:12:3", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 386, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "489:4:3", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 389, + "mutability": "mutable", + "name": "data", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 417, + "src": "503:17:3", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 388, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "503:5:3", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "value": null, + "visibility": "internal" + } + ], + "id": 400, + "initialValue": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "30783036666464653033", + "id": 397, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "573:10:3", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_117300739_by_1", + "typeString": "int_const 117300739" + }, + "value": "0x06fdde03" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_117300739_by_1", + "typeString": "int_const 117300739" + } + ], + "expression": { + "argumentTypes": null, + "id": 395, + "name": "abi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -1, + "src": "550:3:3", + "typeDescriptions": { + "typeIdentifier": "t_magic_abi", + "typeString": "abi" + } + }, + "id": 396, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "encodeWithSelector", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "550:22:3", + "typeDescriptions": { + "typeIdentifier": "t_function_abiencodewithselector_pure$_t_bytes4_$returns$_t_bytes_memory_ptr_$", + "typeString": "function (bytes4) pure returns (bytes memory)" + } + }, + "id": 398, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "550:34:3", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 392, + "name": "token", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 381, + "src": "532:5:3", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + ], + "id": 391, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "524:7:3", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 390, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "524:7:3", + "typeDescriptions": { + "typeIdentifier": null, + "typeString": null + } + } + }, + "id": 393, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "524:14:3", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "id": 394, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "staticcall", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "524:25:3", + "typeDescriptions": { + "typeIdentifier": "t_function_barestaticcall_view$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$", + "typeString": "function (bytes memory) view returns (bool,bytes memory)" + } + }, + "id": 399, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "524:61:3", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$", + "typeString": "tuple(bool,bytes memory)" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "488:97:3" + }, + { + "expression": { + "argumentTypes": null, + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 406, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 401, + "name": "success", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 387, + "src": "603:7:3", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 405, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 402, + "name": "data", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 389, + "src": "614:4:3", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "id": 403, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "length", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "614:11:3", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "argumentTypes": null, + "hexValue": "30", + "id": 404, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "628:1:3", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "614:15:3", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "603:26:3", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseExpression": { + "argumentTypes": null, + "hexValue": "3f3f3f", + "id": 414, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "661:5:3", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_ad68b4dd5516c9b8c2050c111c09e315e44fd13499c6724a87c1b4642b615187", + "typeString": "literal_string \"???\"" + }, + "value": "???" + }, + "id": 415, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "Conditional", + "src": "603:63:3", + "trueExpression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 409, + "name": "data", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 389, + "src": "643:4:3", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + { + "argumentTypes": null, + "components": [ + { + "argumentTypes": null, + "id": 411, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "650:6:3", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_string_storage_ptr_$", + "typeString": "type(string storage pointer)" + }, + "typeName": { + "id": 410, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "650:6:3", + "typeDescriptions": { + "typeIdentifier": null, + "typeString": null + } + } + } + ], + "id": 412, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "649:8:3", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_string_storage_ptr_$", + "typeString": "type(string storage pointer)" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + }, + { + "typeIdentifier": "t_type$_t_string_storage_ptr_$", + "typeString": "type(string storage pointer)" + } + ], + "expression": { + "argumentTypes": null, + "id": 407, + "name": "abi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -1, + "src": "632:3:3", + "typeDescriptions": { + "typeIdentifier": "t_magic_abi", + "typeString": "abi" + } + }, + "id": 408, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "decode", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "632:10:3", + "typeDescriptions": { + "typeIdentifier": "t_function_abidecode_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 413, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "632:26:3", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string memory" + } + }, + "functionReturnParameters": 385, + "id": 416, + "nodeType": "Return", + "src": "596:70:3" + } + ] + }, + "documentation": null, + "id": 418, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "safeName", + "nodeType": "FunctionDefinition", + "overrides": null, + "parameters": { + "id": 382, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 381, + "mutability": "mutable", + "name": "token", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 418, + "src": "426:12:3", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + }, + "typeName": { + "contractScope": null, + "id": 380, + "name": "IERC20", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 337, + "src": "426:6:3", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "425:14:3" + }, + "returnParameters": { + "id": 385, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 384, + "mutability": "mutable", + "name": "", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 418, + "src": "462:13:3", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_string_memory_ptr", + "typeString": "string" + }, + "typeName": { + "id": 383, + "name": "string", + "nodeType": "ElementaryTypeName", + "src": "462:6:3", + "typeDescriptions": { + "typeIdentifier": "t_string_storage_ptr", + "typeString": "string" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "461:15:3" + }, + "scope": 553, + "src": "408:266:3", + "stateMutability": "view", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 456, + "nodeType": "Block", + "src": "748:195:3", + "statements": [ + { + "assignments": [ + 426, + 428 + ], + "declarations": [ + { + "constant": false, + "id": 426, + "mutability": "mutable", + "name": "success", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 456, + "src": "760:12:3", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 425, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "760:4:3", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 428, + "mutability": "mutable", + "name": "data", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 456, + "src": "774:17:3", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 427, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "774:5:3", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "value": null, + "visibility": "internal" + } + ], + "id": 439, + "initialValue": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "30783331336365353637", + "id": 436, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "844:10:3", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_826074471_by_1", + "typeString": "int_const 826074471" + }, + "value": "0x313ce567" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_826074471_by_1", + "typeString": "int_const 826074471" + } + ], + "expression": { + "argumentTypes": null, + "id": 434, + "name": "abi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -1, + "src": "821:3:3", + "typeDescriptions": { + "typeIdentifier": "t_magic_abi", + "typeString": "abi" + } + }, + "id": 435, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "encodeWithSelector", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "821:22:3", + "typeDescriptions": { + "typeIdentifier": "t_function_abiencodewithselector_pure$_t_bytes4_$returns$_t_bytes_memory_ptr_$", + "typeString": "function (bytes4) pure returns (bytes memory)" + } + }, + "id": 437, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "821:34:3", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 431, + "name": "token", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 420, + "src": "803:5:3", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + ], + "id": 430, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "795:7:3", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 429, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "795:7:3", + "typeDescriptions": { + "typeIdentifier": null, + "typeString": null + } + } + }, + "id": 432, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "795:14:3", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "id": 433, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "staticcall", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "795:25:3", + "typeDescriptions": { + "typeIdentifier": "t_function_barestaticcall_view$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$", + "typeString": "function (bytes memory) view returns (bool,bytes memory)" + } + }, + "id": 438, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "795:61:3", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$", + "typeString": "tuple(bool,bytes memory)" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "759:97:3" + }, + { + "expression": { + "argumentTypes": null, + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 445, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 440, + "name": "success", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 426, + "src": "874:7:3", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 444, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 441, + "name": "data", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 428, + "src": "885:4:3", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "id": 442, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "length", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "885:11:3", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "hexValue": "3332", + "id": 443, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "900:2:3", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_32_by_1", + "typeString": "int_const 32" + }, + "value": "32" + }, + "src": "885:17:3", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "874:28:3", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseExpression": { + "argumentTypes": null, + "hexValue": "3138", + "id": 453, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "933:2:3", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_18_by_1", + "typeString": "int_const 18" + }, + "value": "18" + }, + "id": 454, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "Conditional", + "src": "874:61:3", + "trueExpression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 448, + "name": "data", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 428, + "src": "916:4:3", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + { + "argumentTypes": null, + "components": [ + { + "argumentTypes": null, + "id": 450, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "923:5:3", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint8_$", + "typeString": "type(uint8)" + }, + "typeName": { + "id": 449, + "name": "uint8", + "nodeType": "ElementaryTypeName", + "src": "923:5:3", + "typeDescriptions": { + "typeIdentifier": null, + "typeString": null + } + } + } + ], + "id": 451, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "922:7:3", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint8_$", + "typeString": "type(uint8)" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + }, + { + "typeIdentifier": "t_type$_t_uint8_$", + "typeString": "type(uint8)" + } + ], + "expression": { + "argumentTypes": null, + "id": 446, + "name": "abi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -1, + "src": "905:3:3", + "typeDescriptions": { + "typeIdentifier": "t_magic_abi", + "typeString": "abi" + } + }, + "id": 447, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "decode", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "905:10:3", + "typeDescriptions": { + "typeIdentifier": "t_function_abidecode_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 452, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "905:25:3", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "functionReturnParameters": 424, + "id": 455, + "nodeType": "Return", + "src": "867:68:3" + } + ] + }, + "documentation": null, + "id": 457, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "safeDecimals", + "nodeType": "FunctionDefinition", + "overrides": null, + "parameters": { + "id": 421, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 420, + "mutability": "mutable", + "name": "token", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 457, + "src": "704:12:3", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + }, + "typeName": { + "contractScope": null, + "id": 419, + "name": "IERC20", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 337, + "src": "704:6:3", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "703:14:3" + }, + "returnParameters": { + "id": 424, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 423, + "mutability": "mutable", + "name": "", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 457, + "src": "741:5:3", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + }, + "typeName": { + "id": 422, + "name": "uint8", + "nodeType": "ElementaryTypeName", + "src": "741:5:3", + "typeDescriptions": { + "typeIdentifier": "t_uint8", + "typeString": "uint8" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "740:7:3" + }, + "scope": 553, + "src": "682:261:3", + "stateMutability": "view", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 502, + "nodeType": "Block", + "src": "1024:231:3", + "statements": [ + { + "assignments": [ + 467, + 469 + ], + "declarations": [ + { + "constant": false, + "id": 467, + "mutability": "mutable", + "name": "success", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 502, + "src": "1036:12:3", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 466, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "1036:4:3", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 469, + "mutability": "mutable", + "name": "data", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 502, + "src": "1050:17:3", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 468, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "1050:5:3", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "value": null, + "visibility": "internal" + } + ], + "id": 482, + "initialValue": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "30786139303539636262", + "id": 477, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1114:10:3", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_2835717307_by_1", + "typeString": "int_const 2835717307" + }, + "value": "0xa9059cbb" + }, + { + "argumentTypes": null, + "id": 478, + "name": "to", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 461, + "src": "1126:2:3", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 479, + "name": "amount", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 463, + "src": "1130:6:3", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_2835717307_by_1", + "typeString": "int_const 2835717307" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "id": 475, + "name": "abi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -1, + "src": "1091:3:3", + "typeDescriptions": { + "typeIdentifier": "t_magic_abi", + "typeString": "abi" + } + }, + "id": 476, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "encodeWithSelector", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "1091:22:3", + "typeDescriptions": { + "typeIdentifier": "t_function_abiencodewithselector_pure$_t_bytes4_$returns$_t_bytes_memory_ptr_$", + "typeString": "function (bytes4) pure returns (bytes memory)" + } + }, + "id": 480, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "1091:46:3", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 472, + "name": "token", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 459, + "src": "1079:5:3", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + ], + "id": 471, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "1071:7:3", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 470, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1071:7:3", + "typeDescriptions": { + "typeIdentifier": null, + "typeString": null + } + } + }, + "id": 473, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "1071:14:3", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "id": 474, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "call", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "1071:19:3", + "typeDescriptions": { + "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$", + "typeString": "function (bytes memory) payable returns (bool,bytes memory)" + } + }, + "id": 481, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "1071:67:3", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$", + "typeString": "tuple(bool,bytes memory)" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "1035:103:3" + }, + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 498, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 484, + "name": "success", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 467, + "src": "1157:7:3", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "argumentTypes": null, + "components": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 496, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 488, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 485, + "name": "data", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 469, + "src": "1169:4:3", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "id": 486, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "length", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "1169:11:3", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "hexValue": "30", + "id": 487, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1184:1:3", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "1169:16:3", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "||", + "rightExpression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 491, + "name": "data", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 469, + "src": "1200:4:3", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + { + "argumentTypes": null, + "components": [ + { + "argumentTypes": null, + "id": 493, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "1207:4:3", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bool_$", + "typeString": "type(bool)" + }, + "typeName": { + "id": 492, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "1207:4:3", + "typeDescriptions": { + "typeIdentifier": null, + "typeString": null + } + } + } + ], + "id": 494, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "1206:6:3", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bool_$", + "typeString": "type(bool)" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + }, + { + "typeIdentifier": "t_type$_t_bool_$", + "typeString": "type(bool)" + } + ], + "expression": { + "argumentTypes": null, + "id": 489, + "name": "abi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -1, + "src": "1189:3:3", + "typeDescriptions": { + "typeIdentifier": "t_magic_abi", + "typeString": "abi" + } + }, + "id": 490, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "decode", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "1189:10:3", + "typeDescriptions": { + "typeIdentifier": "t_function_abidecode_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 495, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "1189:24:3", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "1169:44:3", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "id": 497, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "1168:46:3", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "1157:57:3", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "argumentTypes": null, + "hexValue": "426f72696e6745524332303a205472616e73666572206661696c6564", + "id": 499, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1216:30:3", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_1a3f0851ddc9e157ae96e52ed9dfd71a8cb4b1cf2a73b26b9f3f9e0aa9469d27", + "typeString": "literal_string \"BoringERC20: Transfer failed\"" + }, + "value": "BoringERC20: Transfer failed" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_stringliteral_1a3f0851ddc9e157ae96e52ed9dfd71a8cb4b1cf2a73b26b9f3f9e0aa9469d27", + "typeString": "literal_string \"BoringERC20: Transfer failed\"" + } + ], + "id": 483, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [ + -18, + -18 + ], + "referencedDeclaration": -18, + "src": "1149:7:3", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", + "typeString": "function (bool,string memory) pure" + } + }, + "id": 500, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "1149:98:3", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 501, + "nodeType": "ExpressionStatement", + "src": "1149:98:3" + } + ] + }, + "documentation": null, + "id": 503, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "safeTransfer", + "nodeType": "FunctionDefinition", + "overrides": null, + "parameters": { + "id": 464, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 459, + "mutability": "mutable", + "name": "token", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 503, + "src": "973:12:3", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + }, + "typeName": { + "contractScope": null, + "id": 458, + "name": "IERC20", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 337, + "src": "973:6:3", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 461, + "mutability": "mutable", + "name": "to", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 503, + "src": "987:10:3", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 460, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "987:7:3", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 463, + "mutability": "mutable", + "name": "amount", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 503, + "src": "999:14:3", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 462, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "999:7:3", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "972:42:3" + }, + "returnParameters": { + "id": 465, + "nodeType": "ParameterList", + "parameters": [], + "src": "1024:0:3" + }, + "scope": 553, + "src": "951:304:3", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 551, + "nodeType": "Block", + "src": "1354:241:3", + "statements": [ + { + "assignments": [ + 515, + 517 + ], + "declarations": [ + { + "constant": false, + "id": 515, + "mutability": "mutable", + "name": "success", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 551, + "src": "1366:12:3", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 514, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "1366:4:3", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 517, + "mutability": "mutable", + "name": "data", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 551, + "src": "1380:17:3", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes" + }, + "typeName": { + "id": 516, + "name": "bytes", + "nodeType": "ElementaryTypeName", + "src": "1380:5:3", + "typeDescriptions": { + "typeIdentifier": "t_bytes_storage_ptr", + "typeString": "bytes" + } + }, + "value": null, + "visibility": "internal" + } + ], + "id": 531, + "initialValue": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "30783233623837326464", + "id": 525, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1444:10:3", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_599290589_by_1", + "typeString": "int_const 599290589" + }, + "value": "0x23b872dd" + }, + { + "argumentTypes": null, + "id": 526, + "name": "from", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 507, + "src": "1456:4:3", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 527, + "name": "to", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 509, + "src": "1462:2:3", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 528, + "name": "amount", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 511, + "src": "1466:6:3", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_599290589_by_1", + "typeString": "int_const 599290589" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "id": 523, + "name": "abi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -1, + "src": "1421:3:3", + "typeDescriptions": { + "typeIdentifier": "t_magic_abi", + "typeString": "abi" + } + }, + "id": 524, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "encodeWithSelector", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "1421:22:3", + "typeDescriptions": { + "typeIdentifier": "t_function_abiencodewithselector_pure$_t_bytes4_$returns$_t_bytes_memory_ptr_$", + "typeString": "function (bytes4) pure returns (bytes memory)" + } + }, + "id": 529, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "1421:52:3", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + ], + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 520, + "name": "token", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 505, + "src": "1409:5:3", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + ], + "id": 519, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "1401:7:3", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 518, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1401:7:3", + "typeDescriptions": { + "typeIdentifier": null, + "typeString": null + } + } + }, + "id": 521, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "1401:14:3", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "id": 522, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "call", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "1401:19:3", + "typeDescriptions": { + "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$", + "typeString": "function (bytes memory) payable returns (bool,bytes memory)" + } + }, + "id": 530, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "1401:73:3", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$", + "typeString": "tuple(bool,bytes memory)" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "1365:109:3" + }, + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 547, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 533, + "name": "success", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 515, + "src": "1493:7:3", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "argumentTypes": null, + "components": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 545, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 537, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 534, + "name": "data", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 517, + "src": "1505:4:3", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + "id": 535, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "length", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "1505:11:3", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "hexValue": "30", + "id": 536, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1520:1:3", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "1505:16:3", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "||", + "rightExpression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 540, + "name": "data", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 517, + "src": "1536:4:3", + "typeDescriptions": { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + } + }, + { + "argumentTypes": null, + "components": [ + { + "argumentTypes": null, + "id": 542, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "1543:4:3", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bool_$", + "typeString": "type(bool)" + }, + "typeName": { + "id": 541, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "1543:4:3", + "typeDescriptions": { + "typeIdentifier": null, + "typeString": null + } + } + } + ], + "id": 543, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "1542:6:3", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_bool_$", + "typeString": "type(bool)" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bytes_memory_ptr", + "typeString": "bytes memory" + }, + { + "typeIdentifier": "t_type$_t_bool_$", + "typeString": "type(bool)" + } + ], + "expression": { + "argumentTypes": null, + "id": 538, + "name": "abi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -1, + "src": "1525:3:3", + "typeDescriptions": { + "typeIdentifier": "t_magic_abi", + "typeString": "abi" + } + }, + "id": 539, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "memberName": "decode", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "1525:10:3", + "typeDescriptions": { + "typeIdentifier": "t_function_abidecode_pure$__$returns$__$", + "typeString": "function () pure" + } + }, + "id": 544, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "1525:24:3", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "1505:44:3", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "id": 546, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "1504:46:3", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "1493:57:3", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "argumentTypes": null, + "hexValue": "426f72696e6745524332303a205472616e7366657246726f6d206661696c6564", + "id": 548, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1552:34:3", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_dffd2f381f9235cb5927387124071d63a91c90f587c3edae76629d7dc4794f26", + "typeString": "literal_string \"BoringERC20: TransferFrom failed\"" + }, + "value": "BoringERC20: TransferFrom failed" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_stringliteral_dffd2f381f9235cb5927387124071d63a91c90f587c3edae76629d7dc4794f26", + "typeString": "literal_string \"BoringERC20: TransferFrom failed\"" + } + ], + "id": 532, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [ + -18, + -18 + ], + "referencedDeclaration": -18, + "src": "1485:7:3", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", + "typeString": "function (bool,string memory) pure" + } + }, + "id": 549, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "1485:102:3", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 550, + "nodeType": "ExpressionStatement", + "src": "1485:102:3" + } + ] + }, + "documentation": null, + "id": 552, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "safeTransferFrom", + "nodeType": "FunctionDefinition", + "overrides": null, + "parameters": { + "id": 512, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 505, + "mutability": "mutable", + "name": "token", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 552, + "src": "1289:12:3", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + }, + "typeName": { + "contractScope": null, + "id": 504, + "name": "IERC20", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 337, + "src": "1289:6:3", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 507, + "mutability": "mutable", + "name": "from", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 552, + "src": "1303:12:3", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 506, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1303:7:3", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 509, + "mutability": "mutable", + "name": "to", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 552, + "src": "1317:10:3", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 508, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1317:7:3", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 511, + "mutability": "mutable", + "name": "amount", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 552, + "src": "1329:14:3", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 510, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1329:7:3", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "1288:56:3" + }, + "returnParameters": { + "id": 513, + "nodeType": "ParameterList", + "parameters": [], + "src": "1354:0:3" + }, + "scope": 553, + "src": "1263:332:3", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "internal" + } + ], + "scope": 554, + "src": "105:1493:3" + } + ], + "src": "40:1558:3" + }, + "id": 3 + }, + "contracts/MasterChefV2.sol": { + "ast": { + "absolutePath": "contracts/MasterChefV2.sol", + "exportedSymbols": { + "IMigratorChef": [ + 858 + ], + "MasterChefV2": [ + 2091 + ] + }, + "id": 2092, + "license": "MIT", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 843, + "literals": [ + "solidity", + "0.6", + ".12" + ], + "nodeType": "PragmaDirective", + "src": "33:23:5" + }, + { + "id": 844, + "literals": [ + "experimental", + "ABIEncoderV2" + ], + "nodeType": "PragmaDirective", + "src": "57:33:5" + }, + { + "absolutePath": "@boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol", + "file": "@boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol", + "id": 845, + "nodeType": "ImportDirective", + "scope": 2092, + "sourceUnit": 842, + "src": "92:74:5", + "symbolAliases": [], + "unitAlias": "" + }, + { + "absolutePath": "@boringcrypto/boring-solidity/contracts/BoringBatchable.sol", + "file": "@boringcrypto/boring-solidity/contracts/BoringBatchable.sol", + "id": 846, + "nodeType": "ImportDirective", + "scope": 2092, + "sourceUnit": 146, + "src": "167:69:5", + "symbolAliases": [], + "unitAlias": "" + }, + { + "absolutePath": "@boringcrypto/boring-solidity/contracts/BoringOwnable.sol", + "file": "@boringcrypto/boring-solidity/contracts/BoringOwnable.sol", + "id": 847, + "nodeType": "ImportDirective", + "scope": 2092, + "sourceUnit": 272, + "src": "237:67:5", + "symbolAliases": [], + "unitAlias": "" + }, + { + "absolutePath": "contracts/libraries/SignedSafeMath.sol", + "file": "./libraries/SignedSafeMath.sol", + "id": 848, + "nodeType": "ImportDirective", + "scope": 2092, + "sourceUnit": 2366, + "src": "305:40:5", + "symbolAliases": [], + "unitAlias": "" + }, + { + "absolutePath": "contracts/interfaces/IRewarder.sol", + "file": "./interfaces/IRewarder.sol", + "id": 849, + "nodeType": "ImportDirective", + "scope": 2092, + "sourceUnit": 2168, + "src": "346:36:5", + "symbolAliases": [], + "unitAlias": "" + }, + { + "absolutePath": "contracts/interfaces/IMasterChef.sol", + "file": "./interfaces/IMasterChef.sol", + "id": 850, + "nodeType": "ImportDirective", + "scope": 2092, + "sourceUnit": 2133, + "src": "383:38:5", + "symbolAliases": [], + "unitAlias": "" + }, + { + "abstract": false, + "baseContracts": [], + "contractDependencies": [], + "contractKind": "interface", + "documentation": null, + "fullyImplemented": false, + "id": 858, + "linearizedBaseContracts": [ + 858 + ], + "name": "IMigratorChef", + "nodeType": "ContractDefinition", + "nodes": [ + { + "body": null, + "documentation": null, + "functionSelector": "ce5494bb", + "id": 857, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "migrate", + "nodeType": "FunctionDefinition", + "overrides": null, + "parameters": { + "id": 853, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 852, + "mutability": "mutable", + "name": "token", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 857, + "src": "614:12:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + }, + "typeName": { + "contractScope": null, + "id": 851, + "name": "IERC20", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 337, + "src": "614:6:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "613:14:5" + }, + "returnParameters": { + "id": 856, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 855, + "mutability": "mutable", + "name": "", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 857, + "src": "646:6:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + }, + "typeName": { + "contractScope": null, + "id": 854, + "name": "IERC20", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 337, + "src": "646:6:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "645:8:5" + }, + "scope": 858, + "src": "597:57:5", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + } + ], + "scope": 2092, + "src": "423:233:5" + }, + { + "abstract": false, + "baseContracts": [ + { + "arguments": null, + "baseName": { + "contractScope": null, + "id": 860, + "name": "BoringOwnable", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 271, + "src": "1123:13:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_BoringOwnable_$271", + "typeString": "contract BoringOwnable" + } + }, + "id": 861, + "nodeType": "InheritanceSpecifier", + "src": "1123:13:5" + }, + { + "arguments": null, + "baseName": { + "contractScope": null, + "id": 862, + "name": "BoringBatchable", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 145, + "src": "1138:15:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_BoringBatchable_$145", + "typeString": "contract BoringBatchable" + } + }, + "id": 863, + "nodeType": "InheritanceSpecifier", + "src": "1138:15:5" + } + ], + "contractDependencies": [ + 110, + 145, + 152, + 271 + ], + "contractKind": "contract", + "documentation": { + "id": 859, + "nodeType": "StructuredDocumentation", + "src": "658:440:5", + "text": "@notice The (older) MasterChef contract gives out a constant number of SUSHI tokens per block.\n It is the only address with minting rights for SUSHI.\n The idea for this MasterChef V2 (MCV2) contract is therefore to be the owner of a dummy token\n that is deposited into the MasterChef V1 (MCV1) contract.\n The allocation point for this pool on MCV1 is the total allocation point for all pools that receive double incentives." + }, + "fullyImplemented": true, + "id": 2091, + "linearizedBaseContracts": [ + 2091, + 145, + 110, + 271, + 152 + ], + "name": "MasterChefV2", + "nodeType": "ContractDefinition", + "nodes": [ + { + "id": 866, + "libraryName": { + "contractScope": null, + "id": 864, + "name": "BoringMath", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 706, + "src": "1166:10:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_BoringMath_$706", + "typeString": "library BoringMath" + } + }, + "nodeType": "UsingForDirective", + "src": "1160:29:5", + "typeName": { + "id": 865, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1181:7:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + }, + { + "id": 869, + "libraryName": { + "contractScope": null, + "id": 867, + "name": "BoringMath128", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 751, + "src": "1200:13:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_BoringMath128_$751", + "typeString": "library BoringMath128" + } + }, + "nodeType": "UsingForDirective", + "src": "1194:32:5", + "typeName": { + "id": 868, + "name": "uint128", + "nodeType": "ElementaryTypeName", + "src": "1218:7:5", + "typeDescriptions": { + "typeIdentifier": "t_uint128", + "typeString": "uint128" + } + } + }, + { + "id": 872, + "libraryName": { + "contractScope": null, + "id": 870, + "name": "BoringERC20", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 553, + "src": "1237:11:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_BoringERC20_$553", + "typeString": "library BoringERC20" + } + }, + "nodeType": "UsingForDirective", + "src": "1231:29:5", + "typeName": { + "contractScope": null, + "id": 871, + "name": "IERC20", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 337, + "src": "1253:6:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + } + }, + { + "id": 875, + "libraryName": { + "contractScope": null, + "id": 873, + "name": "SignedSafeMath", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 2365, + "src": "1271:14:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_SignedSafeMath_$2365", + "typeString": "library SignedSafeMath" + } + }, + "nodeType": "UsingForDirective", + "src": "1265:32:5", + "typeName": { + "id": 874, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "1290:6:5", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + }, + { + "canonicalName": "MasterChefV2.UserInfo", + "id": 880, + "members": [ + { + "constant": false, + "id": 877, + "mutability": "mutable", + "name": "amount", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 880, + "src": "1488:14:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 876, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1488:7:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 879, + "mutability": "mutable", + "name": "rewardDebt", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 880, + "src": "1512:17:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 878, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "1512:6:5", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "name": "UserInfo", + "nodeType": "StructDefinition", + "scope": 2091, + "src": "1462:74:5", + "visibility": "public" + }, + { + "canonicalName": "MasterChefV2.PoolInfo", + "id": 887, + "members": [ + { + "constant": false, + "id": 882, + "mutability": "mutable", + "name": "accSushiPerShare", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 887, + "src": "1750:24:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint128", + "typeString": "uint128" + }, + "typeName": { + "id": 881, + "name": "uint128", + "nodeType": "ElementaryTypeName", + "src": "1750:7:5", + "typeDescriptions": { + "typeIdentifier": "t_uint128", + "typeString": "uint128" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 884, + "mutability": "mutable", + "name": "lastRewardBlock", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 887, + "src": "1784:22:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + "typeName": { + "id": 883, + "name": "uint64", + "nodeType": "ElementaryTypeName", + "src": "1784:6:5", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 886, + "mutability": "mutable", + "name": "allocPoint", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 887, + "src": "1816:17:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + "typeName": { + "id": 885, + "name": "uint64", + "nodeType": "ElementaryTypeName", + "src": "1816:6:5", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "value": null, + "visibility": "internal" + } + ], + "name": "PoolInfo", + "nodeType": "StructDefinition", + "scope": 2091, + "src": "1724:116:5", + "visibility": "public" + }, + { + "constant": false, + "documentation": { + "id": 888, + "nodeType": "StructuredDocumentation", + "src": "1846:37:5", + "text": "@notice Address of MCV1 contract." + }, + "functionSelector": "edd8b170", + "id": 890, + "mutability": "immutable", + "name": "MASTER_CHEF", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2091, + "src": "1888:40:5", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IMasterChef_$2132", + "typeString": "contract IMasterChef" + }, + "typeName": { + "contractScope": null, + "id": 889, + "name": "IMasterChef", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 2132, + "src": "1888:11:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IMasterChef_$2132", + "typeString": "contract IMasterChef" + } + }, + "value": null, + "visibility": "public" + }, + { + "constant": false, + "documentation": { + "id": 891, + "nodeType": "StructuredDocumentation", + "src": "1934:38:5", + "text": "@notice Address of SUSHI contract." + }, + "functionSelector": "ab560e10", + "id": 893, + "mutability": "immutable", + "name": "SUSHI", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2091, + "src": "1977:29:5", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + }, + "typeName": { + "contractScope": null, + "id": 892, + "name": "IERC20", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 337, + "src": "1977:6:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + }, + "value": null, + "visibility": "public" + }, + { + "constant": false, + "documentation": { + "id": 894, + "nodeType": "StructuredDocumentation", + "src": "2012:50:5", + "text": "@notice The index of MCV2 master pool in MCV1." + }, + "functionSelector": "61621aaa", + "id": 896, + "mutability": "immutable", + "name": "MASTER_PID", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2091, + "src": "2067:35:5", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 895, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2067:7:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "public" + }, + { + "constant": false, + "functionSelector": "7cd07e47", + "id": 898, + "mutability": "mutable", + "name": "migrator", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2091, + "src": "2213:29:5", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IMigratorChef_$858", + "typeString": "contract IMigratorChef" + }, + "typeName": { + "contractScope": null, + "id": 897, + "name": "IMigratorChef", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 858, + "src": "2213:13:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IMigratorChef_$858", + "typeString": "contract IMigratorChef" + } + }, + "value": null, + "visibility": "public" + }, + { + "constant": false, + "documentation": { + "id": 899, + "nodeType": "StructuredDocumentation", + "src": "2249:35:5", + "text": "@notice Info of each MCV2 pool." + }, + "functionSelector": "1526fe27", + "id": 902, + "mutability": "mutable", + "name": "poolInfo", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2091, + "src": "2289:26:5", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_struct$_PoolInfo_$887_storage_$dyn_storage", + "typeString": "struct MasterChefV2.PoolInfo[]" + }, + "typeName": { + "baseType": { + "contractScope": null, + "id": 900, + "name": "PoolInfo", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 887, + "src": "2289:8:5", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$887_storage_ptr", + "typeString": "struct MasterChefV2.PoolInfo" + } + }, + "id": 901, + "length": null, + "nodeType": "ArrayTypeName", + "src": "2289:10:5", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_struct$_PoolInfo_$887_storage_$dyn_storage_ptr", + "typeString": "struct MasterChefV2.PoolInfo[]" + } + }, + "value": null, + "visibility": "public" + }, + { + "constant": false, + "documentation": { + "id": 903, + "nodeType": "StructuredDocumentation", + "src": "2321:55:5", + "text": "@notice Address of the LP token for each MCV2 pool." + }, + "functionSelector": "78ed5d1f", + "id": 906, + "mutability": "mutable", + "name": "lpToken", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2091, + "src": "2381:23:5", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_contract$_IERC20_$337_$dyn_storage", + "typeString": "contract IERC20[]" + }, + "typeName": { + "baseType": { + "contractScope": null, + "id": 904, + "name": "IERC20", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 337, + "src": "2381:6:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + }, + "id": 905, + "length": null, + "nodeType": "ArrayTypeName", + "src": "2381:8:5", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_contract$_IERC20_$337_$dyn_storage_ptr", + "typeString": "contract IERC20[]" + } + }, + "value": null, + "visibility": "public" + }, + { + "constant": false, + "documentation": { + "id": 907, + "nodeType": "StructuredDocumentation", + "src": "2410:57:5", + "text": "@notice Address of each `IRewarder` contract in MCV2." + }, + "functionSelector": "c346253d", + "id": 910, + "mutability": "mutable", + "name": "rewarder", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2091, + "src": "2472:27:5", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_contract$_IRewarder_$2167_$dyn_storage", + "typeString": "contract IRewarder[]" + }, + "typeName": { + "baseType": { + "contractScope": null, + "id": 908, + "name": "IRewarder", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 2167, + "src": "2472:9:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IRewarder_$2167", + "typeString": "contract IRewarder" + } + }, + "id": 909, + "length": null, + "nodeType": "ArrayTypeName", + "src": "2472:11:5", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_contract$_IRewarder_$2167_$dyn_storage_ptr", + "typeString": "contract IRewarder[]" + } + }, + "value": null, + "visibility": "public" + }, + { + "constant": false, + "documentation": { + "id": 911, + "nodeType": "StructuredDocumentation", + "src": "2506:52:5", + "text": "@notice Info of each user that stakes LP tokens." + }, + "functionSelector": "93f1a40b", + "id": 917, + "mutability": "mutable", + "name": "userInfo", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2091, + "src": "2563:66:5", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_uint256_$_t_mapping$_t_address_$_t_struct$_UserInfo_$880_storage_$_$", + "typeString": "mapping(uint256 => mapping(address => struct MasterChefV2.UserInfo))" + }, + "typeName": { + "id": 916, + "keyType": { + "id": 912, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2572:7:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Mapping", + "src": "2563:50:5", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_uint256_$_t_mapping$_t_address_$_t_struct$_UserInfo_$880_storage_$_$", + "typeString": "mapping(uint256 => mapping(address => struct MasterChefV2.UserInfo))" + }, + "valueType": { + "id": 915, + "keyType": { + "id": 913, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2592:7:5", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "Mapping", + "src": "2583:29:5", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_UserInfo_$880_storage_$", + "typeString": "mapping(address => struct MasterChefV2.UserInfo)" + }, + "valueType": { + "contractScope": null, + "id": 914, + "name": "UserInfo", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 880, + "src": "2603:8:5", + "typeDescriptions": { + "typeIdentifier": "t_struct$_UserInfo_$880_storage_ptr", + "typeString": "struct MasterChefV2.UserInfo" + } + } + } + }, + "value": null, + "visibility": "public" + }, + { + "constant": false, + "documentation": { + "id": 918, + "nodeType": "StructuredDocumentation", + "src": "2635:88:5", + "text": "@dev Total allocation points. Must be the sum of all allocation points in all pools." + }, + "functionSelector": "17caf6f1", + "id": 920, + "mutability": "mutable", + "name": "totalAllocPoint", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2091, + "src": "2728:30:5", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 919, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2728:7:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "public" + }, + { + "constant": true, + "id": 923, + "mutability": "constant", + "name": "MASTERCHEF_SUSHI_PER_BLOCK", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2091, + "src": "2765:58:5", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 921, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2765:7:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": { + "argumentTypes": null, + "hexValue": "31653230", + "id": 922, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2819:4:5", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_100000000000000000000_by_1", + "typeString": "int_const 100000000000000000000" + }, + "value": "1e20" + }, + "visibility": "private" + }, + { + "constant": true, + "id": 926, + "mutability": "constant", + "name": "ACC_SUSHI_PRECISION", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2091, + "src": "2829:51:5", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 924, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2829:7:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": { + "argumentTypes": null, + "hexValue": "31653132", + "id": 925, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2876:4:5", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_1000000000000_by_1", + "typeString": "int_const 1000000000000" + }, + "value": "1e12" + }, + "visibility": "private" + }, + { + "anonymous": false, + "documentation": null, + "id": 936, + "name": "Deposit", + "nodeType": "EventDefinition", + "parameters": { + "id": 935, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 928, + "indexed": true, + "mutability": "mutable", + "name": "user", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 936, + "src": "2901:20:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 927, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2901:7:5", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 930, + "indexed": true, + "mutability": "mutable", + "name": "pid", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 936, + "src": "2923:19:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 929, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2923:7:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 932, + "indexed": false, + "mutability": "mutable", + "name": "amount", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 936, + "src": "2944:14:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 931, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2944:7:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 934, + "indexed": true, + "mutability": "mutable", + "name": "to", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 936, + "src": "2960:18:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 933, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2960:7:5", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "2900:79:5" + }, + "src": "2887:93:5" + }, + { + "anonymous": false, + "documentation": null, + "id": 946, + "name": "Withdraw", + "nodeType": "EventDefinition", + "parameters": { + "id": 945, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 938, + "indexed": true, + "mutability": "mutable", + "name": "user", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 946, + "src": "3000:20:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 937, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3000:7:5", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 940, + "indexed": true, + "mutability": "mutable", + "name": "pid", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 946, + "src": "3022:19:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 939, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3022:7:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 942, + "indexed": false, + "mutability": "mutable", + "name": "amount", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 946, + "src": "3043:14:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 941, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3043:7:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 944, + "indexed": true, + "mutability": "mutable", + "name": "to", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 946, + "src": "3059:18:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 943, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3059:7:5", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "2999:79:5" + }, + "src": "2985:94:5" + }, + { + "anonymous": false, + "documentation": null, + "id": 956, + "name": "EmergencyWithdraw", + "nodeType": "EventDefinition", + "parameters": { + "id": 955, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 948, + "indexed": true, + "mutability": "mutable", + "name": "user", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 956, + "src": "3108:20:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 947, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3108:7:5", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 950, + "indexed": true, + "mutability": "mutable", + "name": "pid", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 956, + "src": "3130:19:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 949, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3130:7:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 952, + "indexed": false, + "mutability": "mutable", + "name": "amount", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 956, + "src": "3151:14:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 951, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3151:7:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 954, + "indexed": true, + "mutability": "mutable", + "name": "to", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 956, + "src": "3167:18:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 953, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3167:7:5", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "3107:79:5" + }, + "src": "3084:103:5" + }, + { + "anonymous": false, + "documentation": null, + "id": 964, + "name": "Harvest", + "nodeType": "EventDefinition", + "parameters": { + "id": 963, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 958, + "indexed": true, + "mutability": "mutable", + "name": "user", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 964, + "src": "3206:20:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 957, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "3206:7:5", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 960, + "indexed": true, + "mutability": "mutable", + "name": "pid", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 964, + "src": "3228:19:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 959, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3228:7:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 962, + "indexed": false, + "mutability": "mutable", + "name": "amount", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 964, + "src": "3249:14:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 961, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3249:7:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "3205:59:5" + }, + "src": "3192:73:5" + }, + { + "anonymous": false, + "documentation": null, + "id": 974, + "name": "LogPoolAddition", + "nodeType": "EventDefinition", + "parameters": { + "id": 973, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 966, + "indexed": true, + "mutability": "mutable", + "name": "pid", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 974, + "src": "3292:19:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 965, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3292:7:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 968, + "indexed": false, + "mutability": "mutable", + "name": "allocPoint", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 974, + "src": "3313:18:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 967, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3313:7:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 970, + "indexed": true, + "mutability": "mutable", + "name": "lpToken", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 974, + "src": "3333:22:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + }, + "typeName": { + "contractScope": null, + "id": 969, + "name": "IERC20", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 337, + "src": "3333:6:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 972, + "indexed": true, + "mutability": "mutable", + "name": "rewarder", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 974, + "src": "3357:26:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IRewarder_$2167", + "typeString": "contract IRewarder" + }, + "typeName": { + "contractScope": null, + "id": 971, + "name": "IRewarder", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 2167, + "src": "3357:9:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IRewarder_$2167", + "typeString": "contract IRewarder" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "3291:93:5" + }, + "src": "3270:115:5" + }, + { + "anonymous": false, + "documentation": null, + "id": 984, + "name": "LogSetPool", + "nodeType": "EventDefinition", + "parameters": { + "id": 983, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 976, + "indexed": true, + "mutability": "mutable", + "name": "pid", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 984, + "src": "3407:19:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 975, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3407:7:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 978, + "indexed": false, + "mutability": "mutable", + "name": "allocPoint", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 984, + "src": "3428:18:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 977, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3428:7:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 980, + "indexed": true, + "mutability": "mutable", + "name": "rewarder", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 984, + "src": "3448:26:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IRewarder_$2167", + "typeString": "contract IRewarder" + }, + "typeName": { + "contractScope": null, + "id": 979, + "name": "IRewarder", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 2167, + "src": "3448:9:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IRewarder_$2167", + "typeString": "contract IRewarder" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 982, + "indexed": false, + "mutability": "mutable", + "name": "overwrite", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 984, + "src": "3476:14:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 981, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "3476:4:5", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "3406:85:5" + }, + "src": "3390:102:5" + }, + { + "anonymous": false, + "documentation": null, + "id": 994, + "name": "LogUpdatePool", + "nodeType": "EventDefinition", + "parameters": { + "id": 993, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 986, + "indexed": true, + "mutability": "mutable", + "name": "pid", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 994, + "src": "3517:19:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 985, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3517:7:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 988, + "indexed": false, + "mutability": "mutable", + "name": "lastRewardBlock", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 994, + "src": "3538:22:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + "typeName": { + "id": 987, + "name": "uint64", + "nodeType": "ElementaryTypeName", + "src": "3538:6:5", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 990, + "indexed": false, + "mutability": "mutable", + "name": "lpSupply", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 994, + "src": "3562:16:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 989, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3562:7:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 992, + "indexed": false, + "mutability": "mutable", + "name": "accSushiPerShare", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 994, + "src": "3580:24:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 991, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3580:7:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "3516:89:5" + }, + "src": "3497:109:5" + }, + { + "anonymous": false, + "documentation": null, + "id": 996, + "name": "LogInit", + "nodeType": "EventDefinition", + "parameters": { + "id": 995, + "nodeType": "ParameterList", + "parameters": [], + "src": "3624:2:5" + }, + "src": "3611:16:5" + }, + { + "body": { + "id": 1018, + "nodeType": "Block", + "src": "3920:101:5", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 1008, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 1006, + "name": "MASTER_CHEF", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 890, + "src": "3930:11:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IMasterChef_$2132", + "typeString": "contract IMasterChef" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "id": 1007, + "name": "_MASTER_CHEF", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 999, + "src": "3944:12:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IMasterChef_$2132", + "typeString": "contract IMasterChef" + } + }, + "src": "3930:26:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IMasterChef_$2132", + "typeString": "contract IMasterChef" + } + }, + "id": 1009, + "nodeType": "ExpressionStatement", + "src": "3930:26:5" + }, + { + "expression": { + "argumentTypes": null, + "id": 1012, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 1010, + "name": "SUSHI", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 893, + "src": "3966:5:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "id": 1011, + "name": "_sushi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1001, + "src": "3974:6:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + }, + "src": "3966:14:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + }, + "id": 1013, + "nodeType": "ExpressionStatement", + "src": "3966:14:5" + }, + { + "expression": { + "argumentTypes": null, + "id": 1016, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 1014, + "name": "MASTER_PID", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 896, + "src": "3990:10:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "id": 1015, + "name": "_MASTER_PID", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1003, + "src": "4003:11:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "3990:24:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 1017, + "nodeType": "ExpressionStatement", + "src": "3990:24:5" + } + ] + }, + "documentation": { + "id": 997, + "nodeType": "StructuredDocumentation", + "src": "3633:201:5", + "text": "@param _MASTER_CHEF The SushiSwap MCV1 contract address.\n @param _sushi The SUSHI token contract address.\n @param _MASTER_PID The pool ID of the dummy token on the base MCV1 contract." + }, + "id": 1019, + "implemented": true, + "kind": "constructor", + "modifiers": [], + "name": "", + "nodeType": "FunctionDefinition", + "overrides": null, + "parameters": { + "id": 1004, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 999, + "mutability": "mutable", + "name": "_MASTER_CHEF", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 1019, + "src": "3851:24:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IMasterChef_$2132", + "typeString": "contract IMasterChef" + }, + "typeName": { + "contractScope": null, + "id": 998, + "name": "IMasterChef", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 2132, + "src": "3851:11:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IMasterChef_$2132", + "typeString": "contract IMasterChef" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 1001, + "mutability": "mutable", + "name": "_sushi", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 1019, + "src": "3877:13:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + }, + "typeName": { + "contractScope": null, + "id": 1000, + "name": "IERC20", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 337, + "src": "3877:6:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 1003, + "mutability": "mutable", + "name": "_MASTER_PID", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 1019, + "src": "3892:19:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1002, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3892:7:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "3850:62:5" + }, + "returnParameters": { + "id": 1005, + "nodeType": "ParameterList", + "parameters": [], + "src": "3920:0:5" + }, + "scope": 2091, + "src": "3839:182:5", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "public" + }, + { + "body": { + "id": 1072, + "nodeType": "Block", + "src": "4477:343:5", + "statements": [ + { + "assignments": [ + 1026 + ], + "declarations": [ + { + "constant": false, + "id": 1026, + "mutability": "mutable", + "name": "balance", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 1072, + "src": "4487:15:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1025, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4487:7:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "id": 1032, + "initialValue": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 1029, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -15, + "src": "4526:3:5", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 1030, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "4526:10:5", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + ], + "expression": { + "argumentTypes": null, + "id": 1027, + "name": "dummyToken", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1022, + "src": "4505:10:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + }, + "id": 1028, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "balanceOf", + "nodeType": "MemberAccess", + "referencedDeclaration": 285, + "src": "4505:20:5", + "typeDescriptions": { + "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$", + "typeString": "function (address) view external returns (uint256)" + } + }, + "id": 1031, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "4505:32:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "4487:50:5" + }, + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 1036, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 1034, + "name": "balance", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1026, + "src": "4555:7:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "argumentTypes": null, + "hexValue": "30", + "id": 1035, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "4566:1:5", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "4555:12:5", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "argumentTypes": null, + "hexValue": "4d61737465724368656656323a2042616c616e6365206d757374206578636565642030", + "id": 1037, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "4569:37:5", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_0e871e6ed6c66f490f6ac471b1b62f1c2f31fc35f4cf61165473eb8eae289983", + "typeString": "literal_string \"MasterChefV2: Balance must exceed 0\"" + }, + "value": "MasterChefV2: Balance must exceed 0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_stringliteral_0e871e6ed6c66f490f6ac471b1b62f1c2f31fc35f4cf61165473eb8eae289983", + "typeString": "literal_string \"MasterChefV2: Balance must exceed 0\"" + } + ], + "id": 1033, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [ + -18, + -18 + ], + "referencedDeclaration": -18, + "src": "4547:7:5", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", + "typeString": "function (bool,string memory) pure" + } + }, + "id": 1038, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "4547:60:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1039, + "nodeType": "ExpressionStatement", + "src": "4547:60:5" + }, + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 1043, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -15, + "src": "4645:3:5", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 1044, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "4645:10:5", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 1047, + "name": "this", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -28, + "src": "4665:4:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_MasterChefV2_$2091", + "typeString": "contract MasterChefV2" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_MasterChefV2_$2091", + "typeString": "contract MasterChefV2" + } + ], + "id": 1046, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "4657:7:5", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 1045, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "4657:7:5", + "typeDescriptions": { + "typeIdentifier": null, + "typeString": null + } + } + }, + "id": 1048, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "4657:13:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 1049, + "name": "balance", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1026, + "src": "4672:7:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "id": 1040, + "name": "dummyToken", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1022, + "src": "4617:10:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + }, + "id": 1042, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "safeTransferFrom", + "nodeType": "MemberAccess", + "referencedDeclaration": 552, + "src": "4617:27:5", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20_$337_$_t_address_$_t_address_$_t_uint256_$returns$__$bound_to$_t_contract$_IERC20_$337_$", + "typeString": "function (contract IERC20,address,address,uint256)" + } + }, + "id": 1050, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "4617:63:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1051, + "nodeType": "ExpressionStatement", + "src": "4617:63:5" + }, + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 1057, + "name": "MASTER_CHEF", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 890, + "src": "4717:11:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IMasterChef_$2132", + "typeString": "contract IMasterChef" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_IMasterChef_$2132", + "typeString": "contract IMasterChef" + } + ], + "id": 1056, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "4709:7:5", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 1055, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "4709:7:5", + "typeDescriptions": { + "typeIdentifier": null, + "typeString": null + } + } + }, + "id": 1058, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "4709:20:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 1059, + "name": "balance", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1026, + "src": "4731:7:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "id": 1052, + "name": "dummyToken", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1022, + "src": "4690:10:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + }, + "id": 1054, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "approve", + "nodeType": "MemberAccess", + "referencedDeclaration": 303, + "src": "4690:18:5", + "typeDescriptions": { + "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$", + "typeString": "function (address,uint256) external returns (bool)" + } + }, + "id": 1060, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "4690:49:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 1061, + "nodeType": "ExpressionStatement", + "src": "4690:49:5" + }, + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 1065, + "name": "MASTER_PID", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 896, + "src": "4769:10:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "argumentTypes": null, + "id": 1066, + "name": "balance", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1026, + "src": "4781:7:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "id": 1062, + "name": "MASTER_CHEF", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 890, + "src": "4749:11:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IMasterChef_$2132", + "typeString": "contract IMasterChef" + } + }, + "id": 1064, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "deposit", + "nodeType": "MemberAccess", + "referencedDeclaration": 2131, + "src": "4749:19:5", + "typeDescriptions": { + "typeIdentifier": "t_function_external_nonpayable$_t_uint256_$_t_uint256_$returns$__$", + "typeString": "function (uint256,uint256) external" + } + }, + "id": 1067, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "4749:40:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1068, + "nodeType": "ExpressionStatement", + "src": "4749:40:5" + }, + { + "eventCall": { + "argumentTypes": null, + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 1069, + "name": "LogInit", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 996, + "src": "4804:7:5", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$__$returns$__$", + "typeString": "function ()" + } + }, + "id": 1070, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "4804:9:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1071, + "nodeType": "EmitStatement", + "src": "4799:14:5" + } + ] + }, + "documentation": { + "id": 1020, + "nodeType": "StructuredDocumentation", + "src": "4027:403:5", + "text": "@notice Deposits a dummy token to `MASTER_CHEF` MCV1. This is required because MCV1 holds the minting rights for SUSHI.\n Any balance of transaction sender in `dummyToken` is transferred.\n The allocation point for the pool on MCV1 is the total allocation point for all pools that receive double incentives.\n @param dummyToken The address of the ERC-20 token to deposit into MCV1." + }, + "functionSelector": "19ab453c", + "id": 1073, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "init", + "nodeType": "FunctionDefinition", + "overrides": null, + "parameters": { + "id": 1023, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1022, + "mutability": "mutable", + "name": "dummyToken", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 1073, + "src": "4449:17:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + }, + "typeName": { + "contractScope": null, + "id": 1021, + "name": "IERC20", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 337, + "src": "4449:6:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "4448:19:5" + }, + "returnParameters": { + "id": 1024, + "nodeType": "ParameterList", + "parameters": [], + "src": "4477:0:5" + }, + "scope": 2091, + "src": "4435:385:5", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "body": { + "id": 1084, + "nodeType": "Block", + "src": "4934:40:5", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 1082, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 1079, + "name": "pools", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1077, + "src": "4944:5:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 1080, + "name": "poolInfo", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 902, + "src": "4952:8:5", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_struct$_PoolInfo_$887_storage_$dyn_storage", + "typeString": "struct MasterChefV2.PoolInfo storage ref[] storage ref" + } + }, + "id": 1081, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "length", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "4952:15:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "4944:23:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 1083, + "nodeType": "ExpressionStatement", + "src": "4944:23:5" + } + ] + }, + "documentation": { + "id": 1074, + "nodeType": "StructuredDocumentation", + "src": "4826:45:5", + "text": "@notice Returns the number of MCV2 pools." + }, + "functionSelector": "081e3eda", + "id": 1085, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "poolLength", + "nodeType": "FunctionDefinition", + "overrides": null, + "parameters": { + "id": 1075, + "nodeType": "ParameterList", + "parameters": [], + "src": "4895:2:5" + }, + "returnParameters": { + "id": 1078, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1077, + "mutability": "mutable", + "name": "pools", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 1085, + "src": "4919:13:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1076, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4919:7:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "4918:15:5" + }, + "scope": 2091, + "src": "4876:98:5", + "stateMutability": "view", + "virtual": false, + "visibility": "public" + }, + { + "body": { + "id": 1146, + "nodeType": "Block", + "src": "5394:441:5", + "statements": [ + { + "assignments": [ + 1098 + ], + "declarations": [ + { + "constant": false, + "id": 1098, + "mutability": "mutable", + "name": "lastRewardBlock", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 1146, + "src": "5404:23:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1097, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "5404:7:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "id": 1101, + "initialValue": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 1099, + "name": "block", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -4, + "src": "5430:5:5", + "typeDescriptions": { + "typeIdentifier": "t_magic_block", + "typeString": "block" + } + }, + "id": 1100, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "number", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "5430:12:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "5404:38:5" + }, + { + "expression": { + "argumentTypes": null, + "id": 1107, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 1102, + "name": "totalAllocPoint", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 920, + "src": "5452:15:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 1105, + "name": "allocPoint", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1088, + "src": "5490:10:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "id": 1103, + "name": "totalAllocPoint", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 920, + "src": "5470:15:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 1104, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "add", + "nodeType": "MemberAccess", + "referencedDeclaration": 577, + "src": "5470:19:5", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 1106, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "5470:31:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "5452:49:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 1108, + "nodeType": "ExpressionStatement", + "src": "5452:49:5" + }, + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 1112, + "name": "_lpToken", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1090, + "src": "5524:8:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + ], + "expression": { + "argumentTypes": null, + "id": 1109, + "name": "lpToken", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 906, + "src": "5511:7:5", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_contract$_IERC20_$337_$dyn_storage", + "typeString": "contract IERC20[] storage ref" + } + }, + "id": 1111, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "push", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "5511:12:5", + "typeDescriptions": { + "typeIdentifier": "t_function_arraypush_nonpayable$_t_contract$_IERC20_$337_$returns$__$", + "typeString": "function (contract IERC20)" + } + }, + "id": 1113, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "5511:22:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1114, + "nodeType": "ExpressionStatement", + "src": "5511:22:5" + }, + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 1118, + "name": "_rewarder", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1092, + "src": "5557:9:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IRewarder_$2167", + "typeString": "contract IRewarder" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_IRewarder_$2167", + "typeString": "contract IRewarder" + } + ], + "expression": { + "argumentTypes": null, + "id": 1115, + "name": "rewarder", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 910, + "src": "5543:8:5", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_contract$_IRewarder_$2167_$dyn_storage", + "typeString": "contract IRewarder[] storage ref" + } + }, + "id": 1117, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "push", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "5543:13:5", + "typeDescriptions": { + "typeIdentifier": "t_function_arraypush_nonpayable$_t_contract$_IRewarder_$2167_$returns$__$", + "typeString": "function (contract IRewarder)" + } + }, + "id": 1119, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "5543:24:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1120, + "nodeType": "ExpressionStatement", + "src": "5543:24:5" + }, + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "arguments": [], + "expression": { + "argumentTypes": [], + "expression": { + "argumentTypes": null, + "id": 1125, + "name": "allocPoint", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1088, + "src": "5627:10:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 1126, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "to64", + "nodeType": "MemberAccess", + "referencedDeclaration": 679, + "src": "5627:15:5", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint64_$bound_to$_t_uint256_$", + "typeString": "function (uint256) pure returns (uint64)" + } + }, + "id": 1127, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "5627:17:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + { + "argumentTypes": null, + "arguments": [], + "expression": { + "argumentTypes": [], + "expression": { + "argumentTypes": null, + "id": 1128, + "name": "lastRewardBlock", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1098, + "src": "5675:15:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 1129, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "to64", + "nodeType": "MemberAccess", + "referencedDeclaration": 679, + "src": "5675:20:5", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint64_$bound_to$_t_uint256_$", + "typeString": "function (uint256) pure returns (uint64)" + } + }, + "id": 1130, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "5675:22:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + { + "argumentTypes": null, + "hexValue": "30", + "id": 1131, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5729:1:5", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 1124, + "name": "PoolInfo", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 887, + "src": "5592:8:5", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_struct$_PoolInfo_$887_storage_ptr_$", + "typeString": "type(struct MasterChefV2.PoolInfo storage pointer)" + } + }, + "id": 1132, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "structConstructorCall", + "lValueRequested": false, + "names": [ + "allocPoint", + "lastRewardBlock", + "accSushiPerShare" + ], + "nodeType": "FunctionCall", + "src": "5592:149:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$887_memory_ptr", + "typeString": "struct MasterChefV2.PoolInfo memory" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_struct$_PoolInfo_$887_memory_ptr", + "typeString": "struct MasterChefV2.PoolInfo memory" + } + ], + "expression": { + "argumentTypes": null, + "id": 1121, + "name": "poolInfo", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 902, + "src": "5578:8:5", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_struct$_PoolInfo_$887_storage_$dyn_storage", + "typeString": "struct MasterChefV2.PoolInfo storage ref[] storage ref" + } + }, + "id": 1123, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "push", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "5578:13:5", + "typeDescriptions": { + "typeIdentifier": "t_function_arraypush_nonpayable$_t_struct$_PoolInfo_$887_storage_$returns$__$", + "typeString": "function (struct MasterChefV2.PoolInfo storage ref)" + } + }, + "id": 1133, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "5578:164:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1134, + "nodeType": "ExpressionStatement", + "src": "5578:164:5" + }, + { + "eventCall": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "31", + "id": 1139, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5792:1:5", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + } + ], + "expression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 1136, + "name": "lpToken", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 906, + "src": "5773:7:5", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_contract$_IERC20_$337_$dyn_storage", + "typeString": "contract IERC20[] storage ref" + } + }, + "id": 1137, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "length", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "5773:14:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 1138, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sub", + "nodeType": "MemberAccess", + "referencedDeclaration": 599, + "src": "5773:18:5", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 1140, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "5773:21:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "argumentTypes": null, + "id": 1141, + "name": "allocPoint", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1088, + "src": "5796:10:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "argumentTypes": null, + "id": 1142, + "name": "_lpToken", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1090, + "src": "5808:8:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + }, + { + "argumentTypes": null, + "id": 1143, + "name": "_rewarder", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1092, + "src": "5818:9:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IRewarder_$2167", + "typeString": "contract IRewarder" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + }, + { + "typeIdentifier": "t_contract$_IRewarder_$2167", + "typeString": "contract IRewarder" + } + ], + "id": 1135, + "name": "LogPoolAddition", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 974, + "src": "5757:15:5", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_uint256_$_t_uint256_$_t_contract$_IERC20_$337_$_t_contract$_IRewarder_$2167_$returns$__$", + "typeString": "function (uint256,uint256,contract IERC20,contract IRewarder)" + } + }, + "id": 1144, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "5757:71:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1145, + "nodeType": "EmitStatement", + "src": "5752:76:5" + } + ] + }, + "documentation": { + "id": 1086, + "nodeType": "StructuredDocumentation", + "src": "4980:321:5", + "text": "@notice Add a new LP to the pool. Can only be called by the owner.\n DO NOT add the same LP token more than once. Rewards will be messed up if you do.\n @param allocPoint AP of the new pool.\n @param _lpToken Address of the LP ERC-20 token.\n @param _rewarder Address of the rewarder delegate." + }, + "functionSelector": "ab7de098", + "id": 1147, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "arguments": null, + "id": 1095, + "modifierName": { + "argumentTypes": null, + "id": 1094, + "name": "onlyOwner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 270, + "src": "5384:9:5", + "typeDescriptions": { + "typeIdentifier": "t_modifier$__$", + "typeString": "modifier ()" + } + }, + "nodeType": "ModifierInvocation", + "src": "5384:9:5" + } + ], + "name": "add", + "nodeType": "FunctionDefinition", + "overrides": null, + "parameters": { + "id": 1093, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1088, + "mutability": "mutable", + "name": "allocPoint", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 1147, + "src": "5319:18:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1087, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "5319:7:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 1090, + "mutability": "mutable", + "name": "_lpToken", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 1147, + "src": "5339:15:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + }, + "typeName": { + "contractScope": null, + "id": 1089, + "name": "IERC20", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 337, + "src": "5339:6:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 1092, + "mutability": "mutable", + "name": "_rewarder", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 1147, + "src": "5356:19:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IRewarder_$2167", + "typeString": "contract IRewarder" + }, + "typeName": { + "contractScope": null, + "id": 1091, + "name": "IRewarder", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 2167, + "src": "5356:9:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IRewarder_$2167", + "typeString": "contract IRewarder" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "5318:58:5" + }, + "returnParameters": { + "id": 1096, + "nodeType": "ParameterList", + "parameters": [], + "src": "5394:0:5" + }, + "scope": 2091, + "src": "5306:529:5", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "public" + }, + { + "body": { + "id": 1204, + "nodeType": "Block", + "src": "6324:304:5", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 1172, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 1161, + "name": "totalAllocPoint", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 920, + "src": "6334:15:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 1170, + "name": "_allocPoint", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1152, + "src": "6403:11:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 1164, + "name": "poolInfo", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 902, + "src": "6372:8:5", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_struct$_PoolInfo_$887_storage_$dyn_storage", + "typeString": "struct MasterChefV2.PoolInfo storage ref[] storage ref" + } + }, + "id": 1166, + "indexExpression": { + "argumentTypes": null, + "id": 1165, + "name": "_pid", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1150, + "src": "6381:4:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "6372:14:5", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$887_storage", + "typeString": "struct MasterChefV2.PoolInfo storage ref" + } + }, + "id": 1167, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberName": "allocPoint", + "nodeType": "MemberAccess", + "referencedDeclaration": 886, + "src": "6372:25:5", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + ], + "expression": { + "argumentTypes": null, + "id": 1162, + "name": "totalAllocPoint", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 920, + "src": "6352:15:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 1163, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sub", + "nodeType": "MemberAccess", + "referencedDeclaration": 599, + "src": "6352:19:5", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 1168, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "6352:46:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 1169, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "add", + "nodeType": "MemberAccess", + "referencedDeclaration": 577, + "src": "6352:50:5", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 1171, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "6352:63:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "6334:81:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 1173, + "nodeType": "ExpressionStatement", + "src": "6334:81:5" + }, + { + "expression": { + "argumentTypes": null, + "id": 1181, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 1174, + "name": "poolInfo", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 902, + "src": "6425:8:5", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_struct$_PoolInfo_$887_storage_$dyn_storage", + "typeString": "struct MasterChefV2.PoolInfo storage ref[] storage ref" + } + }, + "id": 1176, + "indexExpression": { + "argumentTypes": null, + "id": 1175, + "name": "_pid", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1150, + "src": "6434:4:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "6425:14:5", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$887_storage", + "typeString": "struct MasterChefV2.PoolInfo storage ref" + } + }, + "id": 1177, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "memberName": "allocPoint", + "nodeType": "MemberAccess", + "referencedDeclaration": 886, + "src": "6425:25:5", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "arguments": [], + "expression": { + "argumentTypes": [], + "expression": { + "argumentTypes": null, + "id": 1178, + "name": "_allocPoint", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1152, + "src": "6453:11:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 1179, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "to64", + "nodeType": "MemberAccess", + "referencedDeclaration": 679, + "src": "6453:16:5", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint64_$bound_to$_t_uint256_$", + "typeString": "function (uint256) pure returns (uint64)" + } + }, + "id": 1180, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "6453:18:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "src": "6425:46:5", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "id": 1182, + "nodeType": "ExpressionStatement", + "src": "6425:46:5" + }, + { + "condition": { + "argumentTypes": null, + "id": 1183, + "name": "overwrite", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1156, + "src": "6485:9:5", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 1191, + "nodeType": "IfStatement", + "src": "6481:46:5", + "trueBody": { + "id": 1190, + "nodeType": "Block", + "src": "6496:31:5", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 1188, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 1184, + "name": "rewarder", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 910, + "src": "6498:8:5", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_contract$_IRewarder_$2167_$dyn_storage", + "typeString": "contract IRewarder[] storage ref" + } + }, + "id": 1186, + "indexExpression": { + "argumentTypes": null, + "id": 1185, + "name": "_pid", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1150, + "src": "6507:4:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "6498:14:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IRewarder_$2167", + "typeString": "contract IRewarder" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "id": 1187, + "name": "_rewarder", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1154, + "src": "6515:9:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IRewarder_$2167", + "typeString": "contract IRewarder" + } + }, + "src": "6498:26:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IRewarder_$2167", + "typeString": "contract IRewarder" + } + }, + "id": 1189, + "nodeType": "ExpressionStatement", + "src": "6498:26:5" + } + ] + } + }, + { + "eventCall": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 1193, + "name": "_pid", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1150, + "src": "6552:4:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "argumentTypes": null, + "id": 1194, + "name": "_allocPoint", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1152, + "src": "6558:11:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "argumentTypes": null, + "condition": { + "argumentTypes": null, + "id": 1195, + "name": "overwrite", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1156, + "src": "6571:9:5", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseExpression": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 1197, + "name": "rewarder", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 910, + "src": "6595:8:5", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_contract$_IRewarder_$2167_$dyn_storage", + "typeString": "contract IRewarder[] storage ref" + } + }, + "id": 1199, + "indexExpression": { + "argumentTypes": null, + "id": 1198, + "name": "_pid", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1150, + "src": "6604:4:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "6595:14:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IRewarder_$2167", + "typeString": "contract IRewarder" + } + }, + "id": 1200, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "Conditional", + "src": "6571:38:5", + "trueExpression": { + "argumentTypes": null, + "id": 1196, + "name": "_rewarder", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1154, + "src": "6583:9:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IRewarder_$2167", + "typeString": "contract IRewarder" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_contract$_IRewarder_$2167", + "typeString": "contract IRewarder" + } + }, + { + "argumentTypes": null, + "id": 1201, + "name": "overwrite", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1156, + "src": "6611:9:5", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_contract$_IRewarder_$2167", + "typeString": "contract IRewarder" + }, + { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + ], + "id": 1192, + "name": "LogSetPool", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 984, + "src": "6541:10:5", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_uint256_$_t_uint256_$_t_contract$_IRewarder_$2167_$_t_bool_$returns$__$", + "typeString": "function (uint256,uint256,contract IRewarder,bool)" + } + }, + "id": 1202, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "6541:80:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1203, + "nodeType": "EmitStatement", + "src": "6536:85:5" + } + ] + }, + "documentation": { + "id": 1148, + "nodeType": "StructuredDocumentation", + "src": "5841:376:5", + "text": "@notice Update the given pool's SUSHI allocation point and `IRewarder` contract. Can only be called by the owner.\n @param _pid The index of the pool. See `poolInfo`.\n @param _allocPoint New AP of the pool.\n @param _rewarder Address of the rewarder delegate.\n @param overwrite True if _rewarder should be `set`. Otherwise `_rewarder` is ignored." + }, + "functionSelector": "88bba42f", + "id": 1205, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "arguments": null, + "id": 1159, + "modifierName": { + "argumentTypes": null, + "id": 1158, + "name": "onlyOwner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 270, + "src": "6314:9:5", + "typeDescriptions": { + "typeIdentifier": "t_modifier$__$", + "typeString": "modifier ()" + } + }, + "nodeType": "ModifierInvocation", + "src": "6314:9:5" + } + ], + "name": "set", + "nodeType": "FunctionDefinition", + "overrides": null, + "parameters": { + "id": 1157, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1150, + "mutability": "mutable", + "name": "_pid", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 1205, + "src": "6235:12:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1149, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "6235:7:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 1152, + "mutability": "mutable", + "name": "_allocPoint", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 1205, + "src": "6249:19:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1151, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "6249:7:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 1154, + "mutability": "mutable", + "name": "_rewarder", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 1205, + "src": "6270:19:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IRewarder_$2167", + "typeString": "contract IRewarder" + }, + "typeName": { + "contractScope": null, + "id": 1153, + "name": "IRewarder", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 2167, + "src": "6270:9:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IRewarder_$2167", + "typeString": "contract IRewarder" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 1156, + "mutability": "mutable", + "name": "overwrite", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 1205, + "src": "6291:14:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "typeName": { + "id": 1155, + "name": "bool", + "nodeType": "ElementaryTypeName", + "src": "6291:4:5", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "6234:72:5" + }, + "returnParameters": { + "id": 1160, + "nodeType": "ParameterList", + "parameters": [], + "src": "6324:0:5" + }, + "scope": 2091, + "src": "6222:406:5", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "public" + }, + { + "body": { + "id": 1217, + "nodeType": "Block", + "src": "6829:37:5", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 1215, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 1213, + "name": "migrator", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 898, + "src": "6839:8:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IMigratorChef_$858", + "typeString": "contract IMigratorChef" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "id": 1214, + "name": "_migrator", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1208, + "src": "6850:9:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IMigratorChef_$858", + "typeString": "contract IMigratorChef" + } + }, + "src": "6839:20:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IMigratorChef_$858", + "typeString": "contract IMigratorChef" + } + }, + "id": 1216, + "nodeType": "ExpressionStatement", + "src": "6839:20:5" + } + ] + }, + "documentation": { + "id": 1206, + "nodeType": "StructuredDocumentation", + "src": "6634:127:5", + "text": "@notice Set the `migrator` contract. Can only be called by the owner.\n @param _migrator The contract address to set." + }, + "functionSelector": "23cf3118", + "id": 1218, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "arguments": null, + "id": 1211, + "modifierName": { + "argumentTypes": null, + "id": 1210, + "name": "onlyOwner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 270, + "src": "6819:9:5", + "typeDescriptions": { + "typeIdentifier": "t_modifier$__$", + "typeString": "modifier ()" + } + }, + "nodeType": "ModifierInvocation", + "src": "6819:9:5" + } + ], + "name": "setMigrator", + "nodeType": "FunctionDefinition", + "overrides": null, + "parameters": { + "id": 1209, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1208, + "mutability": "mutable", + "name": "_migrator", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 1218, + "src": "6787:23:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IMigratorChef_$858", + "typeString": "contract IMigratorChef" + }, + "typeName": { + "contractScope": null, + "id": 1207, + "name": "IMigratorChef", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 858, + "src": "6787:13:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IMigratorChef_$858", + "typeString": "contract IMigratorChef" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "6786:25:5" + }, + "returnParameters": { + "id": 1212, + "nodeType": "ParameterList", + "parameters": [], + "src": "6829:0:5" + }, + "scope": 2091, + "src": "6766:100:5", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "public" + }, + { + "body": { + "id": 1289, + "nodeType": "Block", + "src": "7058:436:5", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 1233, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 1227, + "name": "migrator", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 898, + "src": "7084:8:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IMigratorChef_$858", + "typeString": "contract IMigratorChef" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_IMigratorChef_$858", + "typeString": "contract IMigratorChef" + } + ], + "id": 1226, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "7076:7:5", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 1225, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "7076:7:5", + "typeDescriptions": { + "typeIdentifier": null, + "typeString": null + } + } + }, + "id": 1228, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "7076:17:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "30", + "id": 1231, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "7105:1:5", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 1230, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "7097:7:5", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 1229, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "7097:7:5", + "typeDescriptions": { + "typeIdentifier": null, + "typeString": null + } + } + }, + "id": 1232, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "7097:10:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "src": "7076:31:5", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "argumentTypes": null, + "hexValue": "4d61737465724368656656323a206e6f206d69677261746f7220736574", + "id": 1234, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "7109:31:5", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_db733e5612b6ea507bf1315a9949f7b2f36477c7d6bedf5cbd0acae80e12dfdf", + "typeString": "literal_string \"MasterChefV2: no migrator set\"" + }, + "value": "MasterChefV2: no migrator set" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_stringliteral_db733e5612b6ea507bf1315a9949f7b2f36477c7d6bedf5cbd0acae80e12dfdf", + "typeString": "literal_string \"MasterChefV2: no migrator set\"" + } + ], + "id": 1224, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [ + -18, + -18 + ], + "referencedDeclaration": -18, + "src": "7068:7:5", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", + "typeString": "function (bool,string memory) pure" + } + }, + "id": 1235, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "7068:73:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1236, + "nodeType": "ExpressionStatement", + "src": "7068:73:5" + }, + { + "assignments": [ + 1238 + ], + "declarations": [ + { + "constant": false, + "id": 1238, + "mutability": "mutable", + "name": "_lpToken", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 1289, + "src": "7151:15:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + }, + "typeName": { + "contractScope": null, + "id": 1237, + "name": "IERC20", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 337, + "src": "7151:6:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + }, + "value": null, + "visibility": "internal" + } + ], + "id": 1242, + "initialValue": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 1239, + "name": "lpToken", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 906, + "src": "7169:7:5", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_contract$_IERC20_$337_$dyn_storage", + "typeString": "contract IERC20[] storage ref" + } + }, + "id": 1241, + "indexExpression": { + "argumentTypes": null, + "id": 1240, + "name": "_pid", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1221, + "src": "7177:4:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "7169:13:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "7151:31:5" + }, + { + "assignments": [ + 1244 + ], + "declarations": [ + { + "constant": false, + "id": 1244, + "mutability": "mutable", + "name": "bal", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 1289, + "src": "7192:11:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1243, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "7192:7:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "id": 1252, + "initialValue": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 1249, + "name": "this", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -28, + "src": "7233:4:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_MasterChefV2_$2091", + "typeString": "contract MasterChefV2" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_MasterChefV2_$2091", + "typeString": "contract MasterChefV2" + } + ], + "id": 1248, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "7225:7:5", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 1247, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "7225:7:5", + "typeDescriptions": { + "typeIdentifier": null, + "typeString": null + } + } + }, + "id": 1250, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "7225:13:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "expression": { + "argumentTypes": null, + "id": 1245, + "name": "_lpToken", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1238, + "src": "7206:8:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + }, + "id": 1246, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "balanceOf", + "nodeType": "MemberAccess", + "referencedDeclaration": 285, + "src": "7206:18:5", + "typeDescriptions": { + "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$", + "typeString": "function (address) view external returns (uint256)" + } + }, + "id": 1251, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "7206:33:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "7192:47:5" + }, + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 1258, + "name": "migrator", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 898, + "src": "7274:8:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IMigratorChef_$858", + "typeString": "contract IMigratorChef" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_IMigratorChef_$858", + "typeString": "contract IMigratorChef" + } + ], + "id": 1257, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "7266:7:5", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 1256, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "7266:7:5", + "typeDescriptions": { + "typeIdentifier": null, + "typeString": null + } + } + }, + "id": 1259, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "7266:17:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 1260, + "name": "bal", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1244, + "src": "7285:3:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "id": 1253, + "name": "_lpToken", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1238, + "src": "7249:8:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + }, + "id": 1255, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "approve", + "nodeType": "MemberAccess", + "referencedDeclaration": 303, + "src": "7249:16:5", + "typeDescriptions": { + "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$", + "typeString": "function (address,uint256) external returns (bool)" + } + }, + "id": 1261, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "7249:40:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 1262, + "nodeType": "ExpressionStatement", + "src": "7249:40:5" + }, + { + "assignments": [ + 1264 + ], + "declarations": [ + { + "constant": false, + "id": 1264, + "mutability": "mutable", + "name": "newLpToken", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 1289, + "src": "7299:17:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + }, + "typeName": { + "contractScope": null, + "id": 1263, + "name": "IERC20", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 337, + "src": "7299:6:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + }, + "value": null, + "visibility": "internal" + } + ], + "id": 1269, + "initialValue": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 1267, + "name": "_lpToken", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1238, + "src": "7336:8:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + ], + "expression": { + "argumentTypes": null, + "id": 1265, + "name": "migrator", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 898, + "src": "7319:8:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IMigratorChef_$858", + "typeString": "contract IMigratorChef" + } + }, + "id": 1266, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "migrate", + "nodeType": "MemberAccess", + "referencedDeclaration": 857, + "src": "7319:16:5", + "typeDescriptions": { + "typeIdentifier": "t_function_external_nonpayable$_t_contract$_IERC20_$337_$returns$_t_contract$_IERC20_$337_$", + "typeString": "function (contract IERC20) external returns (contract IERC20)" + } + }, + "id": 1268, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "7319:26:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "7299:46:5" + }, + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 1279, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 1271, + "name": "bal", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1244, + "src": "7363:3:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 1276, + "name": "this", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -28, + "src": "7399:4:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_MasterChefV2_$2091", + "typeString": "contract MasterChefV2" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_MasterChefV2_$2091", + "typeString": "contract MasterChefV2" + } + ], + "id": 1275, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "7391:7:5", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 1274, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "7391:7:5", + "typeDescriptions": { + "typeIdentifier": null, + "typeString": null + } + } + }, + "id": 1277, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "7391:13:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "expression": { + "argumentTypes": null, + "id": 1272, + "name": "newLpToken", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1264, + "src": "7370:10:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + }, + "id": 1273, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "balanceOf", + "nodeType": "MemberAccess", + "referencedDeclaration": 285, + "src": "7370:20:5", + "typeDescriptions": { + "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$", + "typeString": "function (address) view external returns (uint256)" + } + }, + "id": 1278, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "7370:35:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "7363:42:5", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "argumentTypes": null, + "hexValue": "4d61737465724368656656323a206d696772617465642062616c616e6365206d757374206d61746368", + "id": 1280, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "7407:43:5", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_52b373b8abd140702e448133a0dd7129935d941acfcf9ee8942c32166eb56caf", + "typeString": "literal_string \"MasterChefV2: migrated balance must match\"" + }, + "value": "MasterChefV2: migrated balance must match" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_stringliteral_52b373b8abd140702e448133a0dd7129935d941acfcf9ee8942c32166eb56caf", + "typeString": "literal_string \"MasterChefV2: migrated balance must match\"" + } + ], + "id": 1270, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [ + -18, + -18 + ], + "referencedDeclaration": -18, + "src": "7355:7:5", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", + "typeString": "function (bool,string memory) pure" + } + }, + "id": 1281, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "7355:96:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1282, + "nodeType": "ExpressionStatement", + "src": "7355:96:5" + }, + { + "expression": { + "argumentTypes": null, + "id": 1287, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 1283, + "name": "lpToken", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 906, + "src": "7461:7:5", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_contract$_IERC20_$337_$dyn_storage", + "typeString": "contract IERC20[] storage ref" + } + }, + "id": 1285, + "indexExpression": { + "argumentTypes": null, + "id": 1284, + "name": "_pid", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1221, + "src": "7469:4:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "7461:13:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "id": 1286, + "name": "newLpToken", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1264, + "src": "7477:10:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + }, + "src": "7461:26:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + }, + "id": 1288, + "nodeType": "ExpressionStatement", + "src": "7461:26:5" + } + ] + }, + "documentation": { + "id": 1219, + "nodeType": "StructuredDocumentation", + "src": "6872:143:5", + "text": "@notice Migrate LP token to another LP contract through the `migrator` contract.\n @param _pid The index of the pool. See `poolInfo`." + }, + "functionSelector": "454b0608", + "id": 1290, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "migrate", + "nodeType": "FunctionDefinition", + "overrides": null, + "parameters": { + "id": 1222, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1221, + "mutability": "mutable", + "name": "_pid", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 1290, + "src": "7037:12:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1220, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "7037:7:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "7036:14:5" + }, + "returnParameters": { + "id": 1223, + "nodeType": "ParameterList", + "parameters": [], + "src": "7058:0:5" + }, + "scope": 2091, + "src": "7020:474:5", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "public" + }, + { + "body": { + "id": 1396, + "nodeType": "Block", + "src": "7807:701:5", + "statements": [ + { + "assignments": [ + 1301 + ], + "declarations": [ + { + "constant": false, + "id": 1301, + "mutability": "mutable", + "name": "pool", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 1396, + "src": "7817:20:5", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$887_memory_ptr", + "typeString": "struct MasterChefV2.PoolInfo" + }, + "typeName": { + "contractScope": null, + "id": 1300, + "name": "PoolInfo", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 887, + "src": "7817:8:5", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$887_storage_ptr", + "typeString": "struct MasterChefV2.PoolInfo" + } + }, + "value": null, + "visibility": "internal" + } + ], + "id": 1305, + "initialValue": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 1302, + "name": "poolInfo", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 902, + "src": "7840:8:5", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_struct$_PoolInfo_$887_storage_$dyn_storage", + "typeString": "struct MasterChefV2.PoolInfo storage ref[] storage ref" + } + }, + "id": 1304, + "indexExpression": { + "argumentTypes": null, + "id": 1303, + "name": "_pid", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1293, + "src": "7849:4:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "7840:14:5", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$887_storage", + "typeString": "struct MasterChefV2.PoolInfo storage ref" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "7817:37:5" + }, + { + "assignments": [ + 1307 + ], + "declarations": [ + { + "constant": false, + "id": 1307, + "mutability": "mutable", + "name": "user", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 1396, + "src": "7864:21:5", + "stateVariable": false, + "storageLocation": "storage", + "typeDescriptions": { + "typeIdentifier": "t_struct$_UserInfo_$880_storage_ptr", + "typeString": "struct MasterChefV2.UserInfo" + }, + "typeName": { + "contractScope": null, + "id": 1306, + "name": "UserInfo", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 880, + "src": "7864:8:5", + "typeDescriptions": { + "typeIdentifier": "t_struct$_UserInfo_$880_storage_ptr", + "typeString": "struct MasterChefV2.UserInfo" + } + }, + "value": null, + "visibility": "internal" + } + ], + "id": 1313, + "initialValue": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 1308, + "name": "userInfo", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 917, + "src": "7888:8:5", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_uint256_$_t_mapping$_t_address_$_t_struct$_UserInfo_$880_storage_$_$", + "typeString": "mapping(uint256 => mapping(address => struct MasterChefV2.UserInfo storage ref))" + } + }, + "id": 1310, + "indexExpression": { + "argumentTypes": null, + "id": 1309, + "name": "_pid", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1293, + "src": "7897:4:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "7888:14:5", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_UserInfo_$880_storage_$", + "typeString": "mapping(address => struct MasterChefV2.UserInfo storage ref)" + } + }, + "id": 1312, + "indexExpression": { + "argumentTypes": null, + "id": 1311, + "name": "_user", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1295, + "src": "7903:5:5", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "7888:21:5", + "typeDescriptions": { + "typeIdentifier": "t_struct$_UserInfo_$880_storage", + "typeString": "struct MasterChefV2.UserInfo storage ref" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "7864:45:5" + }, + { + "assignments": [ + 1315 + ], + "declarations": [ + { + "constant": false, + "id": 1315, + "mutability": "mutable", + "name": "accSushiPerShare", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 1396, + "src": "7919:24:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1314, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "7919:7:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "id": 1318, + "initialValue": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 1316, + "name": "pool", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1301, + "src": "7946:4:5", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$887_memory_ptr", + "typeString": "struct MasterChefV2.PoolInfo memory" + } + }, + "id": 1317, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberName": "accSushiPerShare", + "nodeType": "MemberAccess", + "referencedDeclaration": 882, + "src": "7946:21:5", + "typeDescriptions": { + "typeIdentifier": "t_uint128", + "typeString": "uint128" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "7919:48:5" + }, + { + "assignments": [ + 1320 + ], + "declarations": [ + { + "constant": false, + "id": 1320, + "mutability": "mutable", + "name": "lpSupply", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 1396, + "src": "7977:16:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1319, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "7977:7:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "id": 1330, + "initialValue": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 1327, + "name": "this", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -28, + "src": "8028:4:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_MasterChefV2_$2091", + "typeString": "contract MasterChefV2" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_MasterChefV2_$2091", + "typeString": "contract MasterChefV2" + } + ], + "id": 1326, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "8020:7:5", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 1325, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "8020:7:5", + "typeDescriptions": { + "typeIdentifier": null, + "typeString": null + } + } + }, + "id": 1328, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "8020:13:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "expression": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 1321, + "name": "lpToken", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 906, + "src": "7996:7:5", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_contract$_IERC20_$337_$dyn_storage", + "typeString": "contract IERC20[] storage ref" + } + }, + "id": 1323, + "indexExpression": { + "argumentTypes": null, + "id": 1322, + "name": "_pid", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1293, + "src": "8004:4:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "7996:13:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + }, + "id": 1324, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "balanceOf", + "nodeType": "MemberAccess", + "referencedDeclaration": 285, + "src": "7996:23:5", + "typeDescriptions": { + "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$", + "typeString": "function (address) view external returns (uint256)" + } + }, + "id": 1329, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "7996:38:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "7977:57:5" + }, + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 1339, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 1335, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 1331, + "name": "block", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -4, + "src": "8048:5:5", + "typeDescriptions": { + "typeIdentifier": "t_magic_block", + "typeString": "block" + } + }, + "id": 1332, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "number", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "8048:12:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 1333, + "name": "pool", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1301, + "src": "8063:4:5", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$887_memory_ptr", + "typeString": "struct MasterChefV2.PoolInfo memory" + } + }, + "id": 1334, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberName": "lastRewardBlock", + "nodeType": "MemberAccess", + "referencedDeclaration": 884, + "src": "8063:20:5", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "src": "8048:35:5", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 1338, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 1336, + "name": "lpSupply", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1320, + "src": "8087:8:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "argumentTypes": null, + "hexValue": "30", + "id": 1337, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "8099:1:5", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "8087:13:5", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "8048:52:5", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 1376, + "nodeType": "IfStatement", + "src": "8044:342:5", + "trueBody": { + "id": 1375, + "nodeType": "Block", + "src": "8102:284:5", + "statements": [ + { + "assignments": [ + 1341 + ], + "declarations": [ + { + "constant": false, + "id": 1341, + "mutability": "mutable", + "name": "blocks", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 1375, + "src": "8116:14:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1340, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "8116:7:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "id": 1348, + "initialValue": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 1345, + "name": "pool", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1301, + "src": "8150:4:5", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$887_memory_ptr", + "typeString": "struct MasterChefV2.PoolInfo memory" + } + }, + "id": 1346, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberName": "lastRewardBlock", + "nodeType": "MemberAccess", + "referencedDeclaration": 884, + "src": "8150:20:5", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + ], + "expression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 1342, + "name": "block", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -4, + "src": "8133:5:5", + "typeDescriptions": { + "typeIdentifier": "t_magic_block", + "typeString": "block" + } + }, + "id": 1343, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "number", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "8133:12:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 1344, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sub", + "nodeType": "MemberAccess", + "referencedDeclaration": 599, + "src": "8133:16:5", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 1347, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "8133:38:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "8116:55:5" + }, + { + "assignments": [ + 1350 + ], + "declarations": [ + { + "constant": false, + "id": 1350, + "mutability": "mutable", + "name": "sushiReward", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 1375, + "src": "8185:19:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1349, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "8185:7:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "id": 1362, + "initialValue": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 1361, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 1357, + "name": "pool", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1301, + "src": "8239:4:5", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$887_memory_ptr", + "typeString": "struct MasterChefV2.PoolInfo memory" + } + }, + "id": 1358, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberName": "allocPoint", + "nodeType": "MemberAccess", + "referencedDeclaration": 886, + "src": "8239:15:5", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + ], + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 1353, + "name": "sushiPerBlock", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1453, + "src": "8218:13:5", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_uint256_$", + "typeString": "function () view returns (uint256)" + } + }, + "id": 1354, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "8218:15:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "id": 1351, + "name": "blocks", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1341, + "src": "8207:6:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 1352, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "mul", + "nodeType": "MemberAccess", + "referencedDeclaration": 627, + "src": "8207:10:5", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 1355, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "8207:27:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 1356, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "mul", + "nodeType": "MemberAccess", + "referencedDeclaration": 627, + "src": "8207:31:5", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 1359, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "8207:48:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "/", + "rightExpression": { + "argumentTypes": null, + "id": 1360, + "name": "totalAllocPoint", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 920, + "src": "8258:15:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "8207:66:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "8185:88:5" + }, + { + "expression": { + "argumentTypes": null, + "id": 1373, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 1363, + "name": "accSushiPerShare", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1315, + "src": "8287:16:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 1371, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 1368, + "name": "ACC_SUSHI_PRECISION", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 926, + "src": "8343:19:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "id": 1366, + "name": "sushiReward", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1350, + "src": "8327:11:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 1367, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "mul", + "nodeType": "MemberAccess", + "referencedDeclaration": 627, + "src": "8327:15:5", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 1369, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "8327:36:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "/", + "rightExpression": { + "argumentTypes": null, + "id": 1370, + "name": "lpSupply", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1320, + "src": "8366:8:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "8327:47:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "id": 1364, + "name": "accSushiPerShare", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1315, + "src": "8306:16:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 1365, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "add", + "nodeType": "MemberAccess", + "referencedDeclaration": 577, + "src": "8306:20:5", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 1372, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "8306:69:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "8287:88:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 1374, + "nodeType": "ExpressionStatement", + "src": "8287:88:5" + } + ] + } + }, + { + "expression": { + "argumentTypes": null, + "id": 1394, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 1377, + "name": "pending", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1298, + "src": "8395:7:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "arguments": [], + "expression": { + "argumentTypes": [], + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 1389, + "name": "user", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1307, + "src": "8473:4:5", + "typeDescriptions": { + "typeIdentifier": "t_struct$_UserInfo_$880_storage_ptr", + "typeString": "struct MasterChefV2.UserInfo storage pointer" + } + }, + "id": 1390, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberName": "rewardDebt", + "nodeType": "MemberAccess", + "referencedDeclaration": 879, + "src": "8473:15:5", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 1386, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 1383, + "name": "accSushiPerShare", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1315, + "src": "8428:16:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 1380, + "name": "user", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1307, + "src": "8412:4:5", + "typeDescriptions": { + "typeIdentifier": "t_struct$_UserInfo_$880_storage_ptr", + "typeString": "struct MasterChefV2.UserInfo storage pointer" + } + }, + "id": 1381, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberName": "amount", + "nodeType": "MemberAccess", + "referencedDeclaration": 877, + "src": "8412:11:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 1382, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "mul", + "nodeType": "MemberAccess", + "referencedDeclaration": 627, + "src": "8412:15:5", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 1384, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "8412:33:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "/", + "rightExpression": { + "argumentTypes": null, + "id": 1385, + "name": "ACC_SUSHI_PRECISION", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 926, + "src": "8448:19:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "8412:55:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 1379, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "8405:6:5", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_int256_$", + "typeString": "type(int256)" + }, + "typeName": { + "id": 1378, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "8405:6:5", + "typeDescriptions": { + "typeIdentifier": null, + "typeString": null + } + } + }, + "id": 1387, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "8405:63:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "id": 1388, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sub", + "nodeType": "MemberAccess", + "referencedDeclaration": 2304, + "src": "8405:67:5", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_int256_$_t_int256_$returns$_t_int256_$bound_to$_t_int256_$", + "typeString": "function (int256,int256) pure returns (int256)" + } + }, + "id": 1391, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "8405:84:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "id": 1392, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "toUInt256", + "nodeType": "MemberAccess", + "referencedDeclaration": 2364, + "src": "8405:94:5", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_int256_$returns$_t_uint256_$bound_to$_t_int256_$", + "typeString": "function (int256) pure returns (uint256)" + } + }, + "id": 1393, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "8405:96:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "8395:106:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 1395, + "nodeType": "ExpressionStatement", + "src": "8395:106:5" + } + ] + }, + "documentation": { + "id": 1291, + "nodeType": "StructuredDocumentation", + "src": "7500:211:5", + "text": "@notice View function to see pending SUSHI on frontend.\n @param _pid The index of the pool. See `poolInfo`.\n @param _user Address of user.\n @return pending SUSHI reward for a given user." + }, + "functionSelector": "195426ec", + "id": 1397, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "pendingSushi", + "nodeType": "FunctionDefinition", + "overrides": null, + "parameters": { + "id": 1296, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1293, + "mutability": "mutable", + "name": "_pid", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 1397, + "src": "7738:12:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1292, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "7738:7:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 1295, + "mutability": "mutable", + "name": "_user", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 1397, + "src": "7752:13:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 1294, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "7752:7:5", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "7737:29:5" + }, + "returnParameters": { + "id": 1299, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1298, + "mutability": "mutable", + "name": "pending", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 1397, + "src": "7790:15:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1297, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "7790:7:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "7789:17:5" + }, + "scope": 2091, + "src": "7716:792:5", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "body": { + "id": 1427, + "nodeType": "Block", + "src": "8745:129:5", + "statements": [ + { + "assignments": [ + 1405 + ], + "declarations": [ + { + "constant": false, + "id": 1405, + "mutability": "mutable", + "name": "len", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 1427, + "src": "8755:11:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1404, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "8755:7:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "id": 1408, + "initialValue": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 1406, + "name": "pids", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1401, + "src": "8769:4:5", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_uint256_$dyn_calldata_ptr", + "typeString": "uint256[] calldata" + } + }, + "id": 1407, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "length", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "8769:11:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "8755:25:5" + }, + { + "body": { + "id": 1425, + "nodeType": "Block", + "src": "8824:44:5", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 1420, + "name": "pids", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1401, + "src": "8849:4:5", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_uint256_$dyn_calldata_ptr", + "typeString": "uint256[] calldata" + } + }, + "id": 1422, + "indexExpression": { + "argumentTypes": null, + "id": 1421, + "name": "i", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1410, + "src": "8854:1:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "8849:7:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 1419, + "name": "updatePool", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1557, + "src": "8838:10:5", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$returns$_t_struct$_PoolInfo_$887_memory_ptr_$", + "typeString": "function (uint256) returns (struct MasterChefV2.PoolInfo memory)" + } + }, + "id": 1423, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "8838:19:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$887_memory_ptr", + "typeString": "struct MasterChefV2.PoolInfo memory" + } + }, + "id": 1424, + "nodeType": "ExpressionStatement", + "src": "8838:19:5" + } + ] + }, + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 1415, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 1413, + "name": "i", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1410, + "src": "8810:1:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<", + "rightExpression": { + "argumentTypes": null, + "id": 1414, + "name": "len", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1405, + "src": "8814:3:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "8810:7:5", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 1426, + "initializationExpression": { + "assignments": [ + 1410 + ], + "declarations": [ + { + "constant": false, + "id": 1410, + "mutability": "mutable", + "name": "i", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 1426, + "src": "8795:9:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1409, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "8795:7:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "id": 1412, + "initialValue": { + "argumentTypes": null, + "hexValue": "30", + "id": 1411, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "8807:1:5", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "nodeType": "VariableDeclarationStatement", + "src": "8795:13:5" + }, + "loopExpression": { + "expression": { + "argumentTypes": null, + "id": 1417, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "++", + "prefix": true, + "src": "8819:3:5", + "subExpression": { + "argumentTypes": null, + "id": 1416, + "name": "i", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1410, + "src": "8821:1:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 1418, + "nodeType": "ExpressionStatement", + "src": "8819:3:5" + }, + "nodeType": "ForStatement", + "src": "8790:78:5" + } + ] + }, + "documentation": { + "id": 1398, + "nodeType": "StructuredDocumentation", + "src": "8514:167:5", + "text": "@notice Update reward variables for all pools. Be careful of gas spending!\n @param pids Pool IDs of all to be updated. Make sure to update all active pools." + }, + "functionSelector": "57a5b58c", + "id": 1428, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "massUpdatePools", + "nodeType": "FunctionDefinition", + "overrides": null, + "parameters": { + "id": 1402, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1401, + "mutability": "mutable", + "name": "pids", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 1428, + "src": "8711:23:5", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_uint256_$dyn_calldata_ptr", + "typeString": "uint256[]" + }, + "typeName": { + "baseType": { + "id": 1399, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "8711:7:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 1400, + "length": null, + "nodeType": "ArrayTypeName", + "src": "8711:9:5", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr", + "typeString": "uint256[]" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "8710:25:5" + }, + "returnParameters": { + "id": 1403, + "nodeType": "ParameterList", + "parameters": [], + "src": "8745:0:5" + }, + "scope": 2091, + "src": "8686:188:5", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "body": { + "id": 1452, + "nodeType": "Block", + "src": "9014:155:5", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 1450, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 1434, + "name": "amount", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1432, + "src": "9024:6:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 1449, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 1442, + "name": "MASTER_PID", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 896, + "src": "9107:10:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "id": 1440, + "name": "MASTER_CHEF", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 890, + "src": "9086:11:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IMasterChef_$2132", + "typeString": "contract IMasterChef" + } + }, + "id": 1441, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "poolInfo", + "nodeType": "MemberAccess", + "referencedDeclaration": 2119, + "src": "9086:20:5", + "typeDescriptions": { + "typeIdentifier": "t_function_external_view$_t_uint256_$returns$_t_struct$_PoolInfo_$2112_memory_ptr_$", + "typeString": "function (uint256) view external returns (struct IMasterChef.PoolInfo memory)" + } + }, + "id": 1443, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "9086:32:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$2112_memory_ptr", + "typeString": "struct IMasterChef.PoolInfo memory" + } + }, + "id": 1444, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberName": "allocPoint", + "nodeType": "MemberAccess", + "referencedDeclaration": 2107, + "src": "9086:43:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 1437, + "name": "MASTERCHEF_SUSHI_PER_BLOCK", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 923, + "src": "9041:26:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 1436, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "9033:7:5", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint256_$", + "typeString": "type(uint256)" + }, + "typeName": { + "id": 1435, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "9033:7:5", + "typeDescriptions": { + "typeIdentifier": null, + "typeString": null + } + } + }, + "id": 1438, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "9033:35:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 1439, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "mul", + "nodeType": "MemberAccess", + "referencedDeclaration": 627, + "src": "9033:52:5", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 1445, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "9033:97:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "/", + "rightExpression": { + "argumentTypes": null, + "arguments": [], + "expression": { + "argumentTypes": [], + "expression": { + "argumentTypes": null, + "id": 1446, + "name": "MASTER_CHEF", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 890, + "src": "9133:11:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IMasterChef_$2132", + "typeString": "contract IMasterChef" + } + }, + "id": 1447, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "totalAllocPoint", + "nodeType": "MemberAccess", + "referencedDeclaration": 2124, + "src": "9133:27:5", + "typeDescriptions": { + "typeIdentifier": "t_function_external_view$__$returns$_t_uint256_$", + "typeString": "function () view external returns (uint256)" + } + }, + "id": 1448, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "9133:29:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "9033:129:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "9024:138:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 1451, + "nodeType": "ExpressionStatement", + "src": "9024:138:5" + } + ] + }, + "documentation": { + "id": 1429, + "nodeType": "StructuredDocumentation", + "src": "8880:67:5", + "text": "@notice Calculates and returns the `amount` of SUSHI per block." + }, + "functionSelector": "b0bcf42a", + "id": 1453, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "sushiPerBlock", + "nodeType": "FunctionDefinition", + "overrides": null, + "parameters": { + "id": 1430, + "nodeType": "ParameterList", + "parameters": [], + "src": "8974:2:5" + }, + "returnParameters": { + "id": 1433, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1432, + "mutability": "mutable", + "name": "amount", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 1453, + "src": "8998:14:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1431, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "8998:7:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "8997:16:5" + }, + "scope": 2091, + "src": "8952:217:5", + "stateMutability": "view", + "virtual": false, + "visibility": "public" + }, + { + "body": { + "id": 1556, + "nodeType": "Block", + "src": "9419:701:5", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 1465, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 1461, + "name": "pool", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1459, + "src": "9429:4:5", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$887_memory_ptr", + "typeString": "struct MasterChefV2.PoolInfo memory" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 1462, + "name": "poolInfo", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 902, + "src": "9436:8:5", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_struct$_PoolInfo_$887_storage_$dyn_storage", + "typeString": "struct MasterChefV2.PoolInfo storage ref[] storage ref" + } + }, + "id": 1464, + "indexExpression": { + "argumentTypes": null, + "id": 1463, + "name": "pid", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1456, + "src": "9445:3:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "9436:13:5", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$887_storage", + "typeString": "struct MasterChefV2.PoolInfo storage ref" + } + }, + "src": "9429:20:5", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$887_memory_ptr", + "typeString": "struct MasterChefV2.PoolInfo memory" + } + }, + "id": 1466, + "nodeType": "ExpressionStatement", + "src": "9429:20:5" + }, + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 1471, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 1467, + "name": "block", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -4, + "src": "9463:5:5", + "typeDescriptions": { + "typeIdentifier": "t_magic_block", + "typeString": "block" + } + }, + "id": 1468, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "number", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "9463:12:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 1469, + "name": "pool", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1459, + "src": "9478:4:5", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$887_memory_ptr", + "typeString": "struct MasterChefV2.PoolInfo memory" + } + }, + "id": 1470, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberName": "lastRewardBlock", + "nodeType": "MemberAccess", + "referencedDeclaration": 884, + "src": "9478:20:5", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "src": "9463:35:5", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 1555, + "nodeType": "IfStatement", + "src": "9459:655:5", + "trueBody": { + "id": 1554, + "nodeType": "Block", + "src": "9500:614:5", + "statements": [ + { + "assignments": [ + 1473 + ], + "declarations": [ + { + "constant": false, + "id": 1473, + "mutability": "mutable", + "name": "lpSupply", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 1554, + "src": "9514:16:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1472, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "9514:7:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "id": 1483, + "initialValue": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 1480, + "name": "this", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -28, + "src": "9564:4:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_MasterChefV2_$2091", + "typeString": "contract MasterChefV2" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_MasterChefV2_$2091", + "typeString": "contract MasterChefV2" + } + ], + "id": 1479, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "9556:7:5", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 1478, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "9556:7:5", + "typeDescriptions": { + "typeIdentifier": null, + "typeString": null + } + } + }, + "id": 1481, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "9556:13:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "expression": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 1474, + "name": "lpToken", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 906, + "src": "9533:7:5", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_contract$_IERC20_$337_$dyn_storage", + "typeString": "contract IERC20[] storage ref" + } + }, + "id": 1476, + "indexExpression": { + "argumentTypes": null, + "id": 1475, + "name": "pid", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1456, + "src": "9541:3:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "9533:12:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + }, + "id": 1477, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "balanceOf", + "nodeType": "MemberAccess", + "referencedDeclaration": 285, + "src": "9533:22:5", + "typeDescriptions": { + "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$", + "typeString": "function (address) view external returns (uint256)" + } + }, + "id": 1482, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "9533:37:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "9514:56:5" + }, + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 1486, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 1484, + "name": "lpSupply", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1473, + "src": "9588:8:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "argumentTypes": null, + "hexValue": "30", + "id": 1485, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "9599:1:5", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "9588:12:5", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 1529, + "nodeType": "IfStatement", + "src": "9584:338:5", + "trueBody": { + "id": 1528, + "nodeType": "Block", + "src": "9602:320:5", + "statements": [ + { + "assignments": [ + 1488 + ], + "declarations": [ + { + "constant": false, + "id": 1488, + "mutability": "mutable", + "name": "blocks", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 1528, + "src": "9620:14:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1487, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "9620:7:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "id": 1495, + "initialValue": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 1492, + "name": "pool", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1459, + "src": "9654:4:5", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$887_memory_ptr", + "typeString": "struct MasterChefV2.PoolInfo memory" + } + }, + "id": 1493, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberName": "lastRewardBlock", + "nodeType": "MemberAccess", + "referencedDeclaration": 884, + "src": "9654:20:5", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + ], + "expression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 1489, + "name": "block", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -4, + "src": "9637:5:5", + "typeDescriptions": { + "typeIdentifier": "t_magic_block", + "typeString": "block" + } + }, + "id": 1490, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "number", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "9637:12:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 1491, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sub", + "nodeType": "MemberAccess", + "referencedDeclaration": 599, + "src": "9637:16:5", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 1494, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "9637:38:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "9620:55:5" + }, + { + "assignments": [ + 1497 + ], + "declarations": [ + { + "constant": false, + "id": 1497, + "mutability": "mutable", + "name": "sushiReward", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 1528, + "src": "9693:19:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1496, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "9693:7:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "id": 1509, + "initialValue": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 1508, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 1504, + "name": "pool", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1459, + "src": "9747:4:5", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$887_memory_ptr", + "typeString": "struct MasterChefV2.PoolInfo memory" + } + }, + "id": 1505, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberName": "allocPoint", + "nodeType": "MemberAccess", + "referencedDeclaration": 886, + "src": "9747:15:5", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + ], + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 1500, + "name": "sushiPerBlock", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1453, + "src": "9726:13:5", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$__$returns$_t_uint256_$", + "typeString": "function () view returns (uint256)" + } + }, + "id": 1501, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "9726:15:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "id": 1498, + "name": "blocks", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1488, + "src": "9715:6:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 1499, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "mul", + "nodeType": "MemberAccess", + "referencedDeclaration": 627, + "src": "9715:10:5", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 1502, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "9715:27:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 1503, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "mul", + "nodeType": "MemberAccess", + "referencedDeclaration": 627, + "src": "9715:31:5", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 1506, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "9715:48:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "/", + "rightExpression": { + "argumentTypes": null, + "id": 1507, + "name": "totalAllocPoint", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 920, + "src": "9766:15:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "9715:66:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "9693:88:5" + }, + { + "expression": { + "argumentTypes": null, + "id": 1526, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 1510, + "name": "pool", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1459, + "src": "9799:4:5", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$887_memory_ptr", + "typeString": "struct MasterChefV2.PoolInfo memory" + } + }, + "id": 1512, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "memberName": "accSushiPerShare", + "nodeType": "MemberAccess", + "referencedDeclaration": 882, + "src": "9799:21:5", + "typeDescriptions": { + "typeIdentifier": "t_uint128", + "typeString": "uint128" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "arguments": [], + "expression": { + "argumentTypes": [], + "expression": { + "argumentTypes": null, + "components": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 1521, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 1518, + "name": "ACC_SUSHI_PRECISION", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 926, + "src": "9866:19:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "id": 1516, + "name": "sushiReward", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1497, + "src": "9850:11:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 1517, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "mul", + "nodeType": "MemberAccess", + "referencedDeclaration": 627, + "src": "9850:15:5", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 1519, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "9850:36:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "/", + "rightExpression": { + "argumentTypes": null, + "id": 1520, + "name": "lpSupply", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1473, + "src": "9889:8:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "9850:47:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 1522, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "9849:49:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 1523, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "to128", + "nodeType": "MemberAccess", + "referencedDeclaration": 653, + "src": "9849:55:5", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$", + "typeString": "function (uint256) pure returns (uint128)" + } + }, + "id": 1524, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "9849:57:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint128", + "typeString": "uint128" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint128", + "typeString": "uint128" + } + ], + "expression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 1513, + "name": "pool", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1459, + "src": "9823:4:5", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$887_memory_ptr", + "typeString": "struct MasterChefV2.PoolInfo memory" + } + }, + "id": 1514, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberName": "accSushiPerShare", + "nodeType": "MemberAccess", + "referencedDeclaration": 882, + "src": "9823:21:5", + "typeDescriptions": { + "typeIdentifier": "t_uint128", + "typeString": "uint128" + } + }, + "id": 1515, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "add", + "nodeType": "MemberAccess", + "referencedDeclaration": 728, + "src": "9823:25:5", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint128_$_t_uint128_$returns$_t_uint128_$bound_to$_t_uint128_$", + "typeString": "function (uint128,uint128) pure returns (uint128)" + } + }, + "id": 1525, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "9823:84:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint128", + "typeString": "uint128" + } + }, + "src": "9799:108:5", + "typeDescriptions": { + "typeIdentifier": "t_uint128", + "typeString": "uint128" + } + }, + "id": 1527, + "nodeType": "ExpressionStatement", + "src": "9799:108:5" + } + ] + } + }, + { + "expression": { + "argumentTypes": null, + "id": 1537, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 1530, + "name": "pool", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1459, + "src": "9935:4:5", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$887_memory_ptr", + "typeString": "struct MasterChefV2.PoolInfo memory" + } + }, + "id": 1532, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "memberName": "lastRewardBlock", + "nodeType": "MemberAccess", + "referencedDeclaration": 884, + "src": "9935:20:5", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "arguments": [], + "expression": { + "argumentTypes": [], + "expression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 1533, + "name": "block", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -4, + "src": "9958:5:5", + "typeDescriptions": { + "typeIdentifier": "t_magic_block", + "typeString": "block" + } + }, + "id": 1534, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "number", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "9958:12:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 1535, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "to64", + "nodeType": "MemberAccess", + "referencedDeclaration": 679, + "src": "9958:17:5", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint64_$bound_to$_t_uint256_$", + "typeString": "function (uint256) pure returns (uint64)" + } + }, + "id": 1536, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "9958:19:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "src": "9935:42:5", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "id": 1538, + "nodeType": "ExpressionStatement", + "src": "9935:42:5" + }, + { + "expression": { + "argumentTypes": null, + "id": 1543, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 1539, + "name": "poolInfo", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 902, + "src": "9991:8:5", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_struct$_PoolInfo_$887_storage_$dyn_storage", + "typeString": "struct MasterChefV2.PoolInfo storage ref[] storage ref" + } + }, + "id": 1541, + "indexExpression": { + "argumentTypes": null, + "id": 1540, + "name": "pid", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1456, + "src": "10000:3:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "9991:13:5", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$887_storage", + "typeString": "struct MasterChefV2.PoolInfo storage ref" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "id": 1542, + "name": "pool", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1459, + "src": "10007:4:5", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$887_memory_ptr", + "typeString": "struct MasterChefV2.PoolInfo memory" + } + }, + "src": "9991:20:5", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$887_storage", + "typeString": "struct MasterChefV2.PoolInfo storage ref" + } + }, + "id": 1544, + "nodeType": "ExpressionStatement", + "src": "9991:20:5" + }, + { + "eventCall": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 1546, + "name": "pid", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1456, + "src": "10044:3:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 1547, + "name": "pool", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1459, + "src": "10049:4:5", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$887_memory_ptr", + "typeString": "struct MasterChefV2.PoolInfo memory" + } + }, + "id": 1548, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberName": "lastRewardBlock", + "nodeType": "MemberAccess", + "referencedDeclaration": 884, + "src": "10049:20:5", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + { + "argumentTypes": null, + "id": 1549, + "name": "lpSupply", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1473, + "src": "10071:8:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 1550, + "name": "pool", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1459, + "src": "10081:4:5", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$887_memory_ptr", + "typeString": "struct MasterChefV2.PoolInfo memory" + } + }, + "id": 1551, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberName": "accSushiPerShare", + "nodeType": "MemberAccess", + "referencedDeclaration": 882, + "src": "10081:21:5", + "typeDescriptions": { + "typeIdentifier": "t_uint128", + "typeString": "uint128" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint128", + "typeString": "uint128" + } + ], + "id": 1545, + "name": "LogUpdatePool", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 994, + "src": "10030:13:5", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_uint256_$_t_uint64_$_t_uint256_$_t_uint256_$returns$__$", + "typeString": "function (uint256,uint64,uint256,uint256)" + } + }, + "id": 1552, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "10030:73:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1553, + "nodeType": "EmitStatement", + "src": "10025:78:5" + } + ] + } + } + ] + }, + "documentation": { + "id": 1454, + "nodeType": "StructuredDocumentation", + "src": "9175:168:5", + "text": "@notice Update reward variables of the given pool.\n @param pid The index of the pool. See `poolInfo`.\n @return pool Returns the pool that was updated." + }, + "functionSelector": "51eb05a6", + "id": 1557, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "updatePool", + "nodeType": "FunctionDefinition", + "overrides": null, + "parameters": { + "id": 1457, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1456, + "mutability": "mutable", + "name": "pid", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 1557, + "src": "9368:11:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1455, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "9368:7:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "9367:13:5" + }, + "returnParameters": { + "id": 1460, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1459, + "mutability": "mutable", + "name": "pool", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 1557, + "src": "9397:20:5", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$887_memory_ptr", + "typeString": "struct MasterChefV2.PoolInfo" + }, + "typeName": { + "contractScope": null, + "id": 1458, + "name": "PoolInfo", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 887, + "src": "9397:8:5", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$887_storage_ptr", + "typeString": "struct MasterChefV2.PoolInfo" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "9396:22:5" + }, + "scope": 2091, + "src": "9348:772:5", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "public" + }, + { + "body": { + "id": 1659, + "nodeType": "Block", + "src": "10423:606:5", + "statements": [ + { + "assignments": [ + 1568 + ], + "declarations": [ + { + "constant": false, + "id": 1568, + "mutability": "mutable", + "name": "pool", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 1659, + "src": "10433:20:5", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$887_memory_ptr", + "typeString": "struct MasterChefV2.PoolInfo" + }, + "typeName": { + "contractScope": null, + "id": 1567, + "name": "PoolInfo", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 887, + "src": "10433:8:5", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$887_storage_ptr", + "typeString": "struct MasterChefV2.PoolInfo" + } + }, + "value": null, + "visibility": "internal" + } + ], + "id": 1572, + "initialValue": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 1570, + "name": "pid", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1560, + "src": "10467:3:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 1569, + "name": "updatePool", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1557, + "src": "10456:10:5", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$returns$_t_struct$_PoolInfo_$887_memory_ptr_$", + "typeString": "function (uint256) returns (struct MasterChefV2.PoolInfo memory)" + } + }, + "id": 1571, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "10456:15:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$887_memory_ptr", + "typeString": "struct MasterChefV2.PoolInfo memory" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "10433:38:5" + }, + { + "assignments": [ + 1574 + ], + "declarations": [ + { + "constant": false, + "id": 1574, + "mutability": "mutable", + "name": "user", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 1659, + "src": "10481:21:5", + "stateVariable": false, + "storageLocation": "storage", + "typeDescriptions": { + "typeIdentifier": "t_struct$_UserInfo_$880_storage_ptr", + "typeString": "struct MasterChefV2.UserInfo" + }, + "typeName": { + "contractScope": null, + "id": 1573, + "name": "UserInfo", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 880, + "src": "10481:8:5", + "typeDescriptions": { + "typeIdentifier": "t_struct$_UserInfo_$880_storage_ptr", + "typeString": "struct MasterChefV2.UserInfo" + } + }, + "value": null, + "visibility": "internal" + } + ], + "id": 1580, + "initialValue": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 1575, + "name": "userInfo", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 917, + "src": "10505:8:5", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_uint256_$_t_mapping$_t_address_$_t_struct$_UserInfo_$880_storage_$_$", + "typeString": "mapping(uint256 => mapping(address => struct MasterChefV2.UserInfo storage ref))" + } + }, + "id": 1577, + "indexExpression": { + "argumentTypes": null, + "id": 1576, + "name": "pid", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1560, + "src": "10514:3:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "10505:13:5", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_UserInfo_$880_storage_$", + "typeString": "mapping(address => struct MasterChefV2.UserInfo storage ref)" + } + }, + "id": 1579, + "indexExpression": { + "argumentTypes": null, + "id": 1578, + "name": "to", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1564, + "src": "10519:2:5", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "10505:17:5", + "typeDescriptions": { + "typeIdentifier": "t_struct$_UserInfo_$880_storage", + "typeString": "struct MasterChefV2.UserInfo storage ref" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "10481:41:5" + }, + { + "expression": { + "argumentTypes": null, + "id": 1589, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 1581, + "name": "user", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1574, + "src": "10552:4:5", + "typeDescriptions": { + "typeIdentifier": "t_struct$_UserInfo_$880_storage_ptr", + "typeString": "struct MasterChefV2.UserInfo storage pointer" + } + }, + "id": 1583, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "memberName": "amount", + "nodeType": "MemberAccess", + "referencedDeclaration": 877, + "src": "10552:11:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 1587, + "name": "amount", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1562, + "src": "10582:6:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 1584, + "name": "user", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1574, + "src": "10566:4:5", + "typeDescriptions": { + "typeIdentifier": "t_struct$_UserInfo_$880_storage_ptr", + "typeString": "struct MasterChefV2.UserInfo storage pointer" + } + }, + "id": 1585, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberName": "amount", + "nodeType": "MemberAccess", + "referencedDeclaration": 877, + "src": "10566:11:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 1586, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "add", + "nodeType": "MemberAccess", + "referencedDeclaration": 577, + "src": "10566:15:5", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 1588, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "10566:23:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "10552:37:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 1590, + "nodeType": "ExpressionStatement", + "src": "10552:37:5" + }, + { + "expression": { + "argumentTypes": null, + "id": 1608, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 1591, + "name": "user", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1574, + "src": "10599:4:5", + "typeDescriptions": { + "typeIdentifier": "t_struct$_UserInfo_$880_storage_ptr", + "typeString": "struct MasterChefV2.UserInfo storage pointer" + } + }, + "id": 1593, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "memberName": "rewardDebt", + "nodeType": "MemberAccess", + "referencedDeclaration": 879, + "src": "10599:15:5", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 1605, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 1601, + "name": "pool", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1568, + "src": "10655:4:5", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$887_memory_ptr", + "typeString": "struct MasterChefV2.PoolInfo memory" + } + }, + "id": 1602, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberName": "accSushiPerShare", + "nodeType": "MemberAccess", + "referencedDeclaration": 882, + "src": "10655:21:5", + "typeDescriptions": { + "typeIdentifier": "t_uint128", + "typeString": "uint128" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint128", + "typeString": "uint128" + } + ], + "expression": { + "argumentTypes": null, + "id": 1599, + "name": "amount", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1562, + "src": "10644:6:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 1600, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "mul", + "nodeType": "MemberAccess", + "referencedDeclaration": 627, + "src": "10644:10:5", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 1603, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "10644:33:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "/", + "rightExpression": { + "argumentTypes": null, + "id": 1604, + "name": "ACC_SUSHI_PRECISION", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 926, + "src": "10680:19:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "10644:55:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 1598, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "10637:6:5", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_int256_$", + "typeString": "type(int256)" + }, + "typeName": { + "id": 1597, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "10637:6:5", + "typeDescriptions": { + "typeIdentifier": null, + "typeString": null + } + } + }, + "id": 1606, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "10637:63:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "expression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 1594, + "name": "user", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1574, + "src": "10617:4:5", + "typeDescriptions": { + "typeIdentifier": "t_struct$_UserInfo_$880_storage_ptr", + "typeString": "struct MasterChefV2.UserInfo storage pointer" + } + }, + "id": 1595, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberName": "rewardDebt", + "nodeType": "MemberAccess", + "referencedDeclaration": 879, + "src": "10617:15:5", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "id": 1596, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "add", + "nodeType": "MemberAccess", + "referencedDeclaration": 2344, + "src": "10617:19:5", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_int256_$_t_int256_$returns$_t_int256_$bound_to$_t_int256_$", + "typeString": "function (int256,int256) pure returns (int256)" + } + }, + "id": 1607, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "10617:84:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "src": "10599:102:5", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "id": 1609, + "nodeType": "ExpressionStatement", + "src": "10599:102:5" + }, + { + "assignments": [ + 1611 + ], + "declarations": [ + { + "constant": false, + "id": 1611, + "mutability": "mutable", + "name": "_rewarder", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 1659, + "src": "10736:19:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IRewarder_$2167", + "typeString": "contract IRewarder" + }, + "typeName": { + "contractScope": null, + "id": 1610, + "name": "IRewarder", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 2167, + "src": "10736:9:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IRewarder_$2167", + "typeString": "contract IRewarder" + } + }, + "value": null, + "visibility": "internal" + } + ], + "id": 1615, + "initialValue": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 1612, + "name": "rewarder", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 910, + "src": "10758:8:5", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_contract$_IRewarder_$2167_$dyn_storage", + "typeString": "contract IRewarder[] storage ref" + } + }, + "id": 1614, + "indexExpression": { + "argumentTypes": null, + "id": 1613, + "name": "pid", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1560, + "src": "10767:3:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "10758:13:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IRewarder_$2167", + "typeString": "contract IRewarder" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "10736:35:5" + }, + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 1624, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 1618, + "name": "_rewarder", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1611, + "src": "10793:9:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IRewarder_$2167", + "typeString": "contract IRewarder" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_IRewarder_$2167", + "typeString": "contract IRewarder" + } + ], + "id": 1617, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "10785:7:5", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 1616, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "10785:7:5", + "typeDescriptions": { + "typeIdentifier": null, + "typeString": null + } + } + }, + "id": 1619, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "10785:18:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "30", + "id": 1622, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "10815:1:5", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 1621, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "10807:7:5", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 1620, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "10807:7:5", + "typeDescriptions": { + "typeIdentifier": null, + "typeString": null + } + } + }, + "id": 1623, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "10807:10:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "src": "10785:32:5", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 1637, + "nodeType": "IfStatement", + "src": "10781:115:5", + "trueBody": { + "id": 1636, + "nodeType": "Block", + "src": "10819:77:5", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 1628, + "name": "pid", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1560, + "src": "10857:3:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "argumentTypes": null, + "id": 1629, + "name": "to", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1564, + "src": "10862:2:5", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 1630, + "name": "to", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1564, + "src": "10866:2:5", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "hexValue": "30", + "id": 1631, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "10870:1:5", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 1632, + "name": "user", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1574, + "src": "10873:4:5", + "typeDescriptions": { + "typeIdentifier": "t_struct$_UserInfo_$880_storage_ptr", + "typeString": "struct MasterChefV2.UserInfo storage pointer" + } + }, + "id": 1633, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberName": "amount", + "nodeType": "MemberAccess", + "referencedDeclaration": 877, + "src": "10873:11:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "id": 1625, + "name": "_rewarder", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1611, + "src": "10833:9:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IRewarder_$2167", + "typeString": "contract IRewarder" + } + }, + "id": 1627, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "onSushiReward", + "nodeType": "MemberAccess", + "referencedDeclaration": 2151, + "src": "10833:23:5", + "typeDescriptions": { + "typeIdentifier": "t_function_external_nonpayable$_t_uint256_$_t_address_$_t_address_$_t_uint256_$_t_uint256_$returns$__$", + "typeString": "function (uint256,address,address,uint256,uint256) external" + } + }, + "id": 1634, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "10833:52:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1635, + "nodeType": "ExpressionStatement", + "src": "10833:52:5" + } + ] + } + }, + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 1642, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -15, + "src": "10936:3:5", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 1643, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "10936:10:5", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 1646, + "name": "this", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -28, + "src": "10956:4:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_MasterChefV2_$2091", + "typeString": "contract MasterChefV2" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_MasterChefV2_$2091", + "typeString": "contract MasterChefV2" + } + ], + "id": 1645, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "10948:7:5", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 1644, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "10948:7:5", + "typeDescriptions": { + "typeIdentifier": null, + "typeString": null + } + } + }, + "id": 1647, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "10948:13:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 1648, + "name": "amount", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1562, + "src": "10963:6:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 1638, + "name": "lpToken", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 906, + "src": "10906:7:5", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_contract$_IERC20_$337_$dyn_storage", + "typeString": "contract IERC20[] storage ref" + } + }, + "id": 1640, + "indexExpression": { + "argumentTypes": null, + "id": 1639, + "name": "pid", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1560, + "src": "10914:3:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "10906:12:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + }, + "id": 1641, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "safeTransferFrom", + "nodeType": "MemberAccess", + "referencedDeclaration": 552, + "src": "10906:29:5", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20_$337_$_t_address_$_t_address_$_t_uint256_$returns$__$bound_to$_t_contract$_IERC20_$337_$", + "typeString": "function (contract IERC20,address,address,uint256)" + } + }, + "id": 1649, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "10906:64:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1650, + "nodeType": "ExpressionStatement", + "src": "10906:64:5" + }, + { + "eventCall": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 1652, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -15, + "src": "10994:3:5", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 1653, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "10994:10:5", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + { + "argumentTypes": null, + "id": 1654, + "name": "pid", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1560, + "src": "11006:3:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "argumentTypes": null, + "id": 1655, + "name": "amount", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1562, + "src": "11011:6:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "argumentTypes": null, + "id": 1656, + "name": "to", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1564, + "src": "11019:2:5", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 1651, + "name": "Deposit", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 936, + "src": "10986:7:5", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint256_$_t_uint256_$_t_address_$returns$__$", + "typeString": "function (address,uint256,uint256,address)" + } + }, + "id": 1657, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "10986:36:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1658, + "nodeType": "EmitStatement", + "src": "10981:41:5" + } + ] + }, + "documentation": { + "id": 1558, + "nodeType": "StructuredDocumentation", + "src": "10126:227:5", + "text": "@notice Deposit LP tokens to MCV2 for SUSHI allocation.\n @param pid The index of the pool. See `poolInfo`.\n @param amount LP token amount to deposit.\n @param to The receiver of `amount` deposit benefit." + }, + "functionSelector": "8dbdbe6d", + "id": 1660, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "deposit", + "nodeType": "FunctionDefinition", + "overrides": null, + "parameters": { + "id": 1565, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1560, + "mutability": "mutable", + "name": "pid", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 1660, + "src": "10375:11:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1559, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "10375:7:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 1562, + "mutability": "mutable", + "name": "amount", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 1660, + "src": "10388:14:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1561, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "10388:7:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 1564, + "mutability": "mutable", + "name": "to", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 1660, + "src": "10404:10:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 1563, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "10404:7:5", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "10374:41:5" + }, + "returnParameters": { + "id": 1566, + "nodeType": "ParameterList", + "parameters": [], + "src": "10423:0:5" + }, + "scope": 2091, + "src": "10358:671:5", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "public" + }, + { + "body": { + "id": 1759, + "nodeType": "Block", + "src": "11301:604:5", + "statements": [ + { + "assignments": [ + 1671 + ], + "declarations": [ + { + "constant": false, + "id": 1671, + "mutability": "mutable", + "name": "pool", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 1759, + "src": "11311:20:5", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$887_memory_ptr", + "typeString": "struct MasterChefV2.PoolInfo" + }, + "typeName": { + "contractScope": null, + "id": 1670, + "name": "PoolInfo", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 887, + "src": "11311:8:5", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$887_storage_ptr", + "typeString": "struct MasterChefV2.PoolInfo" + } + }, + "value": null, + "visibility": "internal" + } + ], + "id": 1675, + "initialValue": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 1673, + "name": "pid", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1663, + "src": "11345:3:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 1672, + "name": "updatePool", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1557, + "src": "11334:10:5", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$returns$_t_struct$_PoolInfo_$887_memory_ptr_$", + "typeString": "function (uint256) returns (struct MasterChefV2.PoolInfo memory)" + } + }, + "id": 1674, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "11334:15:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$887_memory_ptr", + "typeString": "struct MasterChefV2.PoolInfo memory" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "11311:38:5" + }, + { + "assignments": [ + 1677 + ], + "declarations": [ + { + "constant": false, + "id": 1677, + "mutability": "mutable", + "name": "user", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 1759, + "src": "11359:21:5", + "stateVariable": false, + "storageLocation": "storage", + "typeDescriptions": { + "typeIdentifier": "t_struct$_UserInfo_$880_storage_ptr", + "typeString": "struct MasterChefV2.UserInfo" + }, + "typeName": { + "contractScope": null, + "id": 1676, + "name": "UserInfo", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 880, + "src": "11359:8:5", + "typeDescriptions": { + "typeIdentifier": "t_struct$_UserInfo_$880_storage_ptr", + "typeString": "struct MasterChefV2.UserInfo" + } + }, + "value": null, + "visibility": "internal" + } + ], + "id": 1684, + "initialValue": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 1678, + "name": "userInfo", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 917, + "src": "11383:8:5", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_uint256_$_t_mapping$_t_address_$_t_struct$_UserInfo_$880_storage_$_$", + "typeString": "mapping(uint256 => mapping(address => struct MasterChefV2.UserInfo storage ref))" + } + }, + "id": 1680, + "indexExpression": { + "argumentTypes": null, + "id": 1679, + "name": "pid", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1663, + "src": "11392:3:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "11383:13:5", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_UserInfo_$880_storage_$", + "typeString": "mapping(address => struct MasterChefV2.UserInfo storage ref)" + } + }, + "id": 1683, + "indexExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 1681, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -15, + "src": "11397:3:5", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 1682, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "11397:10:5", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "11383:25:5", + "typeDescriptions": { + "typeIdentifier": "t_struct$_UserInfo_$880_storage", + "typeString": "struct MasterChefV2.UserInfo storage ref" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "11359:49:5" + }, + { + "expression": { + "argumentTypes": null, + "id": 1702, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 1685, + "name": "user", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1677, + "src": "11438:4:5", + "typeDescriptions": { + "typeIdentifier": "t_struct$_UserInfo_$880_storage_ptr", + "typeString": "struct MasterChefV2.UserInfo storage pointer" + } + }, + "id": 1687, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "memberName": "rewardDebt", + "nodeType": "MemberAccess", + "referencedDeclaration": 879, + "src": "11438:15:5", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 1699, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 1695, + "name": "pool", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1671, + "src": "11494:4:5", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$887_memory_ptr", + "typeString": "struct MasterChefV2.PoolInfo memory" + } + }, + "id": 1696, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberName": "accSushiPerShare", + "nodeType": "MemberAccess", + "referencedDeclaration": 882, + "src": "11494:21:5", + "typeDescriptions": { + "typeIdentifier": "t_uint128", + "typeString": "uint128" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint128", + "typeString": "uint128" + } + ], + "expression": { + "argumentTypes": null, + "id": 1693, + "name": "amount", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1665, + "src": "11483:6:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 1694, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "mul", + "nodeType": "MemberAccess", + "referencedDeclaration": 627, + "src": "11483:10:5", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 1697, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "11483:33:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "/", + "rightExpression": { + "argumentTypes": null, + "id": 1698, + "name": "ACC_SUSHI_PRECISION", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 926, + "src": "11519:19:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "11483:55:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 1692, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "11476:6:5", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_int256_$", + "typeString": "type(int256)" + }, + "typeName": { + "id": 1691, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "11476:6:5", + "typeDescriptions": { + "typeIdentifier": null, + "typeString": null + } + } + }, + "id": 1700, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "11476:63:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "expression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 1688, + "name": "user", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1677, + "src": "11456:4:5", + "typeDescriptions": { + "typeIdentifier": "t_struct$_UserInfo_$880_storage_ptr", + "typeString": "struct MasterChefV2.UserInfo storage pointer" + } + }, + "id": 1689, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberName": "rewardDebt", + "nodeType": "MemberAccess", + "referencedDeclaration": 879, + "src": "11456:15:5", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "id": 1690, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sub", + "nodeType": "MemberAccess", + "referencedDeclaration": 2304, + "src": "11456:19:5", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_int256_$_t_int256_$returns$_t_int256_$bound_to$_t_int256_$", + "typeString": "function (int256,int256) pure returns (int256)" + } + }, + "id": 1701, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "11456:84:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "src": "11438:102:5", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "id": 1703, + "nodeType": "ExpressionStatement", + "src": "11438:102:5" + }, + { + "expression": { + "argumentTypes": null, + "id": 1712, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 1704, + "name": "user", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1677, + "src": "11550:4:5", + "typeDescriptions": { + "typeIdentifier": "t_struct$_UserInfo_$880_storage_ptr", + "typeString": "struct MasterChefV2.UserInfo storage pointer" + } + }, + "id": 1706, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "memberName": "amount", + "nodeType": "MemberAccess", + "referencedDeclaration": 877, + "src": "11550:11:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 1710, + "name": "amount", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1665, + "src": "11580:6:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 1707, + "name": "user", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1677, + "src": "11564:4:5", + "typeDescriptions": { + "typeIdentifier": "t_struct$_UserInfo_$880_storage_ptr", + "typeString": "struct MasterChefV2.UserInfo storage pointer" + } + }, + "id": 1708, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberName": "amount", + "nodeType": "MemberAccess", + "referencedDeclaration": 877, + "src": "11564:11:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 1709, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sub", + "nodeType": "MemberAccess", + "referencedDeclaration": 599, + "src": "11564:15:5", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 1711, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "11564:23:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "11550:37:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 1713, + "nodeType": "ExpressionStatement", + "src": "11550:37:5" + }, + { + "assignments": [ + 1715 + ], + "declarations": [ + { + "constant": false, + "id": 1715, + "mutability": "mutable", + "name": "_rewarder", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 1759, + "src": "11622:19:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IRewarder_$2167", + "typeString": "contract IRewarder" + }, + "typeName": { + "contractScope": null, + "id": 1714, + "name": "IRewarder", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 2167, + "src": "11622:9:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IRewarder_$2167", + "typeString": "contract IRewarder" + } + }, + "value": null, + "visibility": "internal" + } + ], + "id": 1719, + "initialValue": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 1716, + "name": "rewarder", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 910, + "src": "11644:8:5", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_contract$_IRewarder_$2167_$dyn_storage", + "typeString": "contract IRewarder[] storage ref" + } + }, + "id": 1718, + "indexExpression": { + "argumentTypes": null, + "id": 1717, + "name": "pid", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1663, + "src": "11653:3:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "11644:13:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IRewarder_$2167", + "typeString": "contract IRewarder" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "11622:35:5" + }, + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 1728, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 1722, + "name": "_rewarder", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1715, + "src": "11679:9:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IRewarder_$2167", + "typeString": "contract IRewarder" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_IRewarder_$2167", + "typeString": "contract IRewarder" + } + ], + "id": 1721, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "11671:7:5", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 1720, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "11671:7:5", + "typeDescriptions": { + "typeIdentifier": null, + "typeString": null + } + } + }, + "id": 1723, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "11671:18:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "30", + "id": 1726, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "11701:1:5", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 1725, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "11693:7:5", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 1724, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "11693:7:5", + "typeDescriptions": { + "typeIdentifier": null, + "typeString": null + } + } + }, + "id": 1727, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "11693:10:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "src": "11671:32:5", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 1742, + "nodeType": "IfStatement", + "src": "11667:123:5", + "trueBody": { + "id": 1741, + "nodeType": "Block", + "src": "11705:85:5", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 1732, + "name": "pid", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1663, + "src": "11743:3:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 1733, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -15, + "src": "11748:3:5", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 1734, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "11748:10:5", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + { + "argumentTypes": null, + "id": 1735, + "name": "to", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1667, + "src": "11760:2:5", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "hexValue": "30", + "id": 1736, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "11764:1:5", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 1737, + "name": "user", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1677, + "src": "11767:4:5", + "typeDescriptions": { + "typeIdentifier": "t_struct$_UserInfo_$880_storage_ptr", + "typeString": "struct MasterChefV2.UserInfo storage pointer" + } + }, + "id": 1738, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberName": "amount", + "nodeType": "MemberAccess", + "referencedDeclaration": 877, + "src": "11767:11:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "id": 1729, + "name": "_rewarder", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1715, + "src": "11719:9:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IRewarder_$2167", + "typeString": "contract IRewarder" + } + }, + "id": 1731, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "onSushiReward", + "nodeType": "MemberAccess", + "referencedDeclaration": 2151, + "src": "11719:23:5", + "typeDescriptions": { + "typeIdentifier": "t_function_external_nonpayable$_t_uint256_$_t_address_$_t_address_$_t_uint256_$_t_uint256_$returns$__$", + "typeString": "function (uint256,address,address,uint256,uint256) external" + } + }, + "id": 1739, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "11719:60:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1740, + "nodeType": "ExpressionStatement", + "src": "11719:60:5" + } + ] + } + }, + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 1747, + "name": "to", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1667, + "src": "11834:2:5", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 1748, + "name": "amount", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1665, + "src": "11838:6:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 1743, + "name": "lpToken", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 906, + "src": "11808:7:5", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_contract$_IERC20_$337_$dyn_storage", + "typeString": "contract IERC20[] storage ref" + } + }, + "id": 1745, + "indexExpression": { + "argumentTypes": null, + "id": 1744, + "name": "pid", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1663, + "src": "11816:3:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "11808:12:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + }, + "id": 1746, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "safeTransfer", + "nodeType": "MemberAccess", + "referencedDeclaration": 503, + "src": "11808:25:5", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20_$337_$_t_address_$_t_uint256_$returns$__$bound_to$_t_contract$_IERC20_$337_$", + "typeString": "function (contract IERC20,address,uint256)" + } + }, + "id": 1749, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "11808:37:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1750, + "nodeType": "ExpressionStatement", + "src": "11808:37:5" + }, + { + "eventCall": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 1752, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -15, + "src": "11870:3:5", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 1753, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "11870:10:5", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + { + "argumentTypes": null, + "id": 1754, + "name": "pid", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1663, + "src": "11882:3:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "argumentTypes": null, + "id": 1755, + "name": "amount", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1665, + "src": "11887:6:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "argumentTypes": null, + "id": 1756, + "name": "to", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1667, + "src": "11895:2:5", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 1751, + "name": "Withdraw", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 946, + "src": "11861:8:5", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint256_$_t_uint256_$_t_address_$returns$__$", + "typeString": "function (address,uint256,uint256,address)" + } + }, + "id": 1757, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "11861:37:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1758, + "nodeType": "EmitStatement", + "src": "11856:42:5" + } + ] + }, + "documentation": { + "id": 1661, + "nodeType": "StructuredDocumentation", + "src": "11035:195:5", + "text": "@notice Withdraw LP tokens from MCV2.\n @param pid The index of the pool. See `poolInfo`.\n @param amount LP token amount to withdraw.\n @param to Receiver of the LP tokens." + }, + "functionSelector": "0ad58d2f", + "id": 1760, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "withdraw", + "nodeType": "FunctionDefinition", + "overrides": null, + "parameters": { + "id": 1668, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1663, + "mutability": "mutable", + "name": "pid", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 1760, + "src": "11253:11:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1662, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "11253:7:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 1665, + "mutability": "mutable", + "name": "amount", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 1760, + "src": "11266:14:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1664, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "11266:7:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 1667, + "mutability": "mutable", + "name": "to", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 1760, + "src": "11282:10:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 1666, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "11282:7:5", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "11252:41:5" + }, + "returnParameters": { + "id": 1669, + "nodeType": "ParameterList", + "parameters": [], + "src": "11301:0:5" + }, + "scope": 2091, + "src": "11235:670:5", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "public" + }, + { + "body": { + "id": 1861, + "nodeType": "Block", + "src": "12128:739:5", + "statements": [ + { + "assignments": [ + 1769 + ], + "declarations": [ + { + "constant": false, + "id": 1769, + "mutability": "mutable", + "name": "pool", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 1861, + "src": "12138:20:5", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$887_memory_ptr", + "typeString": "struct MasterChefV2.PoolInfo" + }, + "typeName": { + "contractScope": null, + "id": 1768, + "name": "PoolInfo", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 887, + "src": "12138:8:5", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$887_storage_ptr", + "typeString": "struct MasterChefV2.PoolInfo" + } + }, + "value": null, + "visibility": "internal" + } + ], + "id": 1773, + "initialValue": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 1771, + "name": "pid", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1763, + "src": "12172:3:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 1770, + "name": "updatePool", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1557, + "src": "12161:10:5", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$returns$_t_struct$_PoolInfo_$887_memory_ptr_$", + "typeString": "function (uint256) returns (struct MasterChefV2.PoolInfo memory)" + } + }, + "id": 1772, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "12161:15:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$887_memory_ptr", + "typeString": "struct MasterChefV2.PoolInfo memory" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "12138:38:5" + }, + { + "assignments": [ + 1775 + ], + "declarations": [ + { + "constant": false, + "id": 1775, + "mutability": "mutable", + "name": "user", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 1861, + "src": "12186:21:5", + "stateVariable": false, + "storageLocation": "storage", + "typeDescriptions": { + "typeIdentifier": "t_struct$_UserInfo_$880_storage_ptr", + "typeString": "struct MasterChefV2.UserInfo" + }, + "typeName": { + "contractScope": null, + "id": 1774, + "name": "UserInfo", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 880, + "src": "12186:8:5", + "typeDescriptions": { + "typeIdentifier": "t_struct$_UserInfo_$880_storage_ptr", + "typeString": "struct MasterChefV2.UserInfo" + } + }, + "value": null, + "visibility": "internal" + } + ], + "id": 1782, + "initialValue": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 1776, + "name": "userInfo", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 917, + "src": "12210:8:5", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_uint256_$_t_mapping$_t_address_$_t_struct$_UserInfo_$880_storage_$_$", + "typeString": "mapping(uint256 => mapping(address => struct MasterChefV2.UserInfo storage ref))" + } + }, + "id": 1778, + "indexExpression": { + "argumentTypes": null, + "id": 1777, + "name": "pid", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1763, + "src": "12219:3:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "12210:13:5", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_UserInfo_$880_storage_$", + "typeString": "mapping(address => struct MasterChefV2.UserInfo storage ref)" + } + }, + "id": 1781, + "indexExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 1779, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -15, + "src": "12224:3:5", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 1780, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "12224:10:5", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "12210:25:5", + "typeDescriptions": { + "typeIdentifier": "t_struct$_UserInfo_$880_storage", + "typeString": "struct MasterChefV2.UserInfo storage ref" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "12186:49:5" + }, + { + "assignments": [ + 1784 + ], + "declarations": [ + { + "constant": false, + "id": 1784, + "mutability": "mutable", + "name": "accumulatedSushi", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 1861, + "src": "12245:23:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 1783, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "12245:6:5", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "id": 1796, + "initialValue": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 1794, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 1790, + "name": "pool", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1769, + "src": "12294:4:5", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$887_memory_ptr", + "typeString": "struct MasterChefV2.PoolInfo memory" + } + }, + "id": 1791, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberName": "accSushiPerShare", + "nodeType": "MemberAccess", + "referencedDeclaration": 882, + "src": "12294:21:5", + "typeDescriptions": { + "typeIdentifier": "t_uint128", + "typeString": "uint128" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint128", + "typeString": "uint128" + } + ], + "expression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 1787, + "name": "user", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1775, + "src": "12278:4:5", + "typeDescriptions": { + "typeIdentifier": "t_struct$_UserInfo_$880_storage_ptr", + "typeString": "struct MasterChefV2.UserInfo storage pointer" + } + }, + "id": 1788, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberName": "amount", + "nodeType": "MemberAccess", + "referencedDeclaration": 877, + "src": "12278:11:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 1789, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "mul", + "nodeType": "MemberAccess", + "referencedDeclaration": 627, + "src": "12278:15:5", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 1792, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "12278:38:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "/", + "rightExpression": { + "argumentTypes": null, + "id": 1793, + "name": "ACC_SUSHI_PRECISION", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 926, + "src": "12319:19:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "12278:60:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 1786, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "12271:6:5", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_int256_$", + "typeString": "type(int256)" + }, + "typeName": { + "id": 1785, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "12271:6:5", + "typeDescriptions": { + "typeIdentifier": null, + "typeString": null + } + } + }, + "id": 1795, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "12271:68:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "12245:94:5" + }, + { + "assignments": [ + 1798 + ], + "declarations": [ + { + "constant": false, + "id": 1798, + "mutability": "mutable", + "name": "_pendingSushi", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 1861, + "src": "12349:21:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1797, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "12349:7:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "id": 1806, + "initialValue": { + "argumentTypes": null, + "arguments": [], + "expression": { + "argumentTypes": [], + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 1801, + "name": "user", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1775, + "src": "12394:4:5", + "typeDescriptions": { + "typeIdentifier": "t_struct$_UserInfo_$880_storage_ptr", + "typeString": "struct MasterChefV2.UserInfo storage pointer" + } + }, + "id": 1802, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberName": "rewardDebt", + "nodeType": "MemberAccess", + "referencedDeclaration": 879, + "src": "12394:15:5", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "expression": { + "argumentTypes": null, + "id": 1799, + "name": "accumulatedSushi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1784, + "src": "12373:16:5", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "id": 1800, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sub", + "nodeType": "MemberAccess", + "referencedDeclaration": 2304, + "src": "12373:20:5", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_int256_$_t_int256_$returns$_t_int256_$bound_to$_t_int256_$", + "typeString": "function (int256,int256) pure returns (int256)" + } + }, + "id": 1803, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "12373:37:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "id": 1804, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "toUInt256", + "nodeType": "MemberAccess", + "referencedDeclaration": 2364, + "src": "12373:47:5", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_int256_$returns$_t_uint256_$bound_to$_t_int256_$", + "typeString": "function (int256) pure returns (uint256)" + } + }, + "id": 1805, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "12373:49:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "12349:73:5" + }, + { + "expression": { + "argumentTypes": null, + "id": 1811, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 1807, + "name": "user", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1775, + "src": "12452:4:5", + "typeDescriptions": { + "typeIdentifier": "t_struct$_UserInfo_$880_storage_ptr", + "typeString": "struct MasterChefV2.UserInfo storage pointer" + } + }, + "id": 1809, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "memberName": "rewardDebt", + "nodeType": "MemberAccess", + "referencedDeclaration": 879, + "src": "12452:15:5", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "id": 1810, + "name": "accumulatedSushi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1784, + "src": "12470:16:5", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "src": "12452:34:5", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "id": 1812, + "nodeType": "ExpressionStatement", + "src": "12452:34:5" + }, + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 1815, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 1813, + "name": "_pendingSushi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1798, + "src": "12525:13:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "argumentTypes": null, + "hexValue": "30", + "id": 1814, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "12542:1:5", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "12525:18:5", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 1824, + "nodeType": "IfStatement", + "src": "12521:86:5", + "trueBody": { + "id": 1823, + "nodeType": "Block", + "src": "12545:62:5", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 1819, + "name": "to", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1765, + "src": "12578:2:5", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 1820, + "name": "_pendingSushi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1798, + "src": "12582:13:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "id": 1816, + "name": "SUSHI", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 893, + "src": "12559:5:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + }, + "id": 1818, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "safeTransfer", + "nodeType": "MemberAccess", + "referencedDeclaration": 503, + "src": "12559:18:5", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20_$337_$_t_address_$_t_uint256_$returns$__$bound_to$_t_contract$_IERC20_$337_$", + "typeString": "function (contract IERC20,address,uint256)" + } + }, + "id": 1821, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "12559:37:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1822, + "nodeType": "ExpressionStatement", + "src": "12559:37:5" + } + ] + } + }, + { + "assignments": [ + 1826 + ], + "declarations": [ + { + "constant": false, + "id": 1826, + "mutability": "mutable", + "name": "_rewarder", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 1861, + "src": "12625:19:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IRewarder_$2167", + "typeString": "contract IRewarder" + }, + "typeName": { + "contractScope": null, + "id": 1825, + "name": "IRewarder", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 2167, + "src": "12625:9:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IRewarder_$2167", + "typeString": "contract IRewarder" + } + }, + "value": null, + "visibility": "internal" + } + ], + "id": 1830, + "initialValue": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 1827, + "name": "rewarder", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 910, + "src": "12647:8:5", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_contract$_IRewarder_$2167_$dyn_storage", + "typeString": "contract IRewarder[] storage ref" + } + }, + "id": 1829, + "indexExpression": { + "argumentTypes": null, + "id": 1828, + "name": "pid", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1763, + "src": "12656:3:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "12647:13:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IRewarder_$2167", + "typeString": "contract IRewarder" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "12625:35:5" + }, + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 1839, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 1833, + "name": "_rewarder", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1826, + "src": "12682:9:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IRewarder_$2167", + "typeString": "contract IRewarder" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_IRewarder_$2167", + "typeString": "contract IRewarder" + } + ], + "id": 1832, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "12674:7:5", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 1831, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "12674:7:5", + "typeDescriptions": { + "typeIdentifier": null, + "typeString": null + } + } + }, + "id": 1834, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "12674:18:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "30", + "id": 1837, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "12704:1:5", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 1836, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "12696:7:5", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 1835, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "12696:7:5", + "typeDescriptions": { + "typeIdentifier": null, + "typeString": null + } + } + }, + "id": 1838, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "12696:10:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "src": "12674:32:5", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 1853, + "nodeType": "IfStatement", + "src": "12670:136:5", + "trueBody": { + "id": 1852, + "nodeType": "Block", + "src": "12708:98:5", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 1843, + "name": "pid", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1763, + "src": "12747:3:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 1844, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -15, + "src": "12752:3:5", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 1845, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "12752:10:5", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + { + "argumentTypes": null, + "id": 1846, + "name": "to", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1765, + "src": "12764:2:5", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 1847, + "name": "_pendingSushi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1798, + "src": "12768:13:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 1848, + "name": "user", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1775, + "src": "12783:4:5", + "typeDescriptions": { + "typeIdentifier": "t_struct$_UserInfo_$880_storage_ptr", + "typeString": "struct MasterChefV2.UserInfo storage pointer" + } + }, + "id": 1849, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberName": "amount", + "nodeType": "MemberAccess", + "referencedDeclaration": 877, + "src": "12783:11:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "id": 1840, + "name": "_rewarder", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1826, + "src": "12722:9:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IRewarder_$2167", + "typeString": "contract IRewarder" + } + }, + "id": 1842, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "onSushiReward", + "nodeType": "MemberAccess", + "referencedDeclaration": 2151, + "src": "12722:23:5", + "typeDescriptions": { + "typeIdentifier": "t_function_external_nonpayable$_t_uint256_$_t_address_$_t_address_$_t_uint256_$_t_uint256_$returns$__$", + "typeString": "function (uint256,address,address,uint256,uint256) external" + } + }, + "id": 1850, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "12722:73:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1851, + "nodeType": "ExpressionStatement", + "src": "12722:73:5" + } + ] + } + }, + { + "eventCall": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 1855, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -15, + "src": "12829:3:5", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 1856, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "12829:10:5", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + { + "argumentTypes": null, + "id": 1857, + "name": "pid", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1763, + "src": "12841:3:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "argumentTypes": null, + "id": 1858, + "name": "_pendingSushi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1798, + "src": "12846:13:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 1854, + "name": "Harvest", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 964, + "src": "12821:7:5", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint256_$_t_uint256_$returns$__$", + "typeString": "function (address,uint256,uint256)" + } + }, + "id": 1859, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "12821:39:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1860, + "nodeType": "EmitStatement", + "src": "12816:44:5" + } + ] + }, + "documentation": { + "id": 1761, + "nodeType": "StructuredDocumentation", + "src": "11911:163:5", + "text": "@notice Harvest proceeds for transaction sender to `to`.\n @param pid The index of the pool. See `poolInfo`.\n @param to Receiver of SUSHI rewards." + }, + "functionSelector": "18fccc76", + "id": 1862, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "harvest", + "nodeType": "FunctionDefinition", + "overrides": null, + "parameters": { + "id": 1766, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1763, + "mutability": "mutable", + "name": "pid", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 1862, + "src": "12096:11:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1762, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "12096:7:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 1765, + "mutability": "mutable", + "name": "to", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 1862, + "src": "12109:10:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 1764, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "12109:7:5", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "12095:25:5" + }, + "returnParameters": { + "id": 1767, + "nodeType": "ParameterList", + "parameters": [], + "src": "12128:0:5" + }, + "scope": 2091, + "src": "12079:788:5", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "public" + }, + { + "body": { + "id": 1998, + "nodeType": "Block", + "src": "13223:906:5", + "statements": [ + { + "assignments": [ + 1873 + ], + "declarations": [ + { + "constant": false, + "id": 1873, + "mutability": "mutable", + "name": "pool", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 1998, + "src": "13233:20:5", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$887_memory_ptr", + "typeString": "struct MasterChefV2.PoolInfo" + }, + "typeName": { + "contractScope": null, + "id": 1872, + "name": "PoolInfo", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 887, + "src": "13233:8:5", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$887_storage_ptr", + "typeString": "struct MasterChefV2.PoolInfo" + } + }, + "value": null, + "visibility": "internal" + } + ], + "id": 1877, + "initialValue": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 1875, + "name": "pid", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1865, + "src": "13267:3:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 1874, + "name": "updatePool", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1557, + "src": "13256:10:5", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$returns$_t_struct$_PoolInfo_$887_memory_ptr_$", + "typeString": "function (uint256) returns (struct MasterChefV2.PoolInfo memory)" + } + }, + "id": 1876, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "13256:15:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$887_memory_ptr", + "typeString": "struct MasterChefV2.PoolInfo memory" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "13233:38:5" + }, + { + "assignments": [ + 1879 + ], + "declarations": [ + { + "constant": false, + "id": 1879, + "mutability": "mutable", + "name": "user", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 1998, + "src": "13281:21:5", + "stateVariable": false, + "storageLocation": "storage", + "typeDescriptions": { + "typeIdentifier": "t_struct$_UserInfo_$880_storage_ptr", + "typeString": "struct MasterChefV2.UserInfo" + }, + "typeName": { + "contractScope": null, + "id": 1878, + "name": "UserInfo", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 880, + "src": "13281:8:5", + "typeDescriptions": { + "typeIdentifier": "t_struct$_UserInfo_$880_storage_ptr", + "typeString": "struct MasterChefV2.UserInfo" + } + }, + "value": null, + "visibility": "internal" + } + ], + "id": 1886, + "initialValue": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 1880, + "name": "userInfo", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 917, + "src": "13305:8:5", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_uint256_$_t_mapping$_t_address_$_t_struct$_UserInfo_$880_storage_$_$", + "typeString": "mapping(uint256 => mapping(address => struct MasterChefV2.UserInfo storage ref))" + } + }, + "id": 1882, + "indexExpression": { + "argumentTypes": null, + "id": 1881, + "name": "pid", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1865, + "src": "13314:3:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "13305:13:5", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_UserInfo_$880_storage_$", + "typeString": "mapping(address => struct MasterChefV2.UserInfo storage ref)" + } + }, + "id": 1885, + "indexExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 1883, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -15, + "src": "13319:3:5", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 1884, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "13319:10:5", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "13305:25:5", + "typeDescriptions": { + "typeIdentifier": "t_struct$_UserInfo_$880_storage", + "typeString": "struct MasterChefV2.UserInfo storage ref" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "13281:49:5" + }, + { + "assignments": [ + 1888 + ], + "declarations": [ + { + "constant": false, + "id": 1888, + "mutability": "mutable", + "name": "accumulatedSushi", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 1998, + "src": "13340:23:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 1887, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "13340:6:5", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "id": 1900, + "initialValue": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 1898, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 1894, + "name": "pool", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1873, + "src": "13389:4:5", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$887_memory_ptr", + "typeString": "struct MasterChefV2.PoolInfo memory" + } + }, + "id": 1895, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberName": "accSushiPerShare", + "nodeType": "MemberAccess", + "referencedDeclaration": 882, + "src": "13389:21:5", + "typeDescriptions": { + "typeIdentifier": "t_uint128", + "typeString": "uint128" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint128", + "typeString": "uint128" + } + ], + "expression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 1891, + "name": "user", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1879, + "src": "13373:4:5", + "typeDescriptions": { + "typeIdentifier": "t_struct$_UserInfo_$880_storage_ptr", + "typeString": "struct MasterChefV2.UserInfo storage pointer" + } + }, + "id": 1892, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberName": "amount", + "nodeType": "MemberAccess", + "referencedDeclaration": 877, + "src": "13373:11:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 1893, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "mul", + "nodeType": "MemberAccess", + "referencedDeclaration": 627, + "src": "13373:15:5", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 1896, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "13373:38:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "/", + "rightExpression": { + "argumentTypes": null, + "id": 1897, + "name": "ACC_SUSHI_PRECISION", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 926, + "src": "13414:19:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "13373:60:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 1890, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "13366:6:5", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_int256_$", + "typeString": "type(int256)" + }, + "typeName": { + "id": 1889, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "13366:6:5", + "typeDescriptions": { + "typeIdentifier": null, + "typeString": null + } + } + }, + "id": 1899, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "13366:68:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "13340:94:5" + }, + { + "assignments": [ + 1902 + ], + "declarations": [ + { + "constant": false, + "id": 1902, + "mutability": "mutable", + "name": "_pendingSushi", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 1998, + "src": "13444:21:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1901, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "13444:7:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "id": 1910, + "initialValue": { + "argumentTypes": null, + "arguments": [], + "expression": { + "argumentTypes": [], + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 1905, + "name": "user", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1879, + "src": "13489:4:5", + "typeDescriptions": { + "typeIdentifier": "t_struct$_UserInfo_$880_storage_ptr", + "typeString": "struct MasterChefV2.UserInfo storage pointer" + } + }, + "id": 1906, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberName": "rewardDebt", + "nodeType": "MemberAccess", + "referencedDeclaration": 879, + "src": "13489:15:5", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "expression": { + "argumentTypes": null, + "id": 1903, + "name": "accumulatedSushi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1888, + "src": "13468:16:5", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "id": 1904, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sub", + "nodeType": "MemberAccess", + "referencedDeclaration": 2304, + "src": "13468:20:5", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_int256_$_t_int256_$returns$_t_int256_$bound_to$_t_int256_$", + "typeString": "function (int256,int256) pure returns (int256)" + } + }, + "id": 1907, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "13468:37:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "id": 1908, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "toUInt256", + "nodeType": "MemberAccess", + "referencedDeclaration": 2364, + "src": "13468:47:5", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_int256_$returns$_t_uint256_$bound_to$_t_int256_$", + "typeString": "function (int256) pure returns (uint256)" + } + }, + "id": 1909, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "13468:49:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "13444:73:5" + }, + { + "expression": { + "argumentTypes": null, + "id": 1927, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 1911, + "name": "user", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1879, + "src": "13547:4:5", + "typeDescriptions": { + "typeIdentifier": "t_struct$_UserInfo_$880_storage_ptr", + "typeString": "struct MasterChefV2.UserInfo storage pointer" + } + }, + "id": 1913, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "memberName": "rewardDebt", + "nodeType": "MemberAccess", + "referencedDeclaration": 879, + "src": "13547:15:5", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 1924, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 1920, + "name": "pool", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1873, + "src": "13604:4:5", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$887_memory_ptr", + "typeString": "struct MasterChefV2.PoolInfo memory" + } + }, + "id": 1921, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberName": "accSushiPerShare", + "nodeType": "MemberAccess", + "referencedDeclaration": 882, + "src": "13604:21:5", + "typeDescriptions": { + "typeIdentifier": "t_uint128", + "typeString": "uint128" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint128", + "typeString": "uint128" + } + ], + "expression": { + "argumentTypes": null, + "id": 1918, + "name": "amount", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1867, + "src": "13593:6:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 1919, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "mul", + "nodeType": "MemberAccess", + "referencedDeclaration": 627, + "src": "13593:10:5", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 1922, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "13593:33:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "/", + "rightExpression": { + "argumentTypes": null, + "id": 1923, + "name": "ACC_SUSHI_PRECISION", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 926, + "src": "13629:19:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "13593:55:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 1917, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "13586:6:5", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_int256_$", + "typeString": "type(int256)" + }, + "typeName": { + "id": 1916, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "13586:6:5", + "typeDescriptions": { + "typeIdentifier": null, + "typeString": null + } + } + }, + "id": 1925, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "13586:63:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "expression": { + "argumentTypes": null, + "id": 1914, + "name": "accumulatedSushi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1888, + "src": "13565:16:5", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "id": 1915, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sub", + "nodeType": "MemberAccess", + "referencedDeclaration": 2304, + "src": "13565:20:5", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_int256_$_t_int256_$returns$_t_int256_$bound_to$_t_int256_$", + "typeString": "function (int256,int256) pure returns (int256)" + } + }, + "id": 1926, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "13565:85:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "src": "13547:103:5", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "id": 1928, + "nodeType": "ExpressionStatement", + "src": "13547:103:5" + }, + { + "expression": { + "argumentTypes": null, + "id": 1937, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 1929, + "name": "user", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1879, + "src": "13660:4:5", + "typeDescriptions": { + "typeIdentifier": "t_struct$_UserInfo_$880_storage_ptr", + "typeString": "struct MasterChefV2.UserInfo storage pointer" + } + }, + "id": 1931, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "memberName": "amount", + "nodeType": "MemberAccess", + "referencedDeclaration": 877, + "src": "13660:11:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 1935, + "name": "amount", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1867, + "src": "13690:6:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 1932, + "name": "user", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1879, + "src": "13674:4:5", + "typeDescriptions": { + "typeIdentifier": "t_struct$_UserInfo_$880_storage_ptr", + "typeString": "struct MasterChefV2.UserInfo storage pointer" + } + }, + "id": 1933, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberName": "amount", + "nodeType": "MemberAccess", + "referencedDeclaration": 877, + "src": "13674:11:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 1934, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sub", + "nodeType": "MemberAccess", + "referencedDeclaration": 599, + "src": "13674:15:5", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 1936, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "13674:23:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "13660:37:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 1938, + "nodeType": "ExpressionStatement", + "src": "13660:37:5" + }, + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 1942, + "name": "to", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1869, + "src": "13759:2:5", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 1943, + "name": "_pendingSushi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1902, + "src": "13763:13:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "id": 1939, + "name": "SUSHI", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 893, + "src": "13740:5:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + }, + "id": 1941, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "safeTransfer", + "nodeType": "MemberAccess", + "referencedDeclaration": 503, + "src": "13740:18:5", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20_$337_$_t_address_$_t_uint256_$returns$__$bound_to$_t_contract$_IERC20_$337_$", + "typeString": "function (contract IERC20,address,uint256)" + } + }, + "id": 1944, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "13740:37:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1945, + "nodeType": "ExpressionStatement", + "src": "13740:37:5" + }, + { + "assignments": [ + 1947 + ], + "declarations": [ + { + "constant": false, + "id": 1947, + "mutability": "mutable", + "name": "_rewarder", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 1998, + "src": "13788:19:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IRewarder_$2167", + "typeString": "contract IRewarder" + }, + "typeName": { + "contractScope": null, + "id": 1946, + "name": "IRewarder", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 2167, + "src": "13788:9:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IRewarder_$2167", + "typeString": "contract IRewarder" + } + }, + "value": null, + "visibility": "internal" + } + ], + "id": 1951, + "initialValue": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 1948, + "name": "rewarder", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 910, + "src": "13810:8:5", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_contract$_IRewarder_$2167_$dyn_storage", + "typeString": "contract IRewarder[] storage ref" + } + }, + "id": 1950, + "indexExpression": { + "argumentTypes": null, + "id": 1949, + "name": "pid", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1865, + "src": "13819:3:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "13810:13:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IRewarder_$2167", + "typeString": "contract IRewarder" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "13788:35:5" + }, + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 1960, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 1954, + "name": "_rewarder", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1947, + "src": "13845:9:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IRewarder_$2167", + "typeString": "contract IRewarder" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_IRewarder_$2167", + "typeString": "contract IRewarder" + } + ], + "id": 1953, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "13837:7:5", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 1952, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "13837:7:5", + "typeDescriptions": { + "typeIdentifier": null, + "typeString": null + } + } + }, + "id": 1955, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "13837:18:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "30", + "id": 1958, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "13867:1:5", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 1957, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "13859:7:5", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 1956, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "13859:7:5", + "typeDescriptions": { + "typeIdentifier": null, + "typeString": null + } + } + }, + "id": 1959, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "13859:10:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "src": "13837:32:5", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 1974, + "nodeType": "IfStatement", + "src": "13833:135:5", + "trueBody": { + "id": 1973, + "nodeType": "Block", + "src": "13871:97:5", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 1964, + "name": "pid", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1865, + "src": "13909:3:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 1965, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -15, + "src": "13914:3:5", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 1966, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "13914:10:5", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + { + "argumentTypes": null, + "id": 1967, + "name": "to", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1869, + "src": "13926:2:5", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 1968, + "name": "_pendingSushi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1902, + "src": "13930:13:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 1969, + "name": "user", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1879, + "src": "13945:4:5", + "typeDescriptions": { + "typeIdentifier": "t_struct$_UserInfo_$880_storage_ptr", + "typeString": "struct MasterChefV2.UserInfo storage pointer" + } + }, + "id": 1970, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberName": "amount", + "nodeType": "MemberAccess", + "referencedDeclaration": 877, + "src": "13945:11:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "id": 1961, + "name": "_rewarder", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1947, + "src": "13885:9:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IRewarder_$2167", + "typeString": "contract IRewarder" + } + }, + "id": 1963, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "onSushiReward", + "nodeType": "MemberAccess", + "referencedDeclaration": 2151, + "src": "13885:23:5", + "typeDescriptions": { + "typeIdentifier": "t_function_external_nonpayable$_t_uint256_$_t_address_$_t_address_$_t_uint256_$_t_uint256_$returns$__$", + "typeString": "function (uint256,address,address,uint256,uint256) external" + } + }, + "id": 1971, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "13885:72:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1972, + "nodeType": "ExpressionStatement", + "src": "13885:72:5" + } + ] + } + }, + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 1979, + "name": "to", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1869, + "src": "14004:2:5", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 1980, + "name": "amount", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1867, + "src": "14008:6:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 1975, + "name": "lpToken", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 906, + "src": "13978:7:5", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_contract$_IERC20_$337_$dyn_storage", + "typeString": "contract IERC20[] storage ref" + } + }, + "id": 1977, + "indexExpression": { + "argumentTypes": null, + "id": 1976, + "name": "pid", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1865, + "src": "13986:3:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "13978:12:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + }, + "id": 1978, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "safeTransfer", + "nodeType": "MemberAccess", + "referencedDeclaration": 503, + "src": "13978:25:5", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20_$337_$_t_address_$_t_uint256_$returns$__$bound_to$_t_contract$_IERC20_$337_$", + "typeString": "function (contract IERC20,address,uint256)" + } + }, + "id": 1981, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "13978:37:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1982, + "nodeType": "ExpressionStatement", + "src": "13978:37:5" + }, + { + "eventCall": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 1984, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -15, + "src": "14040:3:5", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 1985, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "14040:10:5", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + { + "argumentTypes": null, + "id": 1986, + "name": "pid", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1865, + "src": "14052:3:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "argumentTypes": null, + "id": 1987, + "name": "amount", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1867, + "src": "14057:6:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "argumentTypes": null, + "id": 1988, + "name": "to", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1869, + "src": "14065:2:5", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 1983, + "name": "Withdraw", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 946, + "src": "14031:8:5", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint256_$_t_uint256_$_t_address_$returns$__$", + "typeString": "function (address,uint256,uint256,address)" + } + }, + "id": 1989, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "14031:37:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1990, + "nodeType": "EmitStatement", + "src": "14026:42:5" + }, + { + "eventCall": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 1992, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -15, + "src": "14091:3:5", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 1993, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "14091:10:5", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + { + "argumentTypes": null, + "id": 1994, + "name": "pid", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1865, + "src": "14103:3:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "argumentTypes": null, + "id": 1995, + "name": "_pendingSushi", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 1902, + "src": "14108:13:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 1991, + "name": "Harvest", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 964, + "src": "14083:7:5", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint256_$_t_uint256_$returns$__$", + "typeString": "function (address,uint256,uint256)" + } + }, + "id": 1996, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "14083:39:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 1997, + "nodeType": "EmitStatement", + "src": "14078:44:5" + } + ] + }, + "documentation": { + "id": 1863, + "nodeType": "StructuredDocumentation", + "src": "12877:265:5", + "text": "@notice Withdraw LP tokens from MCV2 and harvest proceeds for transaction sender to `to`.\n @param pid The index of the pool. See `poolInfo`.\n @param amount LP token amount to withdraw.\n @param to Receiver of the LP tokens and SUSHI rewards." + }, + "functionSelector": "d1abb907", + "id": 1999, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "withdrawAndHarvest", + "nodeType": "FunctionDefinition", + "overrides": null, + "parameters": { + "id": 1870, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 1865, + "mutability": "mutable", + "name": "pid", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 1999, + "src": "13175:11:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1864, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "13175:7:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 1867, + "mutability": "mutable", + "name": "amount", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 1999, + "src": "13188:14:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 1866, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "13188:7:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 1869, + "mutability": "mutable", + "name": "to", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 1999, + "src": "13204:10:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 1868, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "13204:7:5", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "13174:41:5" + }, + "returnParameters": { + "id": 1871, + "nodeType": "ParameterList", + "parameters": [], + "src": "13223:0:5" + }, + "scope": 2091, + "src": "13147:982:5", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "public" + }, + { + "body": { + "id": 2010, + "nodeType": "Block", + "src": "14275:51:5", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 2006, + "name": "MASTER_PID", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 896, + "src": "14305:10:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "argumentTypes": null, + "hexValue": "30", + "id": 2007, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "14317:1:5", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "expression": { + "argumentTypes": null, + "id": 2003, + "name": "MASTER_CHEF", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 890, + "src": "14285:11:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IMasterChef_$2132", + "typeString": "contract IMasterChef" + } + }, + "id": 2005, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "deposit", + "nodeType": "MemberAccess", + "referencedDeclaration": 2131, + "src": "14285:19:5", + "typeDescriptions": { + "typeIdentifier": "t_function_external_nonpayable$_t_uint256_$_t_uint256_$returns$__$", + "typeString": "function (uint256,uint256) external" + } + }, + "id": 2008, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "14285:34:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 2009, + "nodeType": "ExpressionStatement", + "src": "14285:34:5" + } + ] + }, + "documentation": { + "id": 2000, + "nodeType": "StructuredDocumentation", + "src": "14135:95:5", + "text": "@notice Harvests SUSHI from `MASTER_CHEF` MCV1 and pool `MASTER_PID` to this MCV2 contract." + }, + "functionSelector": "4f70b15a", + "id": 2011, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "harvestFromMasterChef", + "nodeType": "FunctionDefinition", + "overrides": null, + "parameters": { + "id": 2001, + "nodeType": "ParameterList", + "parameters": [], + "src": "14265:2:5" + }, + "returnParameters": { + "id": 2002, + "nodeType": "ParameterList", + "parameters": [], + "src": "14275:0:5" + }, + "scope": 2091, + "src": "14235:91:5", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "public" + }, + { + "body": { + "id": 2089, + "nodeType": "Block", + "src": "14565:502:5", + "statements": [ + { + "assignments": [ + 2020 + ], + "declarations": [ + { + "constant": false, + "id": 2020, + "mutability": "mutable", + "name": "user", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2089, + "src": "14575:21:5", + "stateVariable": false, + "storageLocation": "storage", + "typeDescriptions": { + "typeIdentifier": "t_struct$_UserInfo_$880_storage_ptr", + "typeString": "struct MasterChefV2.UserInfo" + }, + "typeName": { + "contractScope": null, + "id": 2019, + "name": "UserInfo", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 880, + "src": "14575:8:5", + "typeDescriptions": { + "typeIdentifier": "t_struct$_UserInfo_$880_storage_ptr", + "typeString": "struct MasterChefV2.UserInfo" + } + }, + "value": null, + "visibility": "internal" + } + ], + "id": 2027, + "initialValue": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 2021, + "name": "userInfo", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 917, + "src": "14599:8:5", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_uint256_$_t_mapping$_t_address_$_t_struct$_UserInfo_$880_storage_$_$", + "typeString": "mapping(uint256 => mapping(address => struct MasterChefV2.UserInfo storage ref))" + } + }, + "id": 2023, + "indexExpression": { + "argumentTypes": null, + "id": 2022, + "name": "pid", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2014, + "src": "14608:3:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "14599:13:5", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_UserInfo_$880_storage_$", + "typeString": "mapping(address => struct MasterChefV2.UserInfo storage ref)" + } + }, + "id": 2026, + "indexExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 2024, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -15, + "src": "14613:3:5", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 2025, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "14613:10:5", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "14599:25:5", + "typeDescriptions": { + "typeIdentifier": "t_struct$_UserInfo_$880_storage", + "typeString": "struct MasterChefV2.UserInfo storage ref" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "14575:49:5" + }, + { + "assignments": [ + 2029 + ], + "declarations": [ + { + "constant": false, + "id": 2029, + "mutability": "mutable", + "name": "amount", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2089, + "src": "14634:14:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2028, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "14634:7:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "id": 2032, + "initialValue": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 2030, + "name": "user", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2020, + "src": "14651:4:5", + "typeDescriptions": { + "typeIdentifier": "t_struct$_UserInfo_$880_storage_ptr", + "typeString": "struct MasterChefV2.UserInfo storage pointer" + } + }, + "id": 2031, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberName": "amount", + "nodeType": "MemberAccess", + "referencedDeclaration": 877, + "src": "14651:11:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "14634:28:5" + }, + { + "expression": { + "argumentTypes": null, + "id": 2037, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 2033, + "name": "user", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2020, + "src": "14672:4:5", + "typeDescriptions": { + "typeIdentifier": "t_struct$_UserInfo_$880_storage_ptr", + "typeString": "struct MasterChefV2.UserInfo storage pointer" + } + }, + "id": 2035, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "memberName": "amount", + "nodeType": "MemberAccess", + "referencedDeclaration": 877, + "src": "14672:11:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "hexValue": "30", + "id": 2036, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "14686:1:5", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "14672:15:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 2038, + "nodeType": "ExpressionStatement", + "src": "14672:15:5" + }, + { + "expression": { + "argumentTypes": null, + "id": 2043, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 2039, + "name": "user", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2020, + "src": "14697:4:5", + "typeDescriptions": { + "typeIdentifier": "t_struct$_UserInfo_$880_storage_ptr", + "typeString": "struct MasterChefV2.UserInfo storage pointer" + } + }, + "id": 2041, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "memberName": "rewardDebt", + "nodeType": "MemberAccess", + "referencedDeclaration": 879, + "src": "14697:15:5", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "hexValue": "30", + "id": 2042, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "14715:1:5", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "14697:19:5", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "id": 2044, + "nodeType": "ExpressionStatement", + "src": "14697:19:5" + }, + { + "assignments": [ + 2046 + ], + "declarations": [ + { + "constant": false, + "id": 2046, + "mutability": "mutable", + "name": "_rewarder", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2089, + "src": "14727:19:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IRewarder_$2167", + "typeString": "contract IRewarder" + }, + "typeName": { + "contractScope": null, + "id": 2045, + "name": "IRewarder", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 2167, + "src": "14727:9:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IRewarder_$2167", + "typeString": "contract IRewarder" + } + }, + "value": null, + "visibility": "internal" + } + ], + "id": 2050, + "initialValue": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 2047, + "name": "rewarder", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 910, + "src": "14749:8:5", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_contract$_IRewarder_$2167_$dyn_storage", + "typeString": "contract IRewarder[] storage ref" + } + }, + "id": 2049, + "indexExpression": { + "argumentTypes": null, + "id": 2048, + "name": "pid", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2014, + "src": "14758:3:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "14749:13:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IRewarder_$2167", + "typeString": "contract IRewarder" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "14727:35:5" + }, + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 2059, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 2053, + "name": "_rewarder", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2046, + "src": "14784:9:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IRewarder_$2167", + "typeString": "contract IRewarder" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_IRewarder_$2167", + "typeString": "contract IRewarder" + } + ], + "id": 2052, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "14776:7:5", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 2051, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "14776:7:5", + "typeDescriptions": { + "typeIdentifier": null, + "typeString": null + } + } + }, + "id": 2054, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "14776:18:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "30", + "id": 2057, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "14806:1:5", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 2056, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "14798:7:5", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 2055, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "14798:7:5", + "typeDescriptions": { + "typeIdentifier": null, + "typeString": null + } + } + }, + "id": 2058, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "typeConversion", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "14798:10:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "src": "14776:32:5", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 2072, + "nodeType": "IfStatement", + "src": "14772:113:5", + "trueBody": { + "id": 2071, + "nodeType": "Block", + "src": "14810:75:5", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 2063, + "name": "pid", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2014, + "src": "14848:3:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 2064, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -15, + "src": "14853:3:5", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 2065, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "14853:10:5", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + { + "argumentTypes": null, + "id": 2066, + "name": "to", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2016, + "src": "14865:2:5", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "hexValue": "30", + "id": 2067, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "14869:1:5", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + { + "argumentTypes": null, + "hexValue": "30", + "id": 2068, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "14872:1:5", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "expression": { + "argumentTypes": null, + "id": 2060, + "name": "_rewarder", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2046, + "src": "14824:9:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IRewarder_$2167", + "typeString": "contract IRewarder" + } + }, + "id": 2062, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "onSushiReward", + "nodeType": "MemberAccess", + "referencedDeclaration": 2151, + "src": "14824:23:5", + "typeDescriptions": { + "typeIdentifier": "t_function_external_nonpayable$_t_uint256_$_t_address_$_t_address_$_t_uint256_$_t_uint256_$returns$__$", + "typeString": "function (uint256,address,address,uint256,uint256) external" + } + }, + "id": 2069, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "14824:50:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 2070, + "nodeType": "ExpressionStatement", + "src": "14824:50:5" + } + ] + } + }, + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 2077, + "name": "to", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2016, + "src": "14988:2:5", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 2078, + "name": "amount", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2029, + "src": "14992:6:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 2073, + "name": "lpToken", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 906, + "src": "14962:7:5", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_contract$_IERC20_$337_$dyn_storage", + "typeString": "contract IERC20[] storage ref" + } + }, + "id": 2075, + "indexExpression": { + "argumentTypes": null, + "id": 2074, + "name": "pid", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2014, + "src": "14970:3:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "14962:12:5", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + }, + "id": 2076, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "safeTransfer", + "nodeType": "MemberAccess", + "referencedDeclaration": 503, + "src": "14962:25:5", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20_$337_$_t_address_$_t_uint256_$returns$__$bound_to$_t_contract$_IERC20_$337_$", + "typeString": "function (contract IERC20,address,uint256)" + } + }, + "id": 2079, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "14962:37:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 2080, + "nodeType": "ExpressionStatement", + "src": "14962:37:5" + }, + { + "eventCall": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 2082, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -15, + "src": "15032:3:5", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 2083, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "15032:10:5", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + { + "argumentTypes": null, + "id": 2084, + "name": "pid", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2014, + "src": "15044:3:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "argumentTypes": null, + "id": 2085, + "name": "amount", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2029, + "src": "15049:6:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "argumentTypes": null, + "id": 2086, + "name": "to", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2016, + "src": "15057:2:5", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 2081, + "name": "EmergencyWithdraw", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 956, + "src": "15014:17:5", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint256_$_t_uint256_$_t_address_$returns$__$", + "typeString": "function (address,uint256,uint256,address)" + } + }, + "id": 2087, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "15014:46:5", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 2088, + "nodeType": "EmitStatement", + "src": "15009:51:5" + } + ] + }, + "documentation": { + "id": 2012, + "nodeType": "StructuredDocumentation", + "src": "14332:169:5", + "text": "@notice Withdraw without caring about rewards. EMERGENCY ONLY.\n @param pid The index of the pool. See `poolInfo`.\n @param to Receiver of the LP tokens." + }, + "functionSelector": "2f940c70", + "id": 2090, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "emergencyWithdraw", + "nodeType": "FunctionDefinition", + "overrides": null, + "parameters": { + "id": 2017, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2014, + "mutability": "mutable", + "name": "pid", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2090, + "src": "14533:11:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2013, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "14533:7:5", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 2016, + "mutability": "mutable", + "name": "to", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2090, + "src": "14546:10:5", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2015, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "14546:7:5", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "14532:25:5" + }, + "returnParameters": { + "id": 2018, + "nodeType": "ParameterList", + "parameters": [], + "src": "14565:0:5" + }, + "scope": 2091, + "src": "14506:561:5", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "public" + } + ], + "scope": 2092, + "src": "1098:13971:5" + } + ], + "src": "33:15037:5" + }, + "id": 5 + }, + "contracts/interfaces/IMasterChef.sol": { + "ast": { + "absolutePath": "contracts/interfaces/IMasterChef.sol", + "exportedSymbols": { + "IMasterChef": [ + 2132 + ] + }, + "id": 2133, + "license": "MIT", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 2093, + "literals": [ + "solidity", + "0.6", + ".12" + ], + "nodeType": "PragmaDirective", + "src": "32:23:6" + }, + { + "id": 2094, + "literals": [ + "experimental", + "ABIEncoderV2" + ], + "nodeType": "PragmaDirective", + "src": "56:33:6" + }, + { + "absolutePath": "@boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol", + "file": "@boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol", + "id": 2095, + "nodeType": "ImportDirective", + "scope": 2133, + "sourceUnit": 554, + "src": "90:75:6", + "symbolAliases": [], + "unitAlias": "" + }, + { + "abstract": false, + "baseContracts": [], + "contractDependencies": [], + "contractKind": "interface", + "documentation": null, + "fullyImplemented": false, + "id": 2132, + "linearizedBaseContracts": [ + 2132 + ], + "name": "IMasterChef", + "nodeType": "ContractDefinition", + "nodes": [ + { + "id": 2098, + "libraryName": { + "contractScope": null, + "id": 2096, + "name": "BoringERC20", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 553, + "src": "201:11:6", + "typeDescriptions": { + "typeIdentifier": "t_contract$_BoringERC20_$553", + "typeString": "library BoringERC20" + } + }, + "nodeType": "UsingForDirective", + "src": "195:29:6", + "typeName": { + "contractScope": null, + "id": 2097, + "name": "IERC20", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 337, + "src": "217:6:6", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + } + }, + { + "canonicalName": "IMasterChef.UserInfo", + "id": 2103, + "members": [ + { + "constant": false, + "id": 2100, + "mutability": "mutable", + "name": "amount", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2103, + "src": "255:14:6", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2099, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "255:7:6", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 2102, + "mutability": "mutable", + "name": "rewardDebt", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2103, + "src": "328:18:6", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2101, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "328:7:6", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "name": "UserInfo", + "nodeType": "StructDefinition", + "scope": 2132, + "src": "229:163:6", + "visibility": "public" + }, + { + "canonicalName": "IMasterChef.PoolInfo", + "id": 2112, + "members": [ + { + "constant": false, + "id": 2105, + "mutability": "mutable", + "name": "lpToken", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2112, + "src": "424:14:6", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + }, + "typeName": { + "contractScope": null, + "id": 2104, + "name": "IERC20", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 337, + "src": "424:6:6", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 2107, + "mutability": "mutable", + "name": "allocPoint", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2112, + "src": "491:18:6", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2106, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "491:7:6", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 2109, + "mutability": "mutable", + "name": "lastRewardBlock", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2112, + "src": "609:23:6", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2108, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "609:7:6", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 2111, + "mutability": "mutable", + "name": "accSushiPerShare", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2112, + "src": "696:24:6", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2110, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "696:7:6", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "name": "PoolInfo", + "nodeType": "StructDefinition", + "scope": 2132, + "src": "398:384:6", + "visibility": "public" + }, + { + "body": null, + "documentation": null, + "functionSelector": "1526fe27", + "id": 2119, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "poolInfo", + "nodeType": "FunctionDefinition", + "overrides": null, + "parameters": { + "id": 2115, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2114, + "mutability": "mutable", + "name": "pid", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2119, + "src": "806:11:6", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2113, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "806:7:6", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "805:13:6" + }, + "returnParameters": { + "id": 2118, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2117, + "mutability": "mutable", + "name": "", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2119, + "src": "842:27:6", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$2112_memory_ptr", + "typeString": "struct IMasterChef.PoolInfo" + }, + "typeName": { + "contractScope": null, + "id": 2116, + "name": "IMasterChef.PoolInfo", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 2112, + "src": "842:20:6", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$2112_storage_ptr", + "typeString": "struct IMasterChef.PoolInfo" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "841:29:6" + }, + "scope": 2132, + "src": "788:83:6", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "body": null, + "documentation": null, + "functionSelector": "17caf6f1", + "id": 2124, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "totalAllocPoint", + "nodeType": "FunctionDefinition", + "overrides": null, + "parameters": { + "id": 2120, + "nodeType": "ParameterList", + "parameters": [], + "src": "900:2:6" + }, + "returnParameters": { + "id": 2123, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2122, + "mutability": "mutable", + "name": "", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2124, + "src": "926:7:6", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2121, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "926:7:6", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "925:9:6" + }, + "scope": 2132, + "src": "876:59:6", + "stateMutability": "view", + "virtual": false, + "visibility": "external" + }, + { + "body": null, + "documentation": null, + "functionSelector": "e2bbb158", + "id": 2131, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "deposit", + "nodeType": "FunctionDefinition", + "overrides": null, + "parameters": { + "id": 2129, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2126, + "mutability": "mutable", + "name": "_pid", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2131, + "src": "957:12:6", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2125, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "957:7:6", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 2128, + "mutability": "mutable", + "name": "_amount", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2131, + "src": "971:15:6", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2127, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "971:7:6", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "956:31:6" + }, + "returnParameters": { + "id": 2130, + "nodeType": "ParameterList", + "parameters": [], + "src": "996:0:6" + }, + "scope": 2132, + "src": "940:57:6", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + } + ], + "scope": 2133, + "src": "167:832:6" + } + ], + "src": "32:968:6" + }, + "id": 6 + }, + "contracts/interfaces/IRewarder.sol": { + "ast": { + "absolutePath": "contracts/interfaces/IRewarder.sol", + "exportedSymbols": { + "IRewarder": [ + 2167 + ] + }, + "id": 2168, + "license": "MIT", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 2134, + "literals": [ + "solidity", + "0.6", + ".12" + ], + "nodeType": "PragmaDirective", + "src": "33:23:7" + }, + { + "absolutePath": "@boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol", + "file": "@boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol", + "id": 2135, + "nodeType": "ImportDirective", + "scope": 2168, + "sourceUnit": 554, + "src": "57:75:7", + "symbolAliases": [], + "unitAlias": "" + }, + { + "abstract": false, + "baseContracts": [], + "contractDependencies": [], + "contractKind": "interface", + "documentation": null, + "fullyImplemented": false, + "id": 2167, + "linearizedBaseContracts": [ + 2167 + ], + "name": "IRewarder", + "nodeType": "ContractDefinition", + "nodes": [ + { + "id": 2138, + "libraryName": { + "contractScope": null, + "id": 2136, + "name": "BoringERC20", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 553, + "src": "165:11:7", + "typeDescriptions": { + "typeIdentifier": "t_contract$_BoringERC20_$553", + "typeString": "library BoringERC20" + } + }, + "nodeType": "UsingForDirective", + "src": "159:29:7", + "typeName": { + "contractScope": null, + "id": 2137, + "name": "IERC20", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 337, + "src": "181:6:7", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + } + }, + { + "body": null, + "documentation": null, + "functionSelector": "8bf63742", + "id": 2151, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "onSushiReward", + "nodeType": "FunctionDefinition", + "overrides": null, + "parameters": { + "id": 2149, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2140, + "mutability": "mutable", + "name": "pid", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2151, + "src": "216:11:7", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2139, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "216:7:7", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 2142, + "mutability": "mutable", + "name": "user", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2151, + "src": "229:12:7", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2141, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "229:7:7", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 2144, + "mutability": "mutable", + "name": "recipient", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2151, + "src": "243:17:7", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2143, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "243:7:7", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 2146, + "mutability": "mutable", + "name": "sushiAmount", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2151, + "src": "262:19:7", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2145, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "262:7:7", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 2148, + "mutability": "mutable", + "name": "newLpAmount", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2151, + "src": "283:19:7", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2147, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "283:7:7", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "215:88:7" + }, + "returnParameters": { + "id": 2150, + "nodeType": "ParameterList", + "parameters": [], + "src": "312:0:7" + }, + "scope": 2167, + "src": "193:120:7", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "body": null, + "documentation": null, + "functionSelector": "d63b3c49", + "id": 2166, + "implemented": false, + "kind": "function", + "modifiers": [], + "name": "pendingTokens", + "nodeType": "FunctionDefinition", + "overrides": null, + "parameters": { + "id": 2158, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2153, + "mutability": "mutable", + "name": "pid", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2166, + "src": "341:11:7", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2152, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "341:7:7", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 2155, + "mutability": "mutable", + "name": "user", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2166, + "src": "354:12:7", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2154, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "354:7:7", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 2157, + "mutability": "mutable", + "name": "sushiAmount", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2166, + "src": "368:19:7", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2156, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "368:7:7", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "340:48:7" + }, + "returnParameters": { + "id": 2165, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2161, + "mutability": "mutable", + "name": "", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2166, + "src": "407:15:7", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_contract$_IERC20_$337_$dyn_memory_ptr", + "typeString": "contract IERC20[]" + }, + "typeName": { + "baseType": { + "contractScope": null, + "id": 2159, + "name": "IERC20", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 337, + "src": "407:6:7", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + }, + "id": 2160, + "length": null, + "nodeType": "ArrayTypeName", + "src": "407:8:7", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_contract$_IERC20_$337_$dyn_storage_ptr", + "typeString": "contract IERC20[]" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 2164, + "mutability": "mutable", + "name": "", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2166, + "src": "424:16:7", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr", + "typeString": "uint256[]" + }, + "typeName": { + "baseType": { + "id": 2162, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "424:7:7", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 2163, + "length": null, + "nodeType": "ArrayTypeName", + "src": "424:9:7", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr", + "typeString": "uint256[]" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "406:35:7" + }, + "scope": 2167, + "src": "318:124:7", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + } + ], + "scope": 2168, + "src": "133:311:7" + } + ], + "src": "33:412:7" + }, + "id": 7 + }, + "contracts/libraries/SignedSafeMath.sol": { + "ast": { + "absolutePath": "contracts/libraries/SignedSafeMath.sol", + "exportedSymbols": { + "SignedSafeMath": [ + 2365 + ] + }, + "id": 2366, + "license": "MIT", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 2169, + "literals": [ + "solidity", + "0.6", + ".12" + ], + "nodeType": "PragmaDirective", + "src": "33:23:8" + }, + { + "abstract": false, + "baseContracts": [], + "contractDependencies": [], + "contractKind": "library", + "documentation": null, + "fullyImplemented": true, + "id": 2365, + "linearizedBaseContracts": [ + 2365 + ], + "name": "SignedSafeMath", + "nodeType": "ContractDefinition", + "nodes": [ + { + "constant": true, + "id": 2175, + "mutability": "constant", + "name": "_INT256_MIN", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2365, + "src": "87:45:8", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 2170, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "87:6:8", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "value": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_rational_minus_57896044618658097711785492504343953926634992332820282019728792003956564819968_by_1", + "typeString": "int_const -578...(70 digits omitted)...9968" + }, + "id": 2174, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 2172, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "-", + "prefix": true, + "src": "125:2:8", + "subExpression": { + "argumentTypes": null, + "hexValue": "32", + "id": 2171, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "126:1:8", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_2_by_1", + "typeString": "int_const 2" + }, + "value": "2" + }, + "typeDescriptions": { + "typeIdentifier": "t_rational_minus_2_by_1", + "typeString": "int_const -2" + } + }, + "nodeType": "BinaryOperation", + "operator": "**", + "rightExpression": { + "argumentTypes": null, + "hexValue": "323535", + "id": 2173, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "129:3:8", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_255_by_1", + "typeString": "int_const 255" + }, + "value": "255" + }, + "src": "125:7:8", + "typeDescriptions": { + "typeIdentifier": "t_rational_minus_57896044618658097711785492504343953926634992332820282019728792003956564819968_by_1", + "typeString": "int_const -578...(70 digits omitted)...9968" + } + }, + "visibility": "private" + }, + { + "body": { + "id": 2223, + "nodeType": "Block", + "src": "442:490:8", + "statements": [ + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 2187, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 2185, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2178, + "src": "674:1:8", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "hexValue": "30", + "id": 2186, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "679:1:8", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "674:6:8", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 2191, + "nodeType": "IfStatement", + "src": "670:45:8", + "trueBody": { + "id": 2190, + "nodeType": "Block", + "src": "682:33:8", + "statements": [ + { + "expression": { + "argumentTypes": null, + "hexValue": "30", + "id": 2188, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "703:1:8", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "functionReturnParameters": 2184, + "id": 2189, + "nodeType": "Return", + "src": "696:8:8" + } + ] + } + }, + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 2202, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "!", + "prefix": true, + "src": "733:30:8", + "subExpression": { + "argumentTypes": null, + "components": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 2200, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 2196, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 2193, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2178, + "src": "735:1:8", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "id": 2195, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "-", + "prefix": true, + "src": "740:2:8", + "subExpression": { + "argumentTypes": null, + "hexValue": "31", + "id": 2194, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "741:1:8", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "typeDescriptions": { + "typeIdentifier": "t_rational_minus_1_by_1", + "typeString": "int_const -1" + } + }, + "src": "735:7:8", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 2199, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 2197, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2180, + "src": "746:1:8", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "id": 2198, + "name": "_INT256_MIN", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2175, + "src": "751:11:8", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "src": "746:16:8", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "735:27:8", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "id": 2201, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "734:29:8", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "argumentTypes": null, + "hexValue": "5369676e6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77", + "id": 2203, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "765:41:8", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_a608fbdf6cc4ee9c43b141f63e234f4edb26cfb78aba3140cfd865641cb2c954", + "typeString": "literal_string \"SignedSafeMath: multiplication overflow\"" + }, + "value": "SignedSafeMath: multiplication overflow" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_stringliteral_a608fbdf6cc4ee9c43b141f63e234f4edb26cfb78aba3140cfd865641cb2c954", + "typeString": "literal_string \"SignedSafeMath: multiplication overflow\"" + } + ], + "id": 2192, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [ + -18, + -18 + ], + "referencedDeclaration": -18, + "src": "725:7:8", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", + "typeString": "function (bool,string memory) pure" + } + }, + "id": 2204, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "725:82:8", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 2205, + "nodeType": "ExpressionStatement", + "src": "725:82:8" + }, + { + "assignments": [ + 2207 + ], + "declarations": [ + { + "constant": false, + "id": 2207, + "mutability": "mutable", + "name": "c", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2223, + "src": "818:8:8", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 2206, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "818:6:8", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "id": 2211, + "initialValue": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 2210, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 2208, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2178, + "src": "829:1:8", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "BinaryOperation", + "operator": "*", + "rightExpression": { + "argumentTypes": null, + "id": 2209, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2180, + "src": "833:1:8", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "src": "829:5:8", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "818:16:8" + }, + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 2217, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 2215, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 2213, + "name": "c", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2207, + "src": "852:1:8", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "BinaryOperation", + "operator": "/", + "rightExpression": { + "argumentTypes": null, + "id": 2214, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2178, + "src": "856:1:8", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "src": "852:5:8", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "id": 2216, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2180, + "src": "861:1:8", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "src": "852:10:8", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "argumentTypes": null, + "hexValue": "5369676e6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77", + "id": 2218, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "864:41:8", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_a608fbdf6cc4ee9c43b141f63e234f4edb26cfb78aba3140cfd865641cb2c954", + "typeString": "literal_string \"SignedSafeMath: multiplication overflow\"" + }, + "value": "SignedSafeMath: multiplication overflow" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_stringliteral_a608fbdf6cc4ee9c43b141f63e234f4edb26cfb78aba3140cfd865641cb2c954", + "typeString": "literal_string \"SignedSafeMath: multiplication overflow\"" + } + ], + "id": 2212, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [ + -18, + -18 + ], + "referencedDeclaration": -18, + "src": "844:7:8", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", + "typeString": "function (bool,string memory) pure" + } + }, + "id": 2219, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "844:62:8", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 2220, + "nodeType": "ExpressionStatement", + "src": "844:62:8" + }, + { + "expression": { + "argumentTypes": null, + "id": 2221, + "name": "c", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2207, + "src": "924:1:8", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "functionReturnParameters": 2184, + "id": 2222, + "nodeType": "Return", + "src": "917:8:8" + } + ] + }, + "documentation": { + "id": 2176, + "nodeType": "StructuredDocumentation", + "src": "139:234:8", + "text": " @dev Returns the multiplication of two signed integers, reverting on\n overflow.\n Counterpart to Solidity's `*` operator.\n Requirements:\n - Multiplication cannot overflow." + }, + "id": 2224, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "mul", + "nodeType": "FunctionDefinition", + "overrides": null, + "parameters": { + "id": 2181, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2178, + "mutability": "mutable", + "name": "a", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2224, + "src": "391:8:8", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 2177, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "391:6:8", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 2180, + "mutability": "mutable", + "name": "b", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2224, + "src": "401:8:8", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 2179, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "401:6:8", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "390:20:8" + }, + "returnParameters": { + "id": 2184, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2183, + "mutability": "mutable", + "name": "", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2224, + "src": "434:6:8", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 2182, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "434:6:8", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "433:8:8" + }, + "scope": 2365, + "src": "378:554:8", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 2263, + "nodeType": "Block", + "src": "1456:200:8", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 2237, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 2235, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2229, + "src": "1474:1:8", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "argumentTypes": null, + "hexValue": "30", + "id": 2236, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1479:1:8", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "1474:6:8", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "argumentTypes": null, + "hexValue": "5369676e6564536166654d6174683a206469766973696f6e206279207a65726f", + "id": 2238, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1482:34:8", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_ebc4d0068c2e029285c70894a725032247a74fcdc822ba305ea67dbddf7750bd", + "typeString": "literal_string \"SignedSafeMath: division by zero\"" + }, + "value": "SignedSafeMath: division by zero" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_stringliteral_ebc4d0068c2e029285c70894a725032247a74fcdc822ba305ea67dbddf7750bd", + "typeString": "literal_string \"SignedSafeMath: division by zero\"" + } + ], + "id": 2234, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [ + -18, + -18 + ], + "referencedDeclaration": -18, + "src": "1466:7:8", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", + "typeString": "function (bool,string memory) pure" + } + }, + "id": 2239, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "1466:51:8", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 2240, + "nodeType": "ExpressionStatement", + "src": "1466:51:8" + }, + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 2251, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "!", + "prefix": true, + "src": "1535:30:8", + "subExpression": { + "argumentTypes": null, + "components": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 2249, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 2245, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 2242, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2229, + "src": "1537:1:8", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "id": 2244, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "-", + "prefix": true, + "src": "1542:2:8", + "subExpression": { + "argumentTypes": null, + "hexValue": "31", + "id": 2243, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1543:1:8", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + }, + "typeDescriptions": { + "typeIdentifier": "t_rational_minus_1_by_1", + "typeString": "int_const -1" + } + }, + "src": "1537:7:8", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 2248, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 2246, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2227, + "src": "1548:1:8", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "id": 2247, + "name": "_INT256_MIN", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2175, + "src": "1553:11:8", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "src": "1548:16:8", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "1537:27:8", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "id": 2250, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "1536:29:8", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "argumentTypes": null, + "hexValue": "5369676e6564536166654d6174683a206469766973696f6e206f766572666c6f77", + "id": 2252, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1567:35:8", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_7bc0f3df013376568eb9f7cb8999198097051f79bdb4d07d83447767f5224b81", + "typeString": "literal_string \"SignedSafeMath: division overflow\"" + }, + "value": "SignedSafeMath: division overflow" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_stringliteral_7bc0f3df013376568eb9f7cb8999198097051f79bdb4d07d83447767f5224b81", + "typeString": "literal_string \"SignedSafeMath: division overflow\"" + } + ], + "id": 2241, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [ + -18, + -18 + ], + "referencedDeclaration": -18, + "src": "1527:7:8", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", + "typeString": "function (bool,string memory) pure" + } + }, + "id": 2253, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "1527:76:8", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 2254, + "nodeType": "ExpressionStatement", + "src": "1527:76:8" + }, + { + "assignments": [ + 2256 + ], + "declarations": [ + { + "constant": false, + "id": 2256, + "mutability": "mutable", + "name": "c", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2263, + "src": "1614:8:8", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 2255, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "1614:6:8", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "id": 2260, + "initialValue": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 2259, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 2257, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2227, + "src": "1625:1:8", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "BinaryOperation", + "operator": "/", + "rightExpression": { + "argumentTypes": null, + "id": 2258, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2229, + "src": "1629:1:8", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "src": "1625:5:8", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "1614:16:8" + }, + { + "expression": { + "argumentTypes": null, + "id": 2261, + "name": "c", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2256, + "src": "1648:1:8", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "functionReturnParameters": 2233, + "id": 2262, + "nodeType": "Return", + "src": "1641:8:8" + } + ] + }, + "documentation": { + "id": 2225, + "nodeType": "StructuredDocumentation", + "src": "938:449:8", + "text": " @dev Returns the integer division of two signed integers. Reverts on\n division by zero. The result is rounded towards zero.\n Counterpart to Solidity's `/` operator. Note: this function uses a\n `revert` opcode (which leaves remaining gas untouched) while Solidity\n uses an invalid opcode to revert (consuming all remaining gas).\n Requirements:\n - The divisor cannot be zero." + }, + "id": 2264, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "div", + "nodeType": "FunctionDefinition", + "overrides": null, + "parameters": { + "id": 2230, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2227, + "mutability": "mutable", + "name": "a", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2264, + "src": "1405:8:8", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 2226, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "1405:6:8", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 2229, + "mutability": "mutable", + "name": "b", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2264, + "src": "1415:8:8", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 2228, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "1415:6:8", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "1404:20:8" + }, + "returnParameters": { + "id": 2233, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2232, + "mutability": "mutable", + "name": "", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2264, + "src": "1448:6:8", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 2231, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "1448:6:8", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "1447:8:8" + }, + "scope": 2365, + "src": "1392:264:8", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 2303, + "nodeType": "Block", + "src": "1959:149:8", + "statements": [ + { + "assignments": [ + 2275 + ], + "declarations": [ + { + "constant": false, + "id": 2275, + "mutability": "mutable", + "name": "c", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2303, + "src": "1969:8:8", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 2274, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "1969:6:8", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "id": 2279, + "initialValue": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 2278, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 2276, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2267, + "src": "1980:1:8", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "BinaryOperation", + "operator": "-", + "rightExpression": { + "argumentTypes": null, + "id": 2277, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2269, + "src": "1984:1:8", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "src": "1980:5:8", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "1969:16:8" + }, + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 2297, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "components": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 2287, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 2283, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 2281, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2269, + "src": "2004:1:8", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">=", + "rightExpression": { + "argumentTypes": null, + "hexValue": "30", + "id": 2282, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2009:1:8", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "2004:6:8", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 2286, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 2284, + "name": "c", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2275, + "src": "2014:1:8", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<=", + "rightExpression": { + "argumentTypes": null, + "id": 2285, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2267, + "src": "2019:1:8", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "src": "2014:6:8", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "2004:16:8", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "id": 2288, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "2003:18:8", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "||", + "rightExpression": { + "argumentTypes": null, + "components": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 2295, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 2291, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 2289, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2269, + "src": "2026:1:8", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<", + "rightExpression": { + "argumentTypes": null, + "hexValue": "30", + "id": 2290, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2030:1:8", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "2026:5:8", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 2294, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 2292, + "name": "c", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2275, + "src": "2035:1:8", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "argumentTypes": null, + "id": 2293, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2267, + "src": "2039:1:8", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "src": "2035:5:8", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "2026:14:8", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "id": 2296, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "2025:16:8", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "2003:38:8", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "argumentTypes": null, + "hexValue": "5369676e6564536166654d6174683a207375627472616374696f6e206f766572666c6f77", + "id": 2298, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2043:38:8", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_dfe37ab0612d67daeef366062296f3ebcaf7e2cc3eb392bf66a6cb5a7bed3bcd", + "typeString": "literal_string \"SignedSafeMath: subtraction overflow\"" + }, + "value": "SignedSafeMath: subtraction overflow" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_stringliteral_dfe37ab0612d67daeef366062296f3ebcaf7e2cc3eb392bf66a6cb5a7bed3bcd", + "typeString": "literal_string \"SignedSafeMath: subtraction overflow\"" + } + ], + "id": 2280, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [ + -18, + -18 + ], + "referencedDeclaration": -18, + "src": "1995:7:8", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", + "typeString": "function (bool,string memory) pure" + } + }, + "id": 2299, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "1995:87:8", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 2300, + "nodeType": "ExpressionStatement", + "src": "1995:87:8" + }, + { + "expression": { + "argumentTypes": null, + "id": 2301, + "name": "c", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2275, + "src": "2100:1:8", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "functionReturnParameters": 2273, + "id": 2302, + "nodeType": "Return", + "src": "2093:8:8" + } + ] + }, + "documentation": { + "id": 2265, + "nodeType": "StructuredDocumentation", + "src": "1662:228:8", + "text": " @dev Returns the subtraction of two signed integers, reverting on\n overflow.\n Counterpart to Solidity's `-` operator.\n Requirements:\n - Subtraction cannot overflow." + }, + "id": 2304, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "sub", + "nodeType": "FunctionDefinition", + "overrides": null, + "parameters": { + "id": 2270, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2267, + "mutability": "mutable", + "name": "a", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2304, + "src": "1908:8:8", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 2266, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "1908:6:8", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 2269, + "mutability": "mutable", + "name": "b", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2304, + "src": "1918:8:8", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 2268, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "1918:6:8", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "1907:20:8" + }, + "returnParameters": { + "id": 2273, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2272, + "mutability": "mutable", + "name": "", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2304, + "src": "1951:6:8", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 2271, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "1951:6:8", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "1950:8:8" + }, + "scope": 2365, + "src": "1895:213:8", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 2343, + "nodeType": "Block", + "src": "2405:146:8", + "statements": [ + { + "assignments": [ + 2315 + ], + "declarations": [ + { + "constant": false, + "id": 2315, + "mutability": "mutable", + "name": "c", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2343, + "src": "2415:8:8", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 2314, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "2415:6:8", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "id": 2319, + "initialValue": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 2318, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 2316, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2307, + "src": "2426:1:8", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "argumentTypes": null, + "id": 2317, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2309, + "src": "2430:1:8", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "src": "2426:5:8", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "2415:16:8" + }, + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 2337, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "components": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 2327, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 2323, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 2321, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2309, + "src": "2450:1:8", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">=", + "rightExpression": { + "argumentTypes": null, + "hexValue": "30", + "id": 2322, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2455:1:8", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "2450:6:8", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 2326, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 2324, + "name": "c", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2315, + "src": "2460:1:8", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">=", + "rightExpression": { + "argumentTypes": null, + "id": 2325, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2307, + "src": "2465:1:8", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "src": "2460:6:8", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "2450:16:8", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "id": 2328, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "2449:18:8", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "||", + "rightExpression": { + "argumentTypes": null, + "components": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 2335, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 2331, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 2329, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2309, + "src": "2472:1:8", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<", + "rightExpression": { + "argumentTypes": null, + "hexValue": "30", + "id": 2330, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2476:1:8", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "2472:5:8", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 2334, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 2332, + "name": "c", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2315, + "src": "2481:1:8", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<", + "rightExpression": { + "argumentTypes": null, + "id": 2333, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2307, + "src": "2485:1:8", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "src": "2481:5:8", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "2472:14:8", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + } + ], + "id": 2336, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "2471:16:8", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "2449:38:8", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "argumentTypes": null, + "hexValue": "5369676e6564536166654d6174683a206164646974696f6e206f766572666c6f77", + "id": 2338, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2489:35:8", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_47c8d4a3974eee4fcf9925cffefc088ed6ac723b55fb65cf621edb1b7db7b8eb", + "typeString": "literal_string \"SignedSafeMath: addition overflow\"" + }, + "value": "SignedSafeMath: addition overflow" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_stringliteral_47c8d4a3974eee4fcf9925cffefc088ed6ac723b55fb65cf621edb1b7db7b8eb", + "typeString": "literal_string \"SignedSafeMath: addition overflow\"" + } + ], + "id": 2320, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [ + -18, + -18 + ], + "referencedDeclaration": -18, + "src": "2441:7:8", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", + "typeString": "function (bool,string memory) pure" + } + }, + "id": 2339, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "2441:84:8", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 2340, + "nodeType": "ExpressionStatement", + "src": "2441:84:8" + }, + { + "expression": { + "argumentTypes": null, + "id": 2341, + "name": "c", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2315, + "src": "2543:1:8", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "functionReturnParameters": 2313, + "id": 2342, + "nodeType": "Return", + "src": "2536:8:8" + } + ] + }, + "documentation": { + "id": 2305, + "nodeType": "StructuredDocumentation", + "src": "2114:222:8", + "text": " @dev Returns the addition of two signed integers, reverting on\n overflow.\n Counterpart to Solidity's `+` operator.\n Requirements:\n - Addition cannot overflow." + }, + "id": 2344, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "add", + "nodeType": "FunctionDefinition", + "overrides": null, + "parameters": { + "id": 2310, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2307, + "mutability": "mutable", + "name": "a", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2344, + "src": "2354:8:8", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 2306, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "2354:6:8", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 2309, + "mutability": "mutable", + "name": "b", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2344, + "src": "2364:8:8", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 2308, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "2364:6:8", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "2353:20:8" + }, + "returnParameters": { + "id": 2313, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2312, + "mutability": "mutable", + "name": "", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2344, + "src": "2397:6:8", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 2311, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "2397:6:8", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "2396:8:8" + }, + "scope": 2365, + "src": "2341:210:8", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 2363, + "nodeType": "Block", + "src": "2618:74:8", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "id": 2354, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 2352, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2346, + "src": "2636:1:8", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">=", + "rightExpression": { + "argumentTypes": null, + "hexValue": "30", + "id": 2353, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2641:1:8", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "2636:6:8", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "argumentTypes": null, + "hexValue": "496e7465676572203c2030", + "id": 2355, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2644:13:8", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_072bbf819d7fcc25efb63989aaa3ad43d444efad2d36a2598ffe45c4c4d00f7a", + "typeString": "literal_string \"Integer < 0\"" + }, + "value": "Integer < 0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_stringliteral_072bbf819d7fcc25efb63989aaa3ad43d444efad2d36a2598ffe45c4c4d00f7a", + "typeString": "literal_string \"Integer < 0\"" + } + ], + "id": 2351, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [ + -18, + -18 + ], + "referencedDeclaration": -18, + "src": "2628:7:8", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", + "typeString": "function (bool,string memory) pure" + } + }, + "id": 2356, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "2628:30:8", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 2357, + "nodeType": "ExpressionStatement", + "src": "2628:30:8" + }, + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 2360, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2346, + "src": "2683:1:8", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + ], + "id": 2359, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "2675:7:8", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_uint256_$", + "typeString": "type(uint256)" + }, + "typeName": { + "id": 2358, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2675:7:8", + "typeDescriptions": { + "typeIdentifier": null, + "typeString": null + } + } + }, + "id": 2361, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "2675:10:8", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 2350, + "id": 2362, + "nodeType": "Return", + "src": "2668:17:8" + } + ] + }, + "documentation": null, + "id": 2364, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "toUInt256", + "nodeType": "FunctionDefinition", + "overrides": null, + "parameters": { + "id": 2347, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2346, + "mutability": "mutable", + "name": "a", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2364, + "src": "2576:8:8", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + }, + "typeName": { + "id": 2345, + "name": "int256", + "nodeType": "ElementaryTypeName", + "src": "2576:6:8", + "typeDescriptions": { + "typeIdentifier": "t_int256", + "typeString": "int256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "2575:10:8" + }, + "returnParameters": { + "id": 2350, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2349, + "mutability": "mutable", + "name": "", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2364, + "src": "2609:7:8", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2348, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2609:7:8", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "2608:9:8" + }, + "scope": 2365, + "src": "2557:135:8", + "stateMutability": "pure", + "virtual": false, + "visibility": "internal" + } + ], + "scope": 2366, + "src": "58:2636:8" + } + ], + "src": "33:2661:8" + }, + "id": 8 + }, + "contracts/mocks/ComplexRewarder.sol": { + "ast": { + "absolutePath": "contracts/mocks/ComplexRewarder.sol", + "exportedSymbols": { + "ComplexRewarder": [ + 2985 + ] + }, + "id": 2986, + "license": "MIT", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 2367, + "literals": [ + "solidity", + "0.6", + ".12" + ], + "nodeType": "PragmaDirective", + "src": "33:23:9" + }, + { + "id": 2368, + "literals": [ + "experimental", + "ABIEncoderV2" + ], + "nodeType": "PragmaDirective", + "src": "57:33:9" + }, + { + "absolutePath": "contracts/interfaces/IRewarder.sol", + "file": "../interfaces/IRewarder.sol", + "id": 2369, + "nodeType": "ImportDirective", + "scope": 2986, + "sourceUnit": 2168, + "src": "91:37:9", + "symbolAliases": [], + "unitAlias": "" + }, + { + "absolutePath": "@boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol", + "file": "@boringcrypto/boring-solidity/contracts/libraries/BoringERC20.sol", + "id": 2370, + "nodeType": "ImportDirective", + "scope": 2986, + "sourceUnit": 554, + "src": "129:75:9", + "symbolAliases": [], + "unitAlias": "" + }, + { + "absolutePath": "@boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol", + "file": "@boringcrypto/boring-solidity/contracts/libraries/BoringMath.sol", + "id": 2371, + "nodeType": "ImportDirective", + "scope": 2986, + "sourceUnit": 842, + "src": "205:74:9", + "symbolAliases": [], + "unitAlias": "" + }, + { + "absolutePath": "@boringcrypto/boring-solidity/contracts/BoringOwnable.sol", + "file": "@boringcrypto/boring-solidity/contracts/BoringOwnable.sol", + "id": 2372, + "nodeType": "ImportDirective", + "scope": 2986, + "sourceUnit": 272, + "src": "280:67:9", + "symbolAliases": [], + "unitAlias": "" + }, + { + "absolutePath": "contracts/MasterChefV2.sol", + "file": "../MasterChefV2.sol", + "id": 2373, + "nodeType": "ImportDirective", + "scope": 2986, + "sourceUnit": 2092, + "src": "348:29:9", + "symbolAliases": [], + "unitAlias": "" + }, + { + "abstract": false, + "baseContracts": [ + { + "arguments": null, + "baseName": { + "contractScope": null, + "id": 2375, + "name": "IRewarder", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 2167, + "src": "427:9:9", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IRewarder_$2167", + "typeString": "contract IRewarder" + } + }, + "id": 2376, + "nodeType": "InheritanceSpecifier", + "src": "427:9:9" + }, + { + "arguments": null, + "baseName": { + "contractScope": null, + "id": 2377, + "name": "BoringOwnable", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 271, + "src": "439:13:9", + "typeDescriptions": { + "typeIdentifier": "t_contract$_BoringOwnable_$271", + "typeString": "contract BoringOwnable" + } + }, + "id": 2378, + "nodeType": "InheritanceSpecifier", + "src": "439:13:9" + } + ], + "contractDependencies": [ + 152, + 271, + 2167 + ], + "contractKind": "contract", + "documentation": { + "id": 2374, + "nodeType": "StructuredDocumentation", + "src": "379:20:9", + "text": "@author @0xKeno" + }, + "fullyImplemented": true, + "id": 2985, + "linearizedBaseContracts": [ + 2985, + 271, + 152, + 2167 + ], + "name": "ComplexRewarder", + "nodeType": "ContractDefinition", + "nodes": [ + { + "id": 2381, + "libraryName": { + "contractScope": null, + "id": 2379, + "name": "BoringMath", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 706, + "src": "464:10:9", + "typeDescriptions": { + "typeIdentifier": "t_contract$_BoringMath_$706", + "typeString": "library BoringMath" + } + }, + "nodeType": "UsingForDirective", + "src": "458:29:9", + "typeName": { + "id": 2380, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "479:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + }, + { + "id": 2384, + "libraryName": { + "contractScope": null, + "id": 2382, + "name": "BoringMath128", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 751, + "src": "498:13:9", + "typeDescriptions": { + "typeIdentifier": "t_contract$_BoringMath128_$751", + "typeString": "library BoringMath128" + } + }, + "nodeType": "UsingForDirective", + "src": "492:32:9", + "typeName": { + "id": 2383, + "name": "uint128", + "nodeType": "ElementaryTypeName", + "src": "516:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint128", + "typeString": "uint128" + } + } + }, + { + "id": 2387, + "libraryName": { + "contractScope": null, + "id": 2385, + "name": "BoringERC20", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 553, + "src": "535:11:9", + "typeDescriptions": { + "typeIdentifier": "t_contract$_BoringERC20_$553", + "typeString": "library BoringERC20" + } + }, + "nodeType": "UsingForDirective", + "src": "529:29:9", + "typeName": { + "contractScope": null, + "id": 2386, + "name": "IERC20", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 337, + "src": "551:6:9", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + } + }, + { + "constant": false, + "id": 2389, + "mutability": "immutable", + "name": "rewardToken", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2985, + "src": "564:36:9", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + }, + "typeName": { + "contractScope": null, + "id": 2388, + "name": "IERC20", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 337, + "src": "564:6:9", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + }, + "value": null, + "visibility": "private" + }, + { + "canonicalName": "ComplexRewarder.UserInfo", + "id": 2394, + "members": [ + { + "constant": false, + "id": 2391, + "mutability": "mutable", + "name": "amount", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2394, + "src": "792:14:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2390, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "792:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 2393, + "mutability": "mutable", + "name": "rewardDebt", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2394, + "src": "816:18:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2392, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "816:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "name": "UserInfo", + "nodeType": "StructDefinition", + "scope": 2985, + "src": "766:75:9", + "visibility": "public" + }, + { + "canonicalName": "ComplexRewarder.PoolInfo", + "id": 2401, + "members": [ + { + "constant": false, + "id": 2396, + "mutability": "mutable", + "name": "accSushiPerShare", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2401, + "src": "1055:24:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint128", + "typeString": "uint128" + }, + "typeName": { + "id": 2395, + "name": "uint128", + "nodeType": "ElementaryTypeName", + "src": "1055:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint128", + "typeString": "uint128" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 2398, + "mutability": "mutable", + "name": "lastRewardBlock", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2401, + "src": "1089:22:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + "typeName": { + "id": 2397, + "name": "uint64", + "nodeType": "ElementaryTypeName", + "src": "1089:6:9", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 2400, + "mutability": "mutable", + "name": "allocPoint", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2401, + "src": "1121:17:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + "typeName": { + "id": 2399, + "name": "uint64", + "nodeType": "ElementaryTypeName", + "src": "1121:6:9", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "value": null, + "visibility": "internal" + } + ], + "name": "PoolInfo", + "nodeType": "StructDefinition", + "scope": 2985, + "src": "1029:116:9", + "visibility": "public" + }, + { + "constant": false, + "documentation": { + "id": 2402, + "nodeType": "StructuredDocumentation", + "src": "1151:30:9", + "text": "@notice Info of each pool." + }, + "functionSelector": "1526fe27", + "id": 2406, + "mutability": "mutable", + "name": "poolInfo", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2985, + "src": "1186:45:9", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_uint256_$_t_struct$_PoolInfo_$2401_storage_$", + "typeString": "mapping(uint256 => struct ComplexRewarder.PoolInfo)" + }, + "typeName": { + "id": 2405, + "keyType": { + "id": 2403, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1195:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Mapping", + "src": "1186:29:9", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_uint256_$_t_struct$_PoolInfo_$2401_storage_$", + "typeString": "mapping(uint256 => struct ComplexRewarder.PoolInfo)" + }, + "valueType": { + "contractScope": null, + "id": 2404, + "name": "PoolInfo", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 2401, + "src": "1206:8:9", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$2401_storage_ptr", + "typeString": "struct ComplexRewarder.PoolInfo" + } + } + }, + "value": null, + "visibility": "public" + }, + { + "constant": false, + "functionSelector": "69883b4e", + "id": 2409, + "mutability": "mutable", + "name": "poolIds", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2985, + "src": "1238:24:9", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_uint256_$dyn_storage", + "typeString": "uint256[]" + }, + "typeName": { + "baseType": { + "id": 2407, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1238:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 2408, + "length": null, + "nodeType": "ArrayTypeName", + "src": "1238:9:9", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr", + "typeString": "uint256[]" + } + }, + "value": null, + "visibility": "public" + }, + { + "constant": false, + "documentation": { + "id": 2410, + "nodeType": "StructuredDocumentation", + "src": "1269:52:9", + "text": "@notice Info of each user that stakes LP tokens." + }, + "functionSelector": "93f1a40b", + "id": 2416, + "mutability": "mutable", + "name": "userInfo", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2985, + "src": "1326:66:9", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_uint256_$_t_mapping$_t_address_$_t_struct$_UserInfo_$2394_storage_$_$", + "typeString": "mapping(uint256 => mapping(address => struct ComplexRewarder.UserInfo))" + }, + "typeName": { + "id": 2415, + "keyType": { + "id": 2411, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1335:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Mapping", + "src": "1326:50:9", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_uint256_$_t_mapping$_t_address_$_t_struct$_UserInfo_$2394_storage_$_$", + "typeString": "mapping(uint256 => mapping(address => struct ComplexRewarder.UserInfo))" + }, + "valueType": { + "id": 2414, + "keyType": { + "id": 2412, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1355:7:9", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "Mapping", + "src": "1346:29:9", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_UserInfo_$2394_storage_$", + "typeString": "mapping(address => struct ComplexRewarder.UserInfo)" + }, + "valueType": { + "contractScope": null, + "id": 2413, + "name": "UserInfo", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 2394, + "src": "1366:8:9", + "typeDescriptions": { + "typeIdentifier": "t_struct$_UserInfo_$2394_storage_ptr", + "typeString": "struct ComplexRewarder.UserInfo" + } + } + } + }, + "value": null, + "visibility": "public" + }, + { + "constant": false, + "documentation": { + "id": 2417, + "nodeType": "StructuredDocumentation", + "src": "1398:88:9", + "text": "@dev Total allocation points. Must be the sum of all allocation points in all pools." + }, + "id": 2419, + "mutability": "mutable", + "name": "totalAllocPoint", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2985, + "src": "1491:23:9", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2418, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1491:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "functionSelector": "4198709a", + "id": 2421, + "mutability": "mutable", + "name": "tokenPerBlock", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2985, + "src": "1521:28:9", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2420, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1521:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "public" + }, + { + "constant": true, + "id": 2424, + "mutability": "constant", + "name": "ACC_TOKEN_PRECISION", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2985, + "src": "1555:51:9", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2422, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1555:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": { + "argumentTypes": null, + "hexValue": "31653132", + "id": 2423, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "1602:4:9", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_1000000000000_by_1", + "typeString": "int_const 1000000000000" + }, + "value": "1e12" + }, + "visibility": "private" + }, + { + "constant": false, + "id": 2426, + "mutability": "immutable", + "name": "MASTERCHEF_V2", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2985, + "src": "1613:39:9", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2425, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1613:7:9", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "private" + }, + { + "anonymous": false, + "documentation": null, + "id": 2436, + "name": "LogOnReward", + "nodeType": "EventDefinition", + "parameters": { + "id": 2435, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2428, + "indexed": true, + "mutability": "mutable", + "name": "user", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2436, + "src": "1677:20:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2427, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1677:7:9", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 2430, + "indexed": true, + "mutability": "mutable", + "name": "pid", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2436, + "src": "1699:19:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2429, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1699:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 2432, + "indexed": false, + "mutability": "mutable", + "name": "amount", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2436, + "src": "1720:14:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2431, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1720:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 2434, + "indexed": true, + "mutability": "mutable", + "name": "to", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2436, + "src": "1736:18:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2433, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "1736:7:9", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "1676:79:9" + }, + "src": "1659:97:9" + }, + { + "anonymous": false, + "documentation": null, + "id": 2442, + "name": "LogPoolAddition", + "nodeType": "EventDefinition", + "parameters": { + "id": 2441, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2438, + "indexed": true, + "mutability": "mutable", + "name": "pid", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2442, + "src": "1783:19:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2437, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1783:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 2440, + "indexed": false, + "mutability": "mutable", + "name": "allocPoint", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2442, + "src": "1804:18:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2439, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1804:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "1782:41:9" + }, + "src": "1761:63:9" + }, + { + "anonymous": false, + "documentation": null, + "id": 2448, + "name": "LogSetPool", + "nodeType": "EventDefinition", + "parameters": { + "id": 2447, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2444, + "indexed": true, + "mutability": "mutable", + "name": "pid", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2448, + "src": "1846:19:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2443, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1846:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 2446, + "indexed": false, + "mutability": "mutable", + "name": "allocPoint", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2448, + "src": "1867:18:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2445, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1867:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "1845:41:9" + }, + "src": "1829:58:9" + }, + { + "anonymous": false, + "documentation": null, + "id": 2458, + "name": "LogUpdatePool", + "nodeType": "EventDefinition", + "parameters": { + "id": 2457, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2450, + "indexed": true, + "mutability": "mutable", + "name": "pid", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2458, + "src": "1912:19:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2449, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1912:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 2452, + "indexed": false, + "mutability": "mutable", + "name": "lastRewardBlock", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2458, + "src": "1933:22:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + "typeName": { + "id": 2451, + "name": "uint64", + "nodeType": "ElementaryTypeName", + "src": "1933:6:9", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 2454, + "indexed": false, + "mutability": "mutable", + "name": "lpSupply", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2458, + "src": "1957:16:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2453, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1957:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 2456, + "indexed": false, + "mutability": "mutable", + "name": "accSushiPerShare", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2458, + "src": "1975:24:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2455, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "1975:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "1911:89:9" + }, + "src": "1892:109:9" + }, + { + "anonymous": false, + "documentation": null, + "id": 2460, + "name": "LogInit", + "nodeType": "EventDefinition", + "parameters": { + "id": 2459, + "nodeType": "ParameterList", + "parameters": [], + "src": "2019:2:9" + }, + "src": "2006:16:9" + }, + { + "body": { + "id": 2481, + "nodeType": "Block", + "src": "2117:123:9", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 2471, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 2469, + "name": "rewardToken", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2389, + "src": "2127:11:9", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "id": 2470, + "name": "_rewardToken", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2462, + "src": "2141:12:9", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + }, + "src": "2127:26:9", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + }, + "id": 2472, + "nodeType": "ExpressionStatement", + "src": "2127:26:9" + }, + { + "expression": { + "argumentTypes": null, + "id": 2475, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 2473, + "name": "tokenPerBlock", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2421, + "src": "2163:13:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "id": 2474, + "name": "_tokenPerBlock", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2464, + "src": "2179:14:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "2163:30:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 2476, + "nodeType": "ExpressionStatement", + "src": "2163:30:9" + }, + { + "expression": { + "argumentTypes": null, + "id": 2479, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 2477, + "name": "MASTERCHEF_V2", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2426, + "src": "2203:13:9", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "id": 2478, + "name": "_MASTERCHEF_V2", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2466, + "src": "2219:14:9", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "2203:30:9", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "id": 2480, + "nodeType": "ExpressionStatement", + "src": "2203:30:9" + } + ] + }, + "documentation": null, + "id": 2482, + "implemented": true, + "kind": "constructor", + "modifiers": [], + "name": "", + "nodeType": "FunctionDefinition", + "overrides": null, + "parameters": { + "id": 2467, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2462, + "mutability": "mutable", + "name": "_rewardToken", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2482, + "src": "2041:19:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + }, + "typeName": { + "contractScope": null, + "id": 2461, + "name": "IERC20", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 337, + "src": "2041:6:9", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 2464, + "mutability": "mutable", + "name": "_tokenPerBlock", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2482, + "src": "2062:22:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2463, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2062:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 2466, + "mutability": "mutable", + "name": "_MASTERCHEF_V2", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2482, + "src": "2086:22:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2465, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2086:7:9", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "2040:69:9" + }, + "returnParameters": { + "id": 2468, + "nodeType": "ParameterList", + "parameters": [], + "src": "2117:0:9" + }, + "scope": 2985, + "src": "2028:212:9", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "public" + }, + { + "baseFunctions": [ + 2151 + ], + "body": { + "id": 2569, + "nodeType": "Block", + "src": "2364:553:9", + "statements": [ + { + "assignments": [ + 2499 + ], + "declarations": [ + { + "constant": false, + "id": 2499, + "mutability": "mutable", + "name": "pool", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2569, + "src": "2374:20:9", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$2401_memory_ptr", + "typeString": "struct ComplexRewarder.PoolInfo" + }, + "typeName": { + "contractScope": null, + "id": 2498, + "name": "PoolInfo", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 2401, + "src": "2374:8:9", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$2401_storage_ptr", + "typeString": "struct ComplexRewarder.PoolInfo" + } + }, + "value": null, + "visibility": "internal" + } + ], + "id": 2503, + "initialValue": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 2501, + "name": "pid", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2484, + "src": "2408:3:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 2500, + "name": "updatePool", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2984, + "src": "2397:10:9", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$returns$_t_struct$_PoolInfo_$2401_memory_ptr_$", + "typeString": "function (uint256) returns (struct ComplexRewarder.PoolInfo memory)" + } + }, + "id": 2502, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "2397:15:9", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$2401_memory_ptr", + "typeString": "struct ComplexRewarder.PoolInfo memory" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "2374:38:9" + }, + { + "assignments": [ + 2505 + ], + "declarations": [ + { + "constant": false, + "id": 2505, + "mutability": "mutable", + "name": "user", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2569, + "src": "2422:21:9", + "stateVariable": false, + "storageLocation": "storage", + "typeDescriptions": { + "typeIdentifier": "t_struct$_UserInfo_$2394_storage_ptr", + "typeString": "struct ComplexRewarder.UserInfo" + }, + "typeName": { + "contractScope": null, + "id": 2504, + "name": "UserInfo", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 2394, + "src": "2422:8:9", + "typeDescriptions": { + "typeIdentifier": "t_struct$_UserInfo_$2394_storage_ptr", + "typeString": "struct ComplexRewarder.UserInfo" + } + }, + "value": null, + "visibility": "internal" + } + ], + "id": 2511, + "initialValue": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 2506, + "name": "userInfo", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2416, + "src": "2446:8:9", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_uint256_$_t_mapping$_t_address_$_t_struct$_UserInfo_$2394_storage_$_$", + "typeString": "mapping(uint256 => mapping(address => struct ComplexRewarder.UserInfo storage ref))" + } + }, + "id": 2508, + "indexExpression": { + "argumentTypes": null, + "id": 2507, + "name": "pid", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2484, + "src": "2455:3:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "2446:13:9", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_UserInfo_$2394_storage_$", + "typeString": "mapping(address => struct ComplexRewarder.UserInfo storage ref)" + } + }, + "id": 2510, + "indexExpression": { + "argumentTypes": null, + "id": 2509, + "name": "_user", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2486, + "src": "2460:5:9", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "2446:20:9", + "typeDescriptions": { + "typeIdentifier": "t_struct$_UserInfo_$2394_storage", + "typeString": "struct ComplexRewarder.UserInfo storage ref" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "2422:44:9" + }, + { + "assignments": [ + 2513 + ], + "declarations": [ + { + "constant": false, + "id": 2513, + "mutability": "mutable", + "name": "pending", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2569, + "src": "2476:15:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2512, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2476:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "id": 2514, + "initialValue": null, + "nodeType": "VariableDeclarationStatement", + "src": "2476:15:9" + }, + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 2518, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 2515, + "name": "user", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2505, + "src": "2505:4:9", + "typeDescriptions": { + "typeIdentifier": "t_struct$_UserInfo_$2394_storage_ptr", + "typeString": "struct ComplexRewarder.UserInfo storage pointer" + } + }, + "id": 2516, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberName": "amount", + "nodeType": "MemberAccess", + "referencedDeclaration": 2391, + "src": "2505:11:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "argumentTypes": null, + "hexValue": "30", + "id": 2517, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "2519:1:9", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "2505:15:9", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 2543, + "nodeType": "IfStatement", + "src": "2501:244:9", + "trueBody": { + "id": 2542, + "nodeType": "Block", + "src": "2522:223:9", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 2533, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 2519, + "name": "pending", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2513, + "src": "2536:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 2530, + "name": "user", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2505, + "src": "2650:4:9", + "typeDescriptions": { + "typeIdentifier": "t_struct$_UserInfo_$2394_storage_ptr", + "typeString": "struct ComplexRewarder.UserInfo storage pointer" + } + }, + "id": 2531, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberName": "rewardDebt", + "nodeType": "MemberAccess", + "referencedDeclaration": 2393, + "src": "2650:15:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "components": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 2527, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 2523, + "name": "pool", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2499, + "src": "2579:4:9", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$2401_memory_ptr", + "typeString": "struct ComplexRewarder.PoolInfo memory" + } + }, + "id": 2524, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberName": "accSushiPerShare", + "nodeType": "MemberAccess", + "referencedDeclaration": 2396, + "src": "2579:21:9", + "typeDescriptions": { + "typeIdentifier": "t_uint128", + "typeString": "uint128" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint128", + "typeString": "uint128" + } + ], + "expression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 2520, + "name": "user", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2505, + "src": "2563:4:9", + "typeDescriptions": { + "typeIdentifier": "t_struct$_UserInfo_$2394_storage_ptr", + "typeString": "struct ComplexRewarder.UserInfo storage pointer" + } + }, + "id": 2521, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberName": "amount", + "nodeType": "MemberAccess", + "referencedDeclaration": 2391, + "src": "2563:11:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 2522, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "mul", + "nodeType": "MemberAccess", + "referencedDeclaration": 627, + "src": "2563:15:9", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 2525, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "2563:38:9", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "/", + "rightExpression": { + "argumentTypes": null, + "id": 2526, + "name": "ACC_TOKEN_PRECISION", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2424, + "src": "2604:19:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "2563:60:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 2528, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "2562:62:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 2529, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sub", + "nodeType": "MemberAccess", + "referencedDeclaration": 599, + "src": "2562:66:9", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 2532, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "2562:121:9", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "2536:147:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 2534, + "nodeType": "ExpressionStatement", + "src": "2536:147:9" + }, + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 2538, + "name": "to", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2488, + "src": "2722:2:9", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 2539, + "name": "pending", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2513, + "src": "2726:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "id": 2535, + "name": "rewardToken", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2389, + "src": "2697:11:9", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + }, + "id": 2537, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "safeTransfer", + "nodeType": "MemberAccess", + "referencedDeclaration": 503, + "src": "2697:24:9", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20_$337_$_t_address_$_t_uint256_$returns$__$bound_to$_t_contract$_IERC20_$337_$", + "typeString": "function (contract IERC20,address,uint256)" + } + }, + "id": 2540, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "2697:37:9", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 2541, + "nodeType": "ExpressionStatement", + "src": "2697:37:9" + } + ] + } + }, + { + "expression": { + "argumentTypes": null, + "id": 2548, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 2544, + "name": "user", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2505, + "src": "2754:4:9", + "typeDescriptions": { + "typeIdentifier": "t_struct$_UserInfo_$2394_storage_ptr", + "typeString": "struct ComplexRewarder.UserInfo storage pointer" + } + }, + "id": 2546, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "memberName": "amount", + "nodeType": "MemberAccess", + "referencedDeclaration": 2391, + "src": "2754:11:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "id": 2547, + "name": "lpToken", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2492, + "src": "2768:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "2754:21:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 2549, + "nodeType": "ExpressionStatement", + "src": "2754:21:9" + }, + { + "expression": { + "argumentTypes": null, + "id": 2560, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 2550, + "name": "user", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2505, + "src": "2785:4:9", + "typeDescriptions": { + "typeIdentifier": "t_struct$_UserInfo_$2394_storage_ptr", + "typeString": "struct ComplexRewarder.UserInfo storage pointer" + } + }, + "id": 2552, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "memberName": "rewardDebt", + "nodeType": "MemberAccess", + "referencedDeclaration": 2393, + "src": "2785:15:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 2559, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 2555, + "name": "pool", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2499, + "src": "2815:4:9", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$2401_memory_ptr", + "typeString": "struct ComplexRewarder.PoolInfo memory" + } + }, + "id": 2556, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberName": "accSushiPerShare", + "nodeType": "MemberAccess", + "referencedDeclaration": 2396, + "src": "2815:21:9", + "typeDescriptions": { + "typeIdentifier": "t_uint128", + "typeString": "uint128" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint128", + "typeString": "uint128" + } + ], + "expression": { + "argumentTypes": null, + "id": 2553, + "name": "lpToken", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2492, + "src": "2803:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 2554, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "mul", + "nodeType": "MemberAccess", + "referencedDeclaration": 627, + "src": "2803:11:9", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 2557, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "2803:34:9", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "/", + "rightExpression": { + "argumentTypes": null, + "id": 2558, + "name": "ACC_TOKEN_PRECISION", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2424, + "src": "2840:19:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "2803:56:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "2785:74:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 2561, + "nodeType": "ExpressionStatement", + "src": "2785:74:9" + }, + { + "eventCall": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 2563, + "name": "_user", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2486, + "src": "2886:5:9", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + { + "argumentTypes": null, + "id": 2564, + "name": "pid", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2484, + "src": "2893:3:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "argumentTypes": null, + "id": 2565, + "name": "pending", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2513, + "src": "2898:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "argumentTypes": null, + "id": 2566, + "name": "to", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2488, + "src": "2907:2:9", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 2562, + "name": "LogOnReward", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2436, + "src": "2874:11:9", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint256_$_t_uint256_$_t_address_$returns$__$", + "typeString": "function (address,uint256,uint256,address)" + } + }, + "id": 2567, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "2874:36:9", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 2568, + "nodeType": "EmitStatement", + "src": "2869:41:9" + } + ] + }, + "documentation": null, + "functionSelector": "8bf63742", + "id": 2570, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "arguments": null, + "id": 2495, + "modifierName": { + "argumentTypes": null, + "id": 2494, + "name": "onlyMCV2", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2640, + "src": "2337:8:9", + "typeDescriptions": { + "typeIdentifier": "t_modifier$__$", + "typeString": "modifier ()" + } + }, + "nodeType": "ModifierInvocation", + "src": "2337:8:9" + } + ], + "name": "onSushiReward", + "nodeType": "FunctionDefinition", + "overrides": { + "id": 2496, + "nodeType": "OverrideSpecifier", + "overrides": [], + "src": "2346:8:9" + }, + "parameters": { + "id": 2493, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2484, + "mutability": "mutable", + "name": "pid", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2570, + "src": "2271:11:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2483, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2271:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 2486, + "mutability": "mutable", + "name": "_user", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2570, + "src": "2284:13:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2485, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2284:7:9", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 2488, + "mutability": "mutable", + "name": "to", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2570, + "src": "2299:10:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2487, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2299:7:9", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 2490, + "mutability": "mutable", + "name": "", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2570, + "src": "2311:7:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2489, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2311:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 2492, + "mutability": "mutable", + "name": "lpToken", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2570, + "src": "2320:15:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2491, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2320:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "2270:66:9" + }, + "returnParameters": { + "id": 2497, + "nodeType": "ParameterList", + "parameters": [], + "src": "2364:0:9" + }, + "scope": 2985, + "src": "2247:670:9", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "baseFunctions": [ + 2166 + ], + "body": { + "id": 2627, + "nodeType": "Block", + "src": "3075:267:9", + "statements": [ + { + "assignments": [ + 2589 + ], + "declarations": [ + { + "constant": false, + "id": 2589, + "mutability": "mutable", + "name": "_rewardTokens", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2627, + "src": "3085:29:9", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_contract$_IERC20_$337_$dyn_memory_ptr", + "typeString": "contract IERC20[]" + }, + "typeName": { + "baseType": { + "contractScope": null, + "id": 2587, + "name": "IERC20", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 337, + "src": "3085:6:9", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + }, + "id": 2588, + "length": null, + "nodeType": "ArrayTypeName", + "src": "3085:8:9", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_contract$_IERC20_$337_$dyn_storage_ptr", + "typeString": "contract IERC20[]" + } + }, + "value": null, + "visibility": "internal" + } + ], + "id": 2595, + "initialValue": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "31", + "id": 2593, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "3130:1:9", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + } + ], + "id": 2592, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "NewExpression", + "src": "3117:12:9", + "typeDescriptions": { + "typeIdentifier": "t_function_objectcreation_pure$_t_uint256_$returns$_t_array$_t_contract$_IERC20_$337_$dyn_memory_ptr_$", + "typeString": "function (uint256) pure returns (contract IERC20[] memory)" + }, + "typeName": { + "baseType": { + "contractScope": null, + "id": 2590, + "name": "IERC20", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 337, + "src": "3121:6:9", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + }, + "id": 2591, + "length": null, + "nodeType": "ArrayTypeName", + "src": "3121:8:9", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_contract$_IERC20_$337_$dyn_storage_ptr", + "typeString": "contract IERC20[]" + } + } + }, + "id": 2594, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "3117:15:9", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_array$_t_contract$_IERC20_$337_$dyn_memory_ptr", + "typeString": "contract IERC20[] memory" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "3085:47:9" + }, + { + "expression": { + "argumentTypes": null, + "id": 2601, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 2596, + "name": "_rewardTokens", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2589, + "src": "3142:13:9", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_contract$_IERC20_$337_$dyn_memory_ptr", + "typeString": "contract IERC20[] memory" + } + }, + "id": 2598, + "indexExpression": { + "argumentTypes": null, + "hexValue": "30", + "id": 2597, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "3156:1:9", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "3142:16:9", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "components": [ + { + "argumentTypes": null, + "id": 2599, + "name": "rewardToken", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2389, + "src": "3162:11:9", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + } + ], + "id": 2600, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "3161:13:9", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + }, + "src": "3142:32:9", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + }, + "id": 2602, + "nodeType": "ExpressionStatement", + "src": "3142:32:9" + }, + { + "assignments": [ + 2607 + ], + "declarations": [ + { + "constant": false, + "id": 2607, + "mutability": "mutable", + "name": "_rewardAmounts", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2627, + "src": "3184:31:9", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr", + "typeString": "uint256[]" + }, + "typeName": { + "baseType": { + "id": 2605, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3184:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 2606, + "length": null, + "nodeType": "ArrayTypeName", + "src": "3184:9:9", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr", + "typeString": "uint256[]" + } + }, + "value": null, + "visibility": "internal" + } + ], + "id": 2613, + "initialValue": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "hexValue": "31", + "id": 2611, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "3232:1:9", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + }, + "value": "1" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_rational_1_by_1", + "typeString": "int_const 1" + } + ], + "id": 2610, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "NewExpression", + "src": "3218:13:9", + "typeDescriptions": { + "typeIdentifier": "t_function_objectcreation_pure$_t_uint256_$returns$_t_array$_t_uint256_$dyn_memory_ptr_$", + "typeString": "function (uint256) pure returns (uint256[] memory)" + }, + "typeName": { + "baseType": { + "id": 2608, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3222:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 2609, + "length": null, + "nodeType": "ArrayTypeName", + "src": "3222:9:9", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr", + "typeString": "uint256[]" + } + } + }, + "id": 2612, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "3218:16:9", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr", + "typeString": "uint256[] memory" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "3184:50:9" + }, + { + "expression": { + "argumentTypes": null, + "id": 2621, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 2614, + "name": "_rewardAmounts", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2607, + "src": "3244:14:9", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr", + "typeString": "uint256[] memory" + } + }, + "id": 2616, + "indexExpression": { + "argumentTypes": null, + "hexValue": "30", + "id": 2615, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "3259:1:9", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "3244:17:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 2618, + "name": "pid", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2572, + "src": "3277:3:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "argumentTypes": null, + "id": 2619, + "name": "user", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2574, + "src": "3282:4:9", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 2617, + "name": "pendingToken", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2850, + "src": "3264:12:9", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_view$_t_uint256_$_t_address_$returns$_t_uint256_$", + "typeString": "function (uint256,address) view returns (uint256)" + } + }, + "id": 2620, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "3264:23:9", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "3244:43:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 2622, + "nodeType": "ExpressionStatement", + "src": "3244:43:9" + }, + { + "expression": { + "argumentTypes": null, + "components": [ + { + "argumentTypes": null, + "id": 2623, + "name": "_rewardTokens", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2589, + "src": "3305:13:9", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_contract$_IERC20_$337_$dyn_memory_ptr", + "typeString": "contract IERC20[] memory" + } + }, + { + "argumentTypes": null, + "id": 2624, + "name": "_rewardAmounts", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2607, + "src": "3320:14:9", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr", + "typeString": "uint256[] memory" + } + } + ], + "id": 2625, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "3304:31:9", + "typeDescriptions": { + "typeIdentifier": "t_tuple$_t_array$_t_contract$_IERC20_$337_$dyn_memory_ptr_$_t_array$_t_uint256_$dyn_memory_ptr_$", + "typeString": "tuple(contract IERC20[] memory,uint256[] memory)" + } + }, + "functionReturnParameters": 2585, + "id": 2626, + "nodeType": "Return", + "src": "3297:38:9" + } + ] + }, + "documentation": null, + "functionSelector": "d63b3c49", + "id": 2628, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "pendingTokens", + "nodeType": "FunctionDefinition", + "overrides": { + "id": 2578, + "nodeType": "OverrideSpecifier", + "overrides": [], + "src": "2986:8:9" + }, + "parameters": { + "id": 2577, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2572, + "mutability": "mutable", + "name": "pid", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2628, + "src": "2950:11:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2571, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2950:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 2574, + "mutability": "mutable", + "name": "user", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2628, + "src": "2963:12:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2573, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "2963:7:9", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 2576, + "mutability": "mutable", + "name": "", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2628, + "src": "2977:7:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2575, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "2977:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "2949:36:9" + }, + "returnParameters": { + "id": 2585, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2581, + "mutability": "mutable", + "name": "rewardTokens", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2628, + "src": "3013:28:9", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_contract$_IERC20_$337_$dyn_memory_ptr", + "typeString": "contract IERC20[]" + }, + "typeName": { + "baseType": { + "contractScope": null, + "id": 2579, + "name": "IERC20", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 337, + "src": "3013:6:9", + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + }, + "id": 2580, + "length": null, + "nodeType": "ArrayTypeName", + "src": "3013:8:9", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_contract$_IERC20_$337_$dyn_storage_ptr", + "typeString": "contract IERC20[]" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 2584, + "mutability": "mutable", + "name": "rewardAmounts", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2628, + "src": "3043:30:9", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_uint256_$dyn_memory_ptr", + "typeString": "uint256[]" + }, + "typeName": { + "baseType": { + "id": 2582, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3043:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 2583, + "length": null, + "nodeType": "ArrayTypeName", + "src": "3043:9:9", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr", + "typeString": "uint256[]" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "3012:62:9" + }, + "scope": 2985, + "src": "2927:415:9", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "body": { + "id": 2639, + "nodeType": "Block", + "src": "3366:135:9", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 2634, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 2631, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -15, + "src": "3397:3:9", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 2632, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sender", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3397:10:9", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "id": 2633, + "name": "MASTERCHEF_V2", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2426, + "src": "3411:13:9", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "3397:27:9", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "argumentTypes": null, + "hexValue": "4f6e6c79204d4356322063616e2063616c6c20746869732066756e6374696f6e2e", + "id": 2635, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "3438:35:9", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_3119d70f54e65f7fc05dc3fff78f1ae1d0c82eaf50b477c40260718556fca1cd", + "typeString": "literal_string \"Only MCV2 can call this function.\"" + }, + "value": "Only MCV2 can call this function." + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_stringliteral_3119d70f54e65f7fc05dc3fff78f1ae1d0c82eaf50b477c40260718556fca1cd", + "typeString": "literal_string \"Only MCV2 can call this function.\"" + } + ], + "id": 2630, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [ + -18, + -18 + ], + "referencedDeclaration": -18, + "src": "3376:7:9", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", + "typeString": "function (bool,string memory) pure" + } + }, + "id": 2636, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "3376:107:9", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 2637, + "nodeType": "ExpressionStatement", + "src": "3376:107:9" + }, + { + "id": 2638, + "nodeType": "PlaceholderStatement", + "src": "3493:1:9" + } + ] + }, + "documentation": null, + "id": 2640, + "name": "onlyMCV2", + "nodeType": "ModifierDefinition", + "overrides": null, + "parameters": { + "id": 2629, + "nodeType": "ParameterList", + "parameters": [], + "src": "3366:0:9" + }, + "src": "3348:153:9", + "virtual": false, + "visibility": "internal" + }, + { + "body": { + "id": 2651, + "nodeType": "Block", + "src": "3615:39:9", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 2649, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 2646, + "name": "pools", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2644, + "src": "3625:5:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 2647, + "name": "poolIds", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2409, + "src": "3633:7:9", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_uint256_$dyn_storage", + "typeString": "uint256[] storage ref" + } + }, + "id": 2648, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "length", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "3633:14:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "3625:22:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 2650, + "nodeType": "ExpressionStatement", + "src": "3625:22:9" + } + ] + }, + "documentation": { + "id": 2641, + "nodeType": "StructuredDocumentation", + "src": "3507:45:9", + "text": "@notice Returns the number of MCV2 pools." + }, + "functionSelector": "081e3eda", + "id": 2652, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "poolLength", + "nodeType": "FunctionDefinition", + "overrides": null, + "parameters": { + "id": 2642, + "nodeType": "ParameterList", + "parameters": [], + "src": "3576:2:9" + }, + "returnParameters": { + "id": 2645, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2644, + "mutability": "mutable", + "name": "pools", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2652, + "src": "3600:13:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2643, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3600:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "3599:15:9" + }, + "scope": 2985, + "src": "3557:97:9", + "stateMutability": "view", + "virtual": false, + "visibility": "public" + }, + { + "body": { + "id": 2709, + "nodeType": "Block", + "src": "3967:444:9", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + "id": 2668, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 2663, + "name": "poolInfo", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2406, + "src": "3985:8:9", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_uint256_$_t_struct$_PoolInfo_$2401_storage_$", + "typeString": "mapping(uint256 => struct ComplexRewarder.PoolInfo storage ref)" + } + }, + "id": 2665, + "indexExpression": { + "argumentTypes": null, + "id": 2664, + "name": "_pid", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2657, + "src": "3994:4:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "3985:14:9", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$2401_storage", + "typeString": "struct ComplexRewarder.PoolInfo storage ref" + } + }, + "id": 2666, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberName": "lastRewardBlock", + "nodeType": "MemberAccess", + "referencedDeclaration": 2398, + "src": "3985:30:9", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "argumentTypes": null, + "hexValue": "30", + "id": 2667, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "4019:1:9", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "3985:35:9", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "argumentTypes": null, + "hexValue": "506f6f6c20616c726561647920657869737473", + "id": 2669, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "4022:21:9", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_12db6f275306e49a55f39c487439bf20013b2e7f9ac363f83c1b47cbc0b35b95", + "typeString": "literal_string \"Pool already exists\"" + }, + "value": "Pool already exists" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_stringliteral_12db6f275306e49a55f39c487439bf20013b2e7f9ac363f83c1b47cbc0b35b95", + "typeString": "literal_string \"Pool already exists\"" + } + ], + "id": 2662, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [ + -18, + -18 + ], + "referencedDeclaration": -18, + "src": "3977:7:9", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", + "typeString": "function (bool,string memory) pure" + } + }, + "id": 2670, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "3977:67:9", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 2671, + "nodeType": "ExpressionStatement", + "src": "3977:67:9" + }, + { + "assignments": [ + 2673 + ], + "declarations": [ + { + "constant": false, + "id": 2673, + "mutability": "mutable", + "name": "lastRewardBlock", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2709, + "src": "4054:23:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2672, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4054:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "id": 2676, + "initialValue": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 2674, + "name": "block", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -4, + "src": "4080:5:9", + "typeDescriptions": { + "typeIdentifier": "t_magic_block", + "typeString": "block" + } + }, + "id": 2675, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "number", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "4080:12:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "4054:38:9" + }, + { + "expression": { + "argumentTypes": null, + "id": 2682, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 2677, + "name": "totalAllocPoint", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2419, + "src": "4102:15:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 2680, + "name": "allocPoint", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2655, + "src": "4140:10:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "id": 2678, + "name": "totalAllocPoint", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2419, + "src": "4120:15:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 2679, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "add", + "nodeType": "MemberAccess", + "referencedDeclaration": 577, + "src": "4120:19:9", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 2681, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "4120:31:9", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "4102:49:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 2683, + "nodeType": "ExpressionStatement", + "src": "4102:49:9" + }, + { + "expression": { + "argumentTypes": null, + "id": 2696, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 2684, + "name": "poolInfo", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2406, + "src": "4162:8:9", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_uint256_$_t_struct$_PoolInfo_$2401_storage_$", + "typeString": "mapping(uint256 => struct ComplexRewarder.PoolInfo storage ref)" + } + }, + "id": 2686, + "indexExpression": { + "argumentTypes": null, + "id": 2685, + "name": "_pid", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2657, + "src": "4171:4:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "4162:14:9", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$2401_storage", + "typeString": "struct ComplexRewarder.PoolInfo storage ref" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "arguments": [], + "expression": { + "argumentTypes": [], + "expression": { + "argumentTypes": null, + "id": 2688, + "name": "allocPoint", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2655, + "src": "4214:10:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 2689, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "to64", + "nodeType": "MemberAccess", + "referencedDeclaration": 679, + "src": "4214:15:9", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint64_$bound_to$_t_uint256_$", + "typeString": "function (uint256) pure returns (uint64)" + } + }, + "id": 2690, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "4214:17:9", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + { + "argumentTypes": null, + "arguments": [], + "expression": { + "argumentTypes": [], + "expression": { + "argumentTypes": null, + "id": 2691, + "name": "lastRewardBlock", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2673, + "src": "4262:15:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 2692, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "to64", + "nodeType": "MemberAccess", + "referencedDeclaration": 679, + "src": "4262:20:9", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint64_$bound_to$_t_uint256_$", + "typeString": "function (uint256) pure returns (uint64)" + } + }, + "id": 2693, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "4262:22:9", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + { + "argumentTypes": null, + "hexValue": "30", + "id": 2694, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "4316:1:9", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + } + ], + "id": 2687, + "name": "PoolInfo", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2401, + "src": "4179:8:9", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_struct$_PoolInfo_$2401_storage_ptr_$", + "typeString": "type(struct ComplexRewarder.PoolInfo storage pointer)" + } + }, + "id": 2695, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "structConstructorCall", + "lValueRequested": false, + "names": [ + "allocPoint", + "lastRewardBlock", + "accSushiPerShare" + ], + "nodeType": "FunctionCall", + "src": "4179:149:9", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$2401_memory_ptr", + "typeString": "struct ComplexRewarder.PoolInfo memory" + } + }, + "src": "4162:166:9", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$2401_storage", + "typeString": "struct ComplexRewarder.PoolInfo storage ref" + } + }, + "id": 2697, + "nodeType": "ExpressionStatement", + "src": "4162:166:9" + }, + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 2701, + "name": "_pid", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2657, + "src": "4351:4:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "id": 2698, + "name": "poolIds", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2409, + "src": "4338:7:9", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_uint256_$dyn_storage", + "typeString": "uint256[] storage ref" + } + }, + "id": 2700, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "push", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "4338:12:9", + "typeDescriptions": { + "typeIdentifier": "t_function_arraypush_nonpayable$_t_uint256_$returns$__$", + "typeString": "function (uint256)" + } + }, + "id": 2702, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "4338:18:9", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 2703, + "nodeType": "ExpressionStatement", + "src": "4338:18:9" + }, + { + "eventCall": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 2705, + "name": "_pid", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2657, + "src": "4387:4:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "argumentTypes": null, + "id": 2706, + "name": "allocPoint", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2655, + "src": "4393:10:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 2704, + "name": "LogPoolAddition", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2442, + "src": "4371:15:9", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_uint256_$_t_uint256_$returns$__$", + "typeString": "function (uint256,uint256)" + } + }, + "id": 2707, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "4371:33:9", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 2708, + "nodeType": "EmitStatement", + "src": "4366:38:9" + } + ] + }, + "documentation": { + "id": 2653, + "nodeType": "StructuredDocumentation", + "src": "3660:238:9", + "text": "@notice Add a new LP to the pool. Can only be called by the owner.\n DO NOT add the same LP token more than once. Rewards will be messed up if you do.\n @param allocPoint AP of the new pool.\n @param _pid Pid on MCV2" + }, + "functionSelector": "771602f7", + "id": 2710, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "arguments": null, + "id": 2660, + "modifierName": { + "argumentTypes": null, + "id": 2659, + "name": "onlyOwner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 270, + "src": "3957:9:9", + "typeDescriptions": { + "typeIdentifier": "t_modifier$__$", + "typeString": "modifier ()" + } + }, + "nodeType": "ModifierInvocation", + "src": "3957:9:9" + } + ], + "name": "add", + "nodeType": "FunctionDefinition", + "overrides": null, + "parameters": { + "id": 2658, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2655, + "mutability": "mutable", + "name": "allocPoint", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2710, + "src": "3916:18:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2654, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3916:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 2657, + "mutability": "mutable", + "name": "_pid", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2710, + "src": "3936:12:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2656, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "3936:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "3915:34:9" + }, + "returnParameters": { + "id": 2661, + "nodeType": "ParameterList", + "parameters": [], + "src": "3967:0:9" + }, + "scope": 2985, + "src": "3903:508:9", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "public" + }, + { + "body": { + "id": 2747, + "nodeType": "Block", + "src": "4710:198:9", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 2731, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 2720, + "name": "totalAllocPoint", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2419, + "src": "4720:15:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 2729, + "name": "_allocPoint", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2715, + "src": "4789:11:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 2723, + "name": "poolInfo", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2406, + "src": "4758:8:9", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_uint256_$_t_struct$_PoolInfo_$2401_storage_$", + "typeString": "mapping(uint256 => struct ComplexRewarder.PoolInfo storage ref)" + } + }, + "id": 2725, + "indexExpression": { + "argumentTypes": null, + "id": 2724, + "name": "_pid", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2713, + "src": "4767:4:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "4758:14:9", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$2401_storage", + "typeString": "struct ComplexRewarder.PoolInfo storage ref" + } + }, + "id": 2726, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberName": "allocPoint", + "nodeType": "MemberAccess", + "referencedDeclaration": 2400, + "src": "4758:25:9", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + ], + "expression": { + "argumentTypes": null, + "id": 2721, + "name": "totalAllocPoint", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2419, + "src": "4738:15:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 2722, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sub", + "nodeType": "MemberAccess", + "referencedDeclaration": 599, + "src": "4738:19:9", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 2727, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "4738:46:9", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 2728, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "add", + "nodeType": "MemberAccess", + "referencedDeclaration": 577, + "src": "4738:50:9", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 2730, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "4738:63:9", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "4720:81:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 2732, + "nodeType": "ExpressionStatement", + "src": "4720:81:9" + }, + { + "expression": { + "argumentTypes": null, + "id": 2740, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 2733, + "name": "poolInfo", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2406, + "src": "4811:8:9", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_uint256_$_t_struct$_PoolInfo_$2401_storage_$", + "typeString": "mapping(uint256 => struct ComplexRewarder.PoolInfo storage ref)" + } + }, + "id": 2735, + "indexExpression": { + "argumentTypes": null, + "id": 2734, + "name": "_pid", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2713, + "src": "4820:4:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "4811:14:9", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$2401_storage", + "typeString": "struct ComplexRewarder.PoolInfo storage ref" + } + }, + "id": 2736, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "memberName": "allocPoint", + "nodeType": "MemberAccess", + "referencedDeclaration": 2400, + "src": "4811:25:9", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "arguments": [], + "expression": { + "argumentTypes": [], + "expression": { + "argumentTypes": null, + "id": 2737, + "name": "_allocPoint", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2715, + "src": "4839:11:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 2738, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "to64", + "nodeType": "MemberAccess", + "referencedDeclaration": 679, + "src": "4839:16:9", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint64_$bound_to$_t_uint256_$", + "typeString": "function (uint256) pure returns (uint64)" + } + }, + "id": 2739, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "4839:18:9", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "src": "4811:46:9", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "id": 2741, + "nodeType": "ExpressionStatement", + "src": "4811:46:9" + }, + { + "eventCall": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 2743, + "name": "_pid", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2713, + "src": "4883:4:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "argumentTypes": null, + "id": 2744, + "name": "_allocPoint", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2715, + "src": "4889:11:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 2742, + "name": "LogSetPool", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2448, + "src": "4872:10:9", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_uint256_$_t_uint256_$returns$__$", + "typeString": "function (uint256,uint256)" + } + }, + "id": 2745, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "4872:29:9", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 2746, + "nodeType": "EmitStatement", + "src": "4867:34:9" + } + ] + }, + "documentation": { + "id": 2711, + "nodeType": "StructuredDocumentation", + "src": "4417:223:9", + "text": "@notice Update the given pool's SUSHI allocation point and `IRewarder` contract. Can only be called by the owner.\n @param _pid The index of the pool. See `poolInfo`.\n @param _allocPoint New AP of the pool." + }, + "functionSelector": "1ab06ee5", + "id": 2748, + "implemented": true, + "kind": "function", + "modifiers": [ + { + "arguments": null, + "id": 2718, + "modifierName": { + "argumentTypes": null, + "id": 2717, + "name": "onlyOwner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 270, + "src": "4700:9:9", + "typeDescriptions": { + "typeIdentifier": "t_modifier$__$", + "typeString": "modifier ()" + } + }, + "nodeType": "ModifierInvocation", + "src": "4700:9:9" + } + ], + "name": "set", + "nodeType": "FunctionDefinition", + "overrides": null, + "parameters": { + "id": 2716, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2713, + "mutability": "mutable", + "name": "_pid", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2748, + "src": "4658:12:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2712, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4658:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 2715, + "mutability": "mutable", + "name": "_allocPoint", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2748, + "src": "4672:19:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2714, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "4672:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "4657:35:9" + }, + "returnParameters": { + "id": 2719, + "nodeType": "ParameterList", + "parameters": [], + "src": "4710:0:9" + }, + "scope": 2985, + "src": "4645:263:9", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "public" + }, + { + "body": { + "id": 2849, + "nodeType": "Block", + "src": "5206:709:9", + "statements": [ + { + "assignments": [ + 2759 + ], + "declarations": [ + { + "constant": false, + "id": 2759, + "mutability": "mutable", + "name": "pool", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2849, + "src": "5216:20:9", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$2401_memory_ptr", + "typeString": "struct ComplexRewarder.PoolInfo" + }, + "typeName": { + "contractScope": null, + "id": 2758, + "name": "PoolInfo", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 2401, + "src": "5216:8:9", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$2401_storage_ptr", + "typeString": "struct ComplexRewarder.PoolInfo" + } + }, + "value": null, + "visibility": "internal" + } + ], + "id": 2763, + "initialValue": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 2760, + "name": "poolInfo", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2406, + "src": "5239:8:9", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_uint256_$_t_struct$_PoolInfo_$2401_storage_$", + "typeString": "mapping(uint256 => struct ComplexRewarder.PoolInfo storage ref)" + } + }, + "id": 2762, + "indexExpression": { + "argumentTypes": null, + "id": 2761, + "name": "_pid", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2751, + "src": "5248:4:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "5239:14:9", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$2401_storage", + "typeString": "struct ComplexRewarder.PoolInfo storage ref" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "5216:37:9" + }, + { + "assignments": [ + 2765 + ], + "declarations": [ + { + "constant": false, + "id": 2765, + "mutability": "mutable", + "name": "user", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2849, + "src": "5263:21:9", + "stateVariable": false, + "storageLocation": "storage", + "typeDescriptions": { + "typeIdentifier": "t_struct$_UserInfo_$2394_storage_ptr", + "typeString": "struct ComplexRewarder.UserInfo" + }, + "typeName": { + "contractScope": null, + "id": 2764, + "name": "UserInfo", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 2394, + "src": "5263:8:9", + "typeDescriptions": { + "typeIdentifier": "t_struct$_UserInfo_$2394_storage_ptr", + "typeString": "struct ComplexRewarder.UserInfo" + } + }, + "value": null, + "visibility": "internal" + } + ], + "id": 2771, + "initialValue": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 2766, + "name": "userInfo", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2416, + "src": "5287:8:9", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_uint256_$_t_mapping$_t_address_$_t_struct$_UserInfo_$2394_storage_$_$", + "typeString": "mapping(uint256 => mapping(address => struct ComplexRewarder.UserInfo storage ref))" + } + }, + "id": 2768, + "indexExpression": { + "argumentTypes": null, + "id": 2767, + "name": "_pid", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2751, + "src": "5296:4:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "5287:14:9", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_address_$_t_struct$_UserInfo_$2394_storage_$", + "typeString": "mapping(address => struct ComplexRewarder.UserInfo storage ref)" + } + }, + "id": 2770, + "indexExpression": { + "argumentTypes": null, + "id": 2769, + "name": "_user", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2753, + "src": "5302:5:9", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "5287:21:9", + "typeDescriptions": { + "typeIdentifier": "t_struct$_UserInfo_$2394_storage", + "typeString": "struct ComplexRewarder.UserInfo storage ref" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "5263:45:9" + }, + { + "assignments": [ + 2773 + ], + "declarations": [ + { + "constant": false, + "id": 2773, + "mutability": "mutable", + "name": "accSushiPerShare", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2849, + "src": "5318:24:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2772, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "5318:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "id": 2776, + "initialValue": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 2774, + "name": "pool", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2759, + "src": "5345:4:9", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$2401_memory_ptr", + "typeString": "struct ComplexRewarder.PoolInfo memory" + } + }, + "id": 2775, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberName": "accSushiPerShare", + "nodeType": "MemberAccess", + "referencedDeclaration": 2396, + "src": "5345:21:9", + "typeDescriptions": { + "typeIdentifier": "t_uint128", + "typeString": "uint128" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "5318:48:9" + }, + { + "assignments": [ + 2778 + ], + "declarations": [ + { + "constant": false, + "id": 2778, + "mutability": "mutable", + "name": "lpSupply", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2849, + "src": "5376:16:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2777, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "5376:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "id": 2788, + "initialValue": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 2786, + "name": "MASTERCHEF_V2", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2426, + "src": "5447:13:9", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 2783, + "name": "_pid", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2751, + "src": "5431:4:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 2780, + "name": "MASTERCHEF_V2", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2426, + "src": "5408:13:9", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 2779, + "name": "MasterChefV2", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2091, + "src": "5395:12:9", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_MasterChefV2_$2091_$", + "typeString": "type(contract MasterChefV2)" + } + }, + "id": 2781, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "5395:27:9", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_MasterChefV2_$2091", + "typeString": "contract MasterChefV2" + } + }, + "id": 2782, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "lpToken", + "nodeType": "MemberAccess", + "referencedDeclaration": 906, + "src": "5395:35:9", + "typeDescriptions": { + "typeIdentifier": "t_function_external_view$_t_uint256_$returns$_t_contract$_IERC20_$337_$", + "typeString": "function (uint256) view external returns (contract IERC20)" + } + }, + "id": 2784, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "5395:41:9", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + }, + "id": 2785, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "balanceOf", + "nodeType": "MemberAccess", + "referencedDeclaration": 285, + "src": "5395:51:9", + "typeDescriptions": { + "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$", + "typeString": "function (address) view external returns (uint256)" + } + }, + "id": 2787, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "5395:66:9", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "5376:85:9" + }, + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + "id": 2797, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 2793, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 2789, + "name": "block", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -4, + "src": "5475:5:9", + "typeDescriptions": { + "typeIdentifier": "t_magic_block", + "typeString": "block" + } + }, + "id": 2790, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "number", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "5475:12:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 2791, + "name": "pool", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2759, + "src": "5490:4:9", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$2401_memory_ptr", + "typeString": "struct ComplexRewarder.PoolInfo memory" + } + }, + "id": 2792, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberName": "lastRewardBlock", + "nodeType": "MemberAccess", + "referencedDeclaration": 2398, + "src": "5490:20:9", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "src": "5475:35:9", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "nodeType": "BinaryOperation", + "operator": "&&", + "rightExpression": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 2796, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 2794, + "name": "lpSupply", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2778, + "src": "5514:8:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "!=", + "rightExpression": { + "argumentTypes": null, + "hexValue": "30", + "id": 2795, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "5526:1:9", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "5514:13:9", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "src": "5475:52:9", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 2833, + "nodeType": "IfStatement", + "src": "5471:340:9", + "trueBody": { + "id": 2832, + "nodeType": "Block", + "src": "5529:282:9", + "statements": [ + { + "assignments": [ + 2799 + ], + "declarations": [ + { + "constant": false, + "id": 2799, + "mutability": "mutable", + "name": "blocks", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2832, + "src": "5543:14:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2798, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "5543:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "id": 2806, + "initialValue": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 2803, + "name": "pool", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2759, + "src": "5577:4:9", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$2401_memory_ptr", + "typeString": "struct ComplexRewarder.PoolInfo memory" + } + }, + "id": 2804, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberName": "lastRewardBlock", + "nodeType": "MemberAccess", + "referencedDeclaration": 2398, + "src": "5577:20:9", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + ], + "expression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 2800, + "name": "block", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -4, + "src": "5560:5:9", + "typeDescriptions": { + "typeIdentifier": "t_magic_block", + "typeString": "block" + } + }, + "id": 2801, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "number", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "5560:12:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 2802, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sub", + "nodeType": "MemberAccess", + "referencedDeclaration": 599, + "src": "5560:16:9", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 2805, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "5560:38:9", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "5543:55:9" + }, + { + "assignments": [ + 2808 + ], + "declarations": [ + { + "constant": false, + "id": 2808, + "mutability": "mutable", + "name": "sushiReward", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2832, + "src": "5612:19:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2807, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "5612:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "id": 2819, + "initialValue": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 2818, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 2814, + "name": "pool", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2759, + "src": "5664:4:9", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$2401_memory_ptr", + "typeString": "struct ComplexRewarder.PoolInfo memory" + } + }, + "id": 2815, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberName": "allocPoint", + "nodeType": "MemberAccess", + "referencedDeclaration": 2400, + "src": "5664:15:9", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + ], + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 2811, + "name": "tokenPerBlock", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2421, + "src": "5645:13:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "id": 2809, + "name": "blocks", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2799, + "src": "5634:6:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 2810, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "mul", + "nodeType": "MemberAccess", + "referencedDeclaration": 627, + "src": "5634:10:9", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 2812, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "5634:25:9", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 2813, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "mul", + "nodeType": "MemberAccess", + "referencedDeclaration": 627, + "src": "5634:29:9", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 2816, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "5634:46:9", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "/", + "rightExpression": { + "argumentTypes": null, + "id": 2817, + "name": "totalAllocPoint", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2419, + "src": "5683:15:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "5634:64:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "5612:86:9" + }, + { + "expression": { + "argumentTypes": null, + "id": 2830, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 2820, + "name": "accSushiPerShare", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2773, + "src": "5712:16:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 2828, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 2825, + "name": "ACC_TOKEN_PRECISION", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2424, + "src": "5768:19:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "id": 2823, + "name": "sushiReward", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2808, + "src": "5752:11:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 2824, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "mul", + "nodeType": "MemberAccess", + "referencedDeclaration": 627, + "src": "5752:15:9", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 2826, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "5752:36:9", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "/", + "rightExpression": { + "argumentTypes": null, + "id": 2827, + "name": "lpSupply", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2778, + "src": "5791:8:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "5752:47:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "id": 2821, + "name": "accSushiPerShare", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2773, + "src": "5731:16:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 2822, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "add", + "nodeType": "MemberAccess", + "referencedDeclaration": 577, + "src": "5731:20:9", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 2829, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "5731:69:9", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "5712:88:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 2831, + "nodeType": "ExpressionStatement", + "src": "5712:88:9" + } + ] + } + }, + { + "expression": { + "argumentTypes": null, + "id": 2847, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 2834, + "name": "pending", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2756, + "src": "5820:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 2844, + "name": "user", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2765, + "src": "5892:4:9", + "typeDescriptions": { + "typeIdentifier": "t_struct$_UserInfo_$2394_storage_ptr", + "typeString": "struct ComplexRewarder.UserInfo storage pointer" + } + }, + "id": 2845, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberName": "rewardDebt", + "nodeType": "MemberAccess", + "referencedDeclaration": 2393, + "src": "5892:15:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "components": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 2841, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 2838, + "name": "accSushiPerShare", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2773, + "src": "5847:16:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 2835, + "name": "user", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2765, + "src": "5831:4:9", + "typeDescriptions": { + "typeIdentifier": "t_struct$_UserInfo_$2394_storage_ptr", + "typeString": "struct ComplexRewarder.UserInfo storage pointer" + } + }, + "id": 2836, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberName": "amount", + "nodeType": "MemberAccess", + "referencedDeclaration": 2391, + "src": "5831:11:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 2837, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "mul", + "nodeType": "MemberAccess", + "referencedDeclaration": 627, + "src": "5831:15:9", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 2839, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "5831:33:9", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "/", + "rightExpression": { + "argumentTypes": null, + "id": 2840, + "name": "ACC_TOKEN_PRECISION", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2424, + "src": "5867:19:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "5831:55:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 2842, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "5830:57:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 2843, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sub", + "nodeType": "MemberAccess", + "referencedDeclaration": 599, + "src": "5830:61:9", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 2846, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "5830:78:9", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "5820:88:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 2848, + "nodeType": "ExpressionStatement", + "src": "5820:88:9" + } + ] + }, + "documentation": { + "id": 2749, + "nodeType": "StructuredDocumentation", + "src": "4914:198:9", + "text": "@notice View function to see pending Token\n @param _pid The index of the pool. See `poolInfo`.\n @param _user Address of user.\n @return pending SUSHI reward for a given user." + }, + "functionSelector": "48e43af4", + "id": 2850, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "pendingToken", + "nodeType": "FunctionDefinition", + "overrides": null, + "parameters": { + "id": 2754, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2751, + "mutability": "mutable", + "name": "_pid", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2850, + "src": "5139:12:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2750, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "5139:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + }, + { + "constant": false, + "id": 2753, + "mutability": "mutable", + "name": "_user", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2850, + "src": "5153:13:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 2752, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "5153:7:9", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "5138:29:9" + }, + "returnParameters": { + "id": 2757, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2756, + "mutability": "mutable", + "name": "pending", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2850, + "src": "5189:15:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2755, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "5189:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "5188:17:9" + }, + "scope": 2985, + "src": "5117:798:9", + "stateMutability": "view", + "virtual": false, + "visibility": "public" + }, + { + "body": { + "id": 2880, + "nodeType": "Block", + "src": "6152:129:9", + "statements": [ + { + "assignments": [ + 2858 + ], + "declarations": [ + { + "constant": false, + "id": 2858, + "mutability": "mutable", + "name": "len", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2880, + "src": "6162:11:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2857, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "6162:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "id": 2861, + "initialValue": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 2859, + "name": "pids", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2854, + "src": "6176:4:9", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_uint256_$dyn_calldata_ptr", + "typeString": "uint256[] calldata" + } + }, + "id": 2860, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "length", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "6176:11:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "6162:25:9" + }, + { + "body": { + "id": 2878, + "nodeType": "Block", + "src": "6231:44:9", + "statements": [ + { + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 2873, + "name": "pids", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2854, + "src": "6256:4:9", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_uint256_$dyn_calldata_ptr", + "typeString": "uint256[] calldata" + } + }, + "id": 2875, + "indexExpression": { + "argumentTypes": null, + "id": 2874, + "name": "i", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2863, + "src": "6261:1:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "6256:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 2872, + "name": "updatePool", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2984, + "src": "6245:10:9", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$returns$_t_struct$_PoolInfo_$2401_memory_ptr_$", + "typeString": "function (uint256) returns (struct ComplexRewarder.PoolInfo memory)" + } + }, + "id": 2876, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "6245:19:9", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$2401_memory_ptr", + "typeString": "struct ComplexRewarder.PoolInfo memory" + } + }, + "id": 2877, + "nodeType": "ExpressionStatement", + "src": "6245:19:9" + } + ] + }, + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 2868, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 2866, + "name": "i", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2863, + "src": "6217:1:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<", + "rightExpression": { + "argumentTypes": null, + "id": 2867, + "name": "len", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2858, + "src": "6221:3:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "6217:7:9", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "id": 2879, + "initializationExpression": { + "assignments": [ + 2863 + ], + "declarations": [ + { + "constant": false, + "id": 2863, + "mutability": "mutable", + "name": "i", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2879, + "src": "6202:9:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2862, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "6202:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "id": 2865, + "initialValue": { + "argumentTypes": null, + "hexValue": "30", + "id": 2864, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "6214:1:9", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "nodeType": "VariableDeclarationStatement", + "src": "6202:13:9" + }, + "loopExpression": { + "expression": { + "argumentTypes": null, + "id": 2870, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "UnaryOperation", + "operator": "++", + "prefix": true, + "src": "6226:3:9", + "subExpression": { + "argumentTypes": null, + "id": 2869, + "name": "i", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2863, + "src": "6228:1:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 2871, + "nodeType": "ExpressionStatement", + "src": "6226:3:9" + }, + "nodeType": "ForStatement", + "src": "6197:78:9" + } + ] + }, + "documentation": { + "id": 2851, + "nodeType": "StructuredDocumentation", + "src": "5921:167:9", + "text": "@notice Update reward variables for all pools. Be careful of gas spending!\n @param pids Pool IDs of all to be updated. Make sure to update all active pools." + }, + "functionSelector": "57a5b58c", + "id": 2881, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "massUpdatePools", + "nodeType": "FunctionDefinition", + "overrides": null, + "parameters": { + "id": 2855, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2854, + "mutability": "mutable", + "name": "pids", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2881, + "src": "6118:23:9", + "stateVariable": false, + "storageLocation": "calldata", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_uint256_$dyn_calldata_ptr", + "typeString": "uint256[]" + }, + "typeName": { + "baseType": { + "id": 2852, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "6118:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 2853, + "length": null, + "nodeType": "ArrayTypeName", + "src": "6118:9:9", + "typeDescriptions": { + "typeIdentifier": "t_array$_t_uint256_$dyn_storage_ptr", + "typeString": "uint256[]" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "6117:25:9" + }, + "returnParameters": { + "id": 2856, + "nodeType": "ParameterList", + "parameters": [], + "src": "6152:0:9" + }, + "scope": 2985, + "src": "6093:188:9", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "external" + }, + { + "body": { + "id": 2983, + "nodeType": "Block", + "src": "6531:728:9", + "statements": [ + { + "expression": { + "argumentTypes": null, + "id": 2893, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "id": 2889, + "name": "pool", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2887, + "src": "6541:4:9", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$2401_memory_ptr", + "typeString": "struct ComplexRewarder.PoolInfo memory" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 2890, + "name": "poolInfo", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2406, + "src": "6548:8:9", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_uint256_$_t_struct$_PoolInfo_$2401_storage_$", + "typeString": "mapping(uint256 => struct ComplexRewarder.PoolInfo storage ref)" + } + }, + "id": 2892, + "indexExpression": { + "argumentTypes": null, + "id": 2891, + "name": "pid", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2884, + "src": "6557:3:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "nodeType": "IndexAccess", + "src": "6548:13:9", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$2401_storage", + "typeString": "struct ComplexRewarder.PoolInfo storage ref" + } + }, + "src": "6541:20:9", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$2401_memory_ptr", + "typeString": "struct ComplexRewarder.PoolInfo memory" + } + }, + "id": 2894, + "nodeType": "ExpressionStatement", + "src": "6541:20:9" + }, + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 2899, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 2895, + "name": "block", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -4, + "src": "6575:5:9", + "typeDescriptions": { + "typeIdentifier": "t_magic_block", + "typeString": "block" + } + }, + "id": 2896, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "number", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "6575:12:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 2897, + "name": "pool", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2887, + "src": "6590:4:9", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$2401_memory_ptr", + "typeString": "struct ComplexRewarder.PoolInfo memory" + } + }, + "id": 2898, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberName": "lastRewardBlock", + "nodeType": "MemberAccess", + "referencedDeclaration": 2398, + "src": "6590:20:9", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "src": "6575:35:9", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 2982, + "nodeType": "IfStatement", + "src": "6571:682:9", + "trueBody": { + "id": 2981, + "nodeType": "Block", + "src": "6612:641:9", + "statements": [ + { + "assignments": [ + 2901 + ], + "declarations": [ + { + "constant": false, + "id": 2901, + "mutability": "mutable", + "name": "lpSupply", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2981, + "src": "6626:16:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2900, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "6626:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "id": 2911, + "initialValue": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 2909, + "name": "MASTERCHEF_V2", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2426, + "src": "6696:13:9", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 2906, + "name": "pid", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2884, + "src": "6681:3:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 2903, + "name": "MASTERCHEF_V2", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2426, + "src": "6658:13:9", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 2902, + "name": "MasterChefV2", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2091, + "src": "6645:12:9", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_MasterChefV2_$2091_$", + "typeString": "type(contract MasterChefV2)" + } + }, + "id": 2904, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "6645:27:9", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_MasterChefV2_$2091", + "typeString": "contract MasterChefV2" + } + }, + "id": 2905, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "lpToken", + "nodeType": "MemberAccess", + "referencedDeclaration": 906, + "src": "6645:35:9", + "typeDescriptions": { + "typeIdentifier": "t_function_external_view$_t_uint256_$returns$_t_contract$_IERC20_$337_$", + "typeString": "function (uint256) view external returns (contract IERC20)" + } + }, + "id": 2907, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "6645:40:9", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_contract$_IERC20_$337", + "typeString": "contract IERC20" + } + }, + "id": 2908, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "balanceOf", + "nodeType": "MemberAccess", + "referencedDeclaration": 285, + "src": "6645:50:9", + "typeDescriptions": { + "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$", + "typeString": "function (address) view external returns (uint256)" + } + }, + "id": 2910, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "6645:65:9", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "6626:84:9" + }, + { + "condition": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 2914, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "id": 2912, + "name": "lpSupply", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2901, + "src": "6729:8:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">", + "rightExpression": { + "argumentTypes": null, + "hexValue": "30", + "id": 2913, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "6740:1:9", + "subdenomination": null, + "typeDescriptions": { + "typeIdentifier": "t_rational_0_by_1", + "typeString": "int_const 0" + }, + "value": "0" + }, + "src": "6729:12:9", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + "falseBody": null, + "id": 2956, + "nodeType": "IfStatement", + "src": "6725:336:9", + "trueBody": { + "id": 2955, + "nodeType": "Block", + "src": "6743:318:9", + "statements": [ + { + "assignments": [ + 2916 + ], + "declarations": [ + { + "constant": false, + "id": 2916, + "mutability": "mutable", + "name": "blocks", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2955, + "src": "6761:14:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2915, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "6761:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "id": 2923, + "initialValue": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 2920, + "name": "pool", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2887, + "src": "6795:4:9", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$2401_memory_ptr", + "typeString": "struct ComplexRewarder.PoolInfo memory" + } + }, + "id": 2921, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberName": "lastRewardBlock", + "nodeType": "MemberAccess", + "referencedDeclaration": 2398, + "src": "6795:20:9", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + ], + "expression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 2917, + "name": "block", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -4, + "src": "6778:5:9", + "typeDescriptions": { + "typeIdentifier": "t_magic_block", + "typeString": "block" + } + }, + "id": 2918, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "number", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "6778:12:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 2919, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "sub", + "nodeType": "MemberAccess", + "referencedDeclaration": 599, + "src": "6778:16:9", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 2922, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "6778:38:9", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "6761:55:9" + }, + { + "assignments": [ + 2925 + ], + "declarations": [ + { + "constant": false, + "id": 2925, + "mutability": "mutable", + "name": "sushiReward", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2955, + "src": "6834:19:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2924, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "6834:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "id": 2936, + "initialValue": { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 2935, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 2931, + "name": "pool", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2887, + "src": "6886:4:9", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$2401_memory_ptr", + "typeString": "struct ComplexRewarder.PoolInfo memory" + } + }, + "id": 2932, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberName": "allocPoint", + "nodeType": "MemberAccess", + "referencedDeclaration": 2400, + "src": "6886:15:9", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + ], + "expression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 2928, + "name": "tokenPerBlock", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2421, + "src": "6867:13:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "id": 2926, + "name": "blocks", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2916, + "src": "6856:6:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 2927, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "mul", + "nodeType": "MemberAccess", + "referencedDeclaration": 627, + "src": "6856:10:9", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 2929, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "6856:25:9", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 2930, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "mul", + "nodeType": "MemberAccess", + "referencedDeclaration": 627, + "src": "6856:29:9", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 2933, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "6856:46:9", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "/", + "rightExpression": { + "argumentTypes": null, + "id": 2934, + "name": "totalAllocPoint", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2419, + "src": "6905:15:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "6856:64:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "VariableDeclarationStatement", + "src": "6834:86:9" + }, + { + "expression": { + "argumentTypes": null, + "id": 2953, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 2937, + "name": "pool", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2887, + "src": "6938:4:9", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$2401_memory_ptr", + "typeString": "struct ComplexRewarder.PoolInfo memory" + } + }, + "id": 2939, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "memberName": "accSushiPerShare", + "nodeType": "MemberAccess", + "referencedDeclaration": 2396, + "src": "6938:21:9", + "typeDescriptions": { + "typeIdentifier": "t_uint128", + "typeString": "uint128" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "arguments": [], + "expression": { + "argumentTypes": [], + "expression": { + "argumentTypes": null, + "components": [ + { + "argumentTypes": null, + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 2948, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 2945, + "name": "ACC_TOKEN_PRECISION", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2424, + "src": "7005:19:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "argumentTypes": null, + "id": 2943, + "name": "sushiReward", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2925, + "src": "6989:11:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 2944, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "mul", + "nodeType": "MemberAccess", + "referencedDeclaration": 627, + "src": "6989:15:9", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 2946, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "6989:36:9", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "/", + "rightExpression": { + "argumentTypes": null, + "id": 2947, + "name": "lpSupply", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2901, + "src": "7028:8:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "6989:47:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "id": 2949, + "isConstant": false, + "isInlineArray": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "nodeType": "TupleExpression", + "src": "6988:49:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 2950, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "to128", + "nodeType": "MemberAccess", + "referencedDeclaration": 653, + "src": "6988:55:9", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint128_$bound_to$_t_uint256_$", + "typeString": "function (uint256) pure returns (uint128)" + } + }, + "id": 2951, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "6988:57:9", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint128", + "typeString": "uint128" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint128", + "typeString": "uint128" + } + ], + "expression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 2940, + "name": "pool", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2887, + "src": "6962:4:9", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$2401_memory_ptr", + "typeString": "struct ComplexRewarder.PoolInfo memory" + } + }, + "id": 2941, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberName": "accSushiPerShare", + "nodeType": "MemberAccess", + "referencedDeclaration": 2396, + "src": "6962:21:9", + "typeDescriptions": { + "typeIdentifier": "t_uint128", + "typeString": "uint128" + } + }, + "id": 2942, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "add", + "nodeType": "MemberAccess", + "referencedDeclaration": 728, + "src": "6962:25:9", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint128_$_t_uint128_$returns$_t_uint128_$bound_to$_t_uint128_$", + "typeString": "function (uint128,uint128) pure returns (uint128)" + } + }, + "id": 2952, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "6962:84:9", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint128", + "typeString": "uint128" + } + }, + "src": "6938:108:9", + "typeDescriptions": { + "typeIdentifier": "t_uint128", + "typeString": "uint128" + } + }, + "id": 2954, + "nodeType": "ExpressionStatement", + "src": "6938:108:9" + } + ] + } + }, + { + "expression": { + "argumentTypes": null, + "id": 2964, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 2957, + "name": "pool", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2887, + "src": "7074:4:9", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$2401_memory_ptr", + "typeString": "struct ComplexRewarder.PoolInfo memory" + } + }, + "id": 2959, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "memberName": "lastRewardBlock", + "nodeType": "MemberAccess", + "referencedDeclaration": 2398, + "src": "7074:20:9", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "arguments": [], + "expression": { + "argumentTypes": [], + "expression": { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 2960, + "name": "block", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -4, + "src": "7097:5:9", + "typeDescriptions": { + "typeIdentifier": "t_magic_block", + "typeString": "block" + } + }, + "id": 2961, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "number", + "nodeType": "MemberAccess", + "referencedDeclaration": null, + "src": "7097:12:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 2962, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberName": "to64", + "nodeType": "MemberAccess", + "referencedDeclaration": 679, + "src": "7097:17:9", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_uint64_$bound_to$_t_uint256_$", + "typeString": "function (uint256) pure returns (uint64)" + } + }, + "id": 2963, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "7097:19:9", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "src": "7074:42:9", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + "id": 2965, + "nodeType": "ExpressionStatement", + "src": "7074:42:9" + }, + { + "expression": { + "argumentTypes": null, + "id": 2970, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "argumentTypes": null, + "baseExpression": { + "argumentTypes": null, + "id": 2966, + "name": "poolInfo", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2406, + "src": "7130:8:9", + "typeDescriptions": { + "typeIdentifier": "t_mapping$_t_uint256_$_t_struct$_PoolInfo_$2401_storage_$", + "typeString": "mapping(uint256 => struct ComplexRewarder.PoolInfo storage ref)" + } + }, + "id": 2968, + "indexExpression": { + "argumentTypes": null, + "id": 2967, + "name": "pid", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2884, + "src": "7139:3:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": true, + "nodeType": "IndexAccess", + "src": "7130:13:9", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$2401_storage", + "typeString": "struct ComplexRewarder.PoolInfo storage ref" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "argumentTypes": null, + "id": 2969, + "name": "pool", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2887, + "src": "7146:4:9", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$2401_memory_ptr", + "typeString": "struct ComplexRewarder.PoolInfo memory" + } + }, + "src": "7130:20:9", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$2401_storage", + "typeString": "struct ComplexRewarder.PoolInfo storage ref" + } + }, + "id": 2971, + "nodeType": "ExpressionStatement", + "src": "7130:20:9" + }, + { + "eventCall": { + "argumentTypes": null, + "arguments": [ + { + "argumentTypes": null, + "id": 2973, + "name": "pid", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2884, + "src": "7183:3:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 2974, + "name": "pool", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2887, + "src": "7188:4:9", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$2401_memory_ptr", + "typeString": "struct ComplexRewarder.PoolInfo memory" + } + }, + "id": 2975, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberName": "lastRewardBlock", + "nodeType": "MemberAccess", + "referencedDeclaration": 2398, + "src": "7188:20:9", + "typeDescriptions": { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + } + }, + { + "argumentTypes": null, + "id": 2976, + "name": "lpSupply", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2901, + "src": "7210:8:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "argumentTypes": null, + "expression": { + "argumentTypes": null, + "id": 2977, + "name": "pool", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2887, + "src": "7220:4:9", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$2401_memory_ptr", + "typeString": "struct ComplexRewarder.PoolInfo memory" + } + }, + "id": 2978, + "isConstant": false, + "isLValue": true, + "isPure": false, + "lValueRequested": false, + "memberName": "accSushiPerShare", + "nodeType": "MemberAccess", + "referencedDeclaration": 2396, + "src": "7220:21:9", + "typeDescriptions": { + "typeIdentifier": "t_uint128", + "typeString": "uint128" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint64", + "typeString": "uint64" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint128", + "typeString": "uint128" + } + ], + "id": 2972, + "name": "LogUpdatePool", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 2458, + "src": "7169:13:9", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_uint256_$_t_uint64_$_t_uint256_$_t_uint256_$returns$__$", + "typeString": "function (uint256,uint64,uint256,uint256)" + } + }, + "id": 2979, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "names": [], + "nodeType": "FunctionCall", + "src": "7169:73:9", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 2980, + "nodeType": "EmitStatement", + "src": "7164:78:9" + } + ] + } + } + ] + }, + "documentation": { + "id": 2882, + "nodeType": "StructuredDocumentation", + "src": "6287:168:9", + "text": "@notice Update reward variables of the given pool.\n @param pid The index of the pool. See `poolInfo`.\n @return pool Returns the pool that was updated." + }, + "functionSelector": "51eb05a6", + "id": 2984, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "updatePool", + "nodeType": "FunctionDefinition", + "overrides": null, + "parameters": { + "id": 2885, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2884, + "mutability": "mutable", + "name": "pid", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2984, + "src": "6480:11:9", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2883, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "6480:7:9", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "6479:13:9" + }, + "returnParameters": { + "id": 2888, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 2887, + "mutability": "mutable", + "name": "pool", + "nodeType": "VariableDeclaration", + "overrides": null, + "scope": 2984, + "src": "6509:20:9", + "stateVariable": false, + "storageLocation": "memory", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$2401_memory_ptr", + "typeString": "struct ComplexRewarder.PoolInfo" + }, + "typeName": { + "contractScope": null, + "id": 2886, + "name": "PoolInfo", + "nodeType": "UserDefinedTypeName", + "referencedDeclaration": 2401, + "src": "6509:8:9", + "typeDescriptions": { + "typeIdentifier": "t_struct$_PoolInfo_$2401_storage_ptr", + "typeString": "struct ComplexRewarder.PoolInfo" + } + }, + "value": null, + "visibility": "internal" + } + ], + "src": "6508:22:9" + }, + "scope": 2985, + "src": "6460:799:9", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "public" + } + ], + "scope": 2986, + "src": "399:6863:9" + } + ], + "src": "33:7229:9" + }, + "id": 9 + } + } + } +} From d6d5e47a3f35dfcb7ce64794668546c2cc61635e Mon Sep 17 00:00:00 2001 From: Nuradil Date: Thu, 29 Apr 2021 18:22:16 +0600 Subject: [PATCH 32/41] Fixed hardhat unit tests --- .gitignore | 4 ++- .mythx.yml | 9 ----- mythx_cli/fuzz/ide/hardhat.py | 20 ++++++----- tests/test_fuzz_hardhat.py | 52 ++++++++++++++++------------ tests/testdata/hardhat-artifact.json | 30 ++++++++++++++++ 5 files changed, 75 insertions(+), 40 deletions(-) delete mode 100644 .mythx.yml create mode 100644 tests/testdata/hardhat-artifact.json diff --git a/.gitignore b/.gitignore index 0d0cdd5..cc2abb8 100644 --- a/.gitignore +++ b/.gitignore @@ -101,4 +101,6 @@ ENV/ # mypy .mypy_cache/ .idea/ -.vscode/ \ No newline at end of file +.vscode/ + +.mythx.yml diff --git a/.mythx.yml b/.mythx.yml deleted file mode 100644 index aae8eea..0000000 --- a/.mythx.yml +++ /dev/null @@ -1,9 +0,0 @@ -fuzz: - deployed_contract_address: "0x7277646075fa72737e1F6114654C5d9949a67dF2" - number_of_cores: 1 - campaign_name_prefix: "brownie_test" - rpc_url: "http://localhost:9898" - faas_url: "http://localhost:9899" - build_directory: /private/var/folders/11/8t_b_rxn4q1ddcyxnsvnkq080000gn/T/pytest-of-nuradil/pytest-15/test_fuzz_run_deployedSourceMa1/build - targets: - - "/private/var/folders/11/8t_b_rxn4q1ddcyxnsvnkq080000gn/T/pytest-of-nuradil/pytest-15/test_fuzz_run_deployedSourceMa1/contracts" \ No newline at end of file diff --git a/mythx_cli/fuzz/ide/hardhat.py b/mythx_cli/fuzz/ide/hardhat.py index 47b45a2..d5b3b7e 100644 --- a/mythx_cli/fuzz/ide/hardhat.py +++ b/mythx_cli/fuzz/ide/hardhat.py @@ -5,6 +5,7 @@ from ...util import sol_files_by_directory from pathlib import Path from mythx_cli.fuzz.exceptions import BuildArtifactsError +from os.path import commonpath, relpath class HardhatArtifacts(IDEArtifacts): @@ -32,12 +33,15 @@ def fetch_data(self): result_sources = {} for file_path in self._include: - if file_path in result_contracts: + cp = commonpath([self._build_dir, file_path]) + relative_file_path = relpath(file_path, cp) + + if relative_file_path in result_contracts: continue file_name = Path(file_path).stem - file_artifact_path: Path = self._build_dir.joinpath(file_path).joinpath(f"{file_name}.json") - file_debug_path: Path = self._build_dir.joinpath(file_path).joinpath(f"{file_name}.dbg.json") + file_artifact_path: Path = self._build_dir.joinpath(relative_file_path).joinpath(f"{file_name}.json") + file_debug_path: Path = self._build_dir.joinpath(relative_file_path).joinpath(f"{file_name}.dbg.json") if not file_artifact_path.exists() or not file_debug_path.exists(): raise BuildArtifactsError("Could not find target artifacts") @@ -46,17 +50,17 @@ def fetch_data(self): with file_debug_path.open("r") as file: file_debug_artifact = json.load(file) build_info_name = Path(file_debug_artifact["buildInfo"]).name - with self._build_dir.joinpath(f"build-info/{build_info_name}") as file: + with self._build_dir.joinpath(f"build-info/{build_info_name}").open("r") as file: build_info = json.load(file) - result_contracts[file_path] = [] + result_contracts[relative_file_path] = [] - contracts = build_info["output"]["contracts"][file_path] + contracts = build_info["output"]["contracts"][relative_file_path] - for contract, data in contracts: + for contract, data in contracts.items(): if data["evm"]["bytecode"]["object"] == "": continue - result_contracts[file_path] += [ + result_contracts[relative_file_path] += [ { "sourcePaths": list(build_info["output"]["contracts"].keys()), "deployedSourceMap": data["evm"]["deployedBytecode"]["sourceMap"], diff --git a/tests/test_fuzz_hardhat.py b/tests/test_fuzz_hardhat.py index c069800..551547d 100644 --- a/tests/test_fuzz_hardhat.py +++ b/tests/test_fuzz_hardhat.py @@ -14,7 +14,8 @@ from .common import get_test_case -BROWNIE_ARTIFACT = get_test_case("testdata/brownie-artifact.json") +HARDHAT_ARTIFACT = get_test_case("testdata/hardhat-artifact.json") +HARDHAT_BUILD_INFO_ARTIFACT = get_test_case("testdata/hardhat-build-info-artifact.json") GANACHE_URL = "http://localhost:9898" FAAS_URL = "http://localhost:9899" @@ -25,20 +26,27 @@ def setup_hardhat_project(base_path, switch_dir=False): os.chdir(str(base_path)) # add hardhat project structure - os.makedirs(str(base_path / "artifacts/contracts/")) + os.makedirs(str(base_path / "artifacts/contracts/MasterChefV2.sol/")) os.makedirs(str(base_path / "artifacts/build-info/")) - os.makedirs(str(base_path / "contracts/")) - - # patch brownie artifact with temp path - BROWNIE_ARTIFACT["allSourcePaths"][0] = f"{base_path}/contracts/sample.sol" - BROWNIE_ARTIFACT["sourcePath"] = f"{base_path}/contracts/sample.sol" + os.makedirs(str(base_path / "contracts")) # add sample brownie artifact - with open(base_path / "build/contracts/Foo.json", "w+") as artifact_f: - json.dump(BROWNIE_ARTIFACT, artifact_f) - with open(base_path / "contracts/sample.sol", "w+") as sol_f: + with open(base_path / "artifacts/build-info/b78e6e91d6666dbbf407d4a383cd8177.json", "w+") as artifact_f: + json.dump(HARDHAT_BUILD_INFO_ARTIFACT, artifact_f) + + with open(base_path / "hardhat.config.ts", "w+") as config_f: + json.dump("sample", config_f) + + for filename, content in HARDHAT_ARTIFACT.items(): + with open(base_path / f"artifacts/contracts/MasterChefV2.sol/{filename}.json", "w+") as sol_f: + json.dump(content, sol_f) + + with open(base_path / "contracts/MasterChefV2.sol", "w+") as sol_f: sol_f.write("sol code here") + with open(base_path / "contracts/sample.sol", "w+") as sol_f: + sol_f.write("sol code here") + def generate_config_file(base_path="", not_include=[]): config_file = "fuzz:" @@ -48,15 +56,15 @@ def generate_config_file(base_path="", not_include=[]): if "number_of_cores" not in not_include: config_file += "\n number_of_cores: 1" if "campaign_name_prefix" not in not_include: - config_file += '\n campaign_name_prefix: "brownie_test"' + config_file += '\n campaign_name_prefix: "hardhat_test"' if "rpc_url" not in not_include: config_file += f'\n rpc_url: "{GANACHE_URL}"' if "faas_url" not in not_include: config_file += f'\n faas_url: "{FAAS_URL}"' if "build_directory" not in not_include: - config_file += f"\n build_directory: {base_path}/build/artifacts" + config_file += f"\n build_directory: {base_path}/artifacts" if "targets" not in not_include: - config_file += f'\n targets:\n - "{base_path}/contracts"' + config_file += f'\n targets:\n - "{base_path}/contracts/MasterChefV2.sol"' return config_file @@ -94,7 +102,7 @@ def test_fuzz_no_target(tmp_path): def test_fuzz_no_contract_at_address(tmp_path): - setup_brownie_project(tmp_path, switch_dir=False) + setup_hardhat_project(tmp_path, switch_dir=False) with open(".mythx.yml", "w+") as conf_f: conf_f.write(generate_config_file(base_path=tmp_path)) @@ -117,7 +125,7 @@ def test_fuzz_no_contract_at_address(tmp_path): def test_faas_not_running(tmp_path): - setup_brownie_project(tmp_path, switch_dir=False) + setup_hardhat_project(tmp_path, switch_dir=False) with open(".mythx.yml", "w+") as conf_f: conf_f.write(generate_config_file(base_path=tmp_path)) @@ -138,7 +146,7 @@ def test_faas_not_running(tmp_path): ) runner = CliRunner() - result = runner.invoke(cli, ["fuzz", "run", f"{tmp_path}/contracts"]) + result = runner.invoke(cli, ["fuzz", "run", f"{tmp_path}/contracts/MasterChefV2.sol"]) assert ( "Error: Unable to submit the campaign to the faas. Are you sure the service is running on" @@ -152,7 +160,7 @@ def test_faas_target_config_file(tmp_path): from the config file. This is possible because the faas not running error is triggered after the Target check. If the target was not available, a different error would be thrown and the test would fail""" - setup_brownie_project(tmp_path, switch_dir=False) + setup_hardhat_project(tmp_path, switch_dir=False) with open(".mythx.yml", "w+") as conf_f: conf_f.write(generate_config_file(base_path=tmp_path)) @@ -191,7 +199,7 @@ def test_rpc_not_running(tmp_path): requests_mock.side_effect = RequestException() runner = CliRunner() - result = runner.invoke(cli, ["fuzz", "run", f"{tmp_path}/contracts"]) + result = runner.invoke(cli, ["fuzz", "run", f"{tmp_path}/contracts/MasterChefV2.sol"]) assert "HTTP error calling RPC method eth_getCode with parameters" in result.output assert result.exit_code != 0 @@ -219,7 +227,7 @@ def test_rpc_not_running(tmp_path): ), ) def test_fuzz_run(tmp_path, keyword): - setup_brownie_project(tmp_path, switch_dir=False) + setup_hardhat_project(tmp_path, switch_dir=False) with open(".mythx.yml", "w+") as conf_f: conf_f.write(generate_config_file(base_path=tmp_path)) @@ -239,7 +247,7 @@ def test_fuzz_run(tmp_path, keyword): start_faas_campaign_mock.return_value = campaign_id runner = CliRunner() - result = runner.invoke(cli, ["fuzz", "run", f"{tmp_path}/contracts"]) + result = runner.invoke(cli, ["fuzz", "run", f"{tmp_path}/contracts/MasterChefV2.sol"]) contract_exists_mock.assert_called_with( "0x7277646075fa72737e1F6114654C5d9949a67dF2" @@ -269,7 +277,7 @@ def test_fuzz_subcommands_present(keyword): @patch("mythx_cli.analyze.scribble.ScribbleMixin.instrument_solc_in_place") def test_fuzz_arm(mock, tmp_path): - setup_brownie_project(tmp_path, switch_dir=False) + setup_hardhat_project(tmp_path, switch_dir=False) runner = CliRunner() result = runner.invoke(cli, ["fuzz", "arm", f"{tmp_path}/contracts/sample.sol"]) @@ -286,7 +294,7 @@ def test_fuzz_arm(mock, tmp_path): @patch("mythx_cli.analyze.scribble.ScribbleMixin.disarm_solc_in_place") def test_fuzz_disarm(mock, tmp_path): - setup_brownie_project(tmp_path, switch_dir=False) + setup_hardhat_project(tmp_path, switch_dir=False) runner = CliRunner() result = runner.invoke(cli, ["fuzz", "disarm", f"{tmp_path}/contracts/sample.sol"]) diff --git a/tests/testdata/hardhat-artifact.json b/tests/testdata/hardhat-artifact.json new file mode 100644 index 0000000..8f214ff --- /dev/null +++ b/tests/testdata/hardhat-artifact.json @@ -0,0 +1,30 @@ +{ + "MasterChefV2": { + "_format": "hh-sol-artifact-1", + "contractName": "MasterChefV2", + "sourceName": "contracts/MasterChefV2.sol", + "abi": [], + "bytecode": "0x60e06040523480156200001157600080fd5b50604051620031b7380380620031b7833981016040819052620000349162000097565b600080546001600160a01b0319163390811782556040519091907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a36001600160601b0319606093841b81166080529190921b1660a05260c052620000f7565b600080600060608486031215620000ac578283fd5b8351620000b981620000de565b6020850151909350620000cc81620000de565b80925050604084015190509250925092565b6001600160a01b0381168114620000f457600080fd5b50565b60805160601c60a05160601c60c05161305b6200015c60003980610d905280611303528061160e5280611cdd5250806108f55280611a075280611e51525080610ccf5280610d6352806112d65280611c065280611cb05280612157525061305b6000f3fe6080604052600436106101d85760003560e01c806361621aaa11610102578063ab560e1011610095578063d1abb90711610064578063d1abb90714610529578063d2423b5114610549578063e30c39781461056a578063edd8b1701461057f576101d8565b8063ab560e10146104bf578063ab7de098146104d4578063b0bcf42a146104f4578063c346253d14610509576101d8565b806388bba42f116100d157806388bba42f1461043c5780638da5cb5b1461045c5780638dbdbe6d1461047157806393f1a40b14610491576101d8565b806361621aaa146103c557806378ed5d1f146103da5780637c516e94146104075780637cd07e4714610427576101d8565b806319ab453c1161017a5780634e71e0c8116101495780634e71e0c81461034e5780634f70b15a1461036357806351eb05a61461037857806357a5b58c146103a5576101d8565b806319ab453c146102ce57806323cf3118146102ee5780632f940c701461030e578063454b06081461032e576101d8565b80631526fe27116101b65780631526fe271461024a57806317caf6f11461027957806318fccc761461028e578063195426ec146102ae576101d8565b8063078dfbe7146101dd578063081e3eda146101ff5780630ad58d2f1461022a575b600080fd5b3480156101e957600080fd5b506101fd6101f83660046125dd565b610594565b005b34801561020b57600080fd5b50610214610683565b6040516102219190612ee9565b60405180910390f35b34801561023657600080fd5b506101fd6102453660046128fc565b610689565b34801561025657600080fd5b5061026a610265366004612867565b610819565b60405161022193929190612ebf565b34801561028557600080fd5b5061021461085b565b34801561029a57600080fd5b506101fd6102a9366004612897565b610861565b3480156102ba57600080fd5b506102146102c9366004612897565b6109fb565b3480156102da57600080fd5b506101fd6102e93660046126cb565b610bf8565b3480156102fa57600080fd5b506101fd6103093660046126cb565b610e19565b34801561031a57600080fd5b506101fd610329366004612897565b610e65565b34801561033a57600080fd5b506101fd610349366004612867565b610f86565b34801561035a57600080fd5b506101fd611232565b34801561036f57600080fd5b506101fd6112bf565b34801561038457600080fd5b50610398610393366004612867565b611362565b6040516102219190612e86565b3480156103b157600080fd5b506101fd6103c0366004612670565b6115dc565b3480156103d157600080fd5b5061021461160c565b3480156103e657600080fd5b506103fa6103f5366004612867565b611630565b60405161022191906129ca565b34801561041357600080fd5b506101fd610422366004612703565b611657565b34801561043357600080fd5b506103fa6116cb565b34801561044857600080fd5b506101fd610457366004612929565b6116da565b34801561046857600080fd5b506103fa611847565b34801561047d57600080fd5b506101fd61048c3660046128fc565b611856565b34801561049d57600080fd5b506104b16104ac366004612897565b6119e1565b604051610221929190612f31565b3480156104cb57600080fd5b506103fa611a05565b3480156104e057600080fd5b506101fd6104ef3660046128c6565b611a29565b34801561050057600080fd5b50610214611c02565b34801561051557600080fd5b506103fa610524366004612867565b611d76565b34801561053557600080fd5b506101fd6105443660046128fc565b611d83565b61055c610557366004612627565b611fb6565b604051610221929190612a5c565b34801561057657600080fd5b506103fa612146565b34801561058b57600080fd5b506103fa612155565b6000546001600160a01b031633146105c75760405162461bcd60e51b81526004016105be90612cfe565b60405180910390fd5b8115610662576001600160a01b0383161515806105e15750805b6105fd5760405162461bcd60e51b81526004016105be90612c18565b600080546040516001600160a01b03808716939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0385166001600160a01b03199182161790915560018054909116905561067e565b600180546001600160a01b0319166001600160a01b0385161790555b505050565b60035490565b610691612575565b61069a84611362565b600085815260066020908152604080832033845290915290208151919250906106ec9064e8d4a51000906106d89087906001600160801b0316612179565b816106df57fe5b60018401549190046121b6565b600182015580546106fd9085612203565b815560058054600091908790811061071157fe5b6000918252602090912001546001600160a01b0316905080156107975781546040516345fb1ba160e11b81526001600160a01b03831691638bf6374291610764918a9133918a9160009190600401612ef2565b600060405180830381600087803b15801561077e57600080fd5b505af1158015610792573d6000803e3d6000fd5b505050505b6107c58486600489815481106107a957fe5b6000918252602090912001546001600160a01b03169190612226565b836001600160a01b031686336001600160a01b03167f8166bf25f8a2b7ed3c85049207da4358d16edbed977d23fa2ee6f0dde3ec2132886040516108099190612ee9565b60405180910390a4505050505050565b6003818154811061082657fe5b6000918252602090912001546001600160801b03811691506001600160401b03600160801b8204811691600160c01b90041683565b60075481565b610869612575565b61087283611362565b6000848152600660209081526040808320338452909152812082518154939450909264e8d4a51000916108ae91906001600160801b0316612179565b816108b557fe5b04905060006108d96108d48460010154846121b690919063ffffffff16565b612314565b600184018390559050801561091c5761091c6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168683612226565b60006005878154811061092b57fe5b6000918252602090912001546001600160a01b0316905080156109b05783546040516345fb1ba160e11b81526001600160a01b03831691638bf637429161097d918b9133918c91899190600401612ef2565b600060405180830381600087803b15801561099757600080fd5b505af11580156109ab573d6000803e3d6000fd5b505050505b86336001600160a01b03167f71bab65ced2e5750775a0613be067df48ef06cf92a496ebf7663ae0660924954846040516109ea9190612ee9565b60405180910390a350505050505050565b6000610a05612575565b60038481548110610a1257fe5b600091825260208083206040805160608101825291909301546001600160801b0380821683526001600160401b03600160801b8304811684860152600160c01b90920490911682850152888552600683528385206001600160a01b0389168652909252918320825160048054949650919492169288908110610a9057fe5b6000918252602090912001546040516370a0823160e01b81526001600160a01b03909116906370a0823190610ac99030906004016129ca565b60206040518083038186803b158015610ae157600080fd5b505afa158015610af5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b19919061287f565b905083602001516001600160401b031643118015610b3657508015155b15610bbf576000610b5d85602001516001600160401b03164361220390919063ffffffff16565b90506000600754610b8d87604001516001600160401b0316610b87610b80611c02565b8690612179565b90612179565b81610b9457fe5b049050610bba83610baa8364e8d4a51000612179565b81610bb157fe5b8691900461233a565b935050505b60018301548354610bed916108d49164e8d4a5100090610bdf9087612179565b81610be657fe5b04906121b6565b979650505050505050565b6040516370a0823160e01b81526000906001600160a01b038316906370a0823190610c279033906004016129ca565b60206040518083038186803b158015610c3f57600080fd5b505afa158015610c53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c77919061287f565b905080610c965760405162461bcd60e51b81526004016105be90612b5d565b610cab6001600160a01b03831633308461235d565b60405163095ea7b360e01b81526001600160a01b0383169063095ea7b390610cf9907f0000000000000000000000000000000000000000000000000000000000000000908590600401612a43565b602060405180830381600087803b158015610d1357600080fd5b505af1158015610d27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4b91906126af565b50604051631c57762b60e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e2bbb15890610dba907f0000000000000000000000000000000000000000000000000000000000000000908590600401612f31565b600060405180830381600087803b158015610dd457600080fd5b505af1158015610de8573d6000803e3d6000fd5b50506040517f98a9bd3b7a617581fc53b1e2992534e0e0cb5091c9d44aa1a7fc978f706caa83925060009150a15050565b6000546001600160a01b03163314610e435760405162461bcd60e51b81526004016105be90612cfe565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b60008281526006602090815260408083203384529091528120805482825560018201839055600580549293919286908110610e9c57fe5b6000918252602090912001546001600160a01b031690508015610f21576040516345fb1ba160e11b81526001600160a01b03821690638bf6374290610eee908890339089906000908190600401612ef2565b600060405180830381600087803b158015610f0857600080fd5b505af1158015610f1c573d6000803e3d6000fd5b505050505b610f338483600488815481106107a957fe5b836001600160a01b031685336001600160a01b03167f2cac5e20e1541d836381527a43f651851e302817b71dc8e810284e69210c1c6b85604051610f779190612ee9565b60405180910390a45050505050565b6002546001600160a01b0316610fae5760405162461bcd60e51b81526004016105be90612d9f565b600060048281548110610fbd57fe5b60009182526020822001546040516370a0823160e01b81526001600160a01b03909116925082906370a0823190610ff89030906004016129ca565b60206040518083038186803b15801561101057600080fd5b505afa158015611024573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611048919061287f565b60025460405163095ea7b360e01b81529192506001600160a01b038085169263095ea7b39261107d9216908590600401612a43565b602060405180830381600087803b15801561109757600080fd5b505af11580156110ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110cf91906126af565b5060025460405163ce5494bb60e01b81526000916001600160a01b03169063ce5494bb906111019086906004016129ca565b602060405180830381600087803b15801561111b57600080fd5b505af115801561112f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061115391906126e7565b6040516370a0823160e01b81529091506001600160a01b038216906370a08231906111829030906004016129ca565b60206040518083038186803b15801561119a57600080fd5b505afa1580156111ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111d2919061287f565b82146111f05760405162461bcd60e51b81526004016105be90612c47565b80600485815481106111fe57fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555050505050565b6001546001600160a01b031633811461125d5760405162461bcd60e51b81526004016105be90612d33565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b039092166001600160a01b0319928316179055600180549091169055565b604051631c57762b60e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e2bbb1589061132e907f000000000000000000000000000000000000000000000000000000000000000090600090600401612f31565b600060405180830381600087803b15801561134857600080fd5b505af115801561135c573d6000803e3d6000fd5b50505050565b61136a612575565b6003828154811061137757fe5b60009182526020918290206040805160608101825292909101546001600160801b03811683526001600160401b03600160801b82048116948401859052600160c01b909104169082015291504311156115d7576000600483815481106113d957fe5b6000918252602090912001546040516370a0823160e01b81526001600160a01b03909116906370a08231906114129030906004016129ca565b60206040518083038186803b15801561142a57600080fd5b505afa15801561143e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611462919061287f565b905080156114fb57600061148c83602001516001600160401b03164361220390919063ffffffff16565b905060006007546114af85604001516001600160401b0316610b87610b80611c02565b816114b657fe5b0490506114ed6114dc846114cf8464e8d4a51000612179565b816114d657fe5b0461244e565b85516001600160801b031690612477565b6001600160801b0316845250505b611504436124a6565b6001600160401b03166020830152600380548391908590811061152357fe5b6000918252602091829020835191018054848401516040958601516001600160801b03199092166001600160801b039094169390931767ffffffffffffffff60801b1916600160801b6001600160401b0394851602176001600160c01b0316600160c01b93909116929092029190911790558301518351915185927f0fc9545022a542541ad085d091fb09a2ab36fee366a4576ab63714ea907ad353926115cd9290918691612f3f565b60405180910390a2505b919050565b8060005b8181101561135c576116038484838181106115f757fe5b90506020020135611362565b506001016115e0565b7f000000000000000000000000000000000000000000000000000000000000000081565b6004818154811061163d57fe5b6000918252602090912001546001600160a01b0316905081565b60405163d505accf60e01b81526001600160a01b0389169063d505accf9061168f908a908a908a908a908a908a908a90600401612a02565b600060405180830381600087803b1580156116a957600080fd5b505af11580156116bd573d6000803e3d6000fd5b505050505050505050505050565b6002546001600160a01b031681565b6000546001600160a01b031633146117045760405162461bcd60e51b81526004016105be90612cfe565b6117438361173d6003878154811061171857fe5b60009182526020909120015460075490600160c01b90046001600160401b0316612203565b9061233a565b60075561174f836124a6565b6003858154811061175c57fe5b9060005260206000200160000160186101000a8154816001600160401b0302191690836001600160401b0316021790555080156117d05781600585815481106117a157fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b806117fc57600584815481106117e257fe5b6000918252602090912001546001600160a01b03166117fe565b815b6001600160a01b0316847f95895a6ab1df54420d241b55243258a33e61b2194db66c1179ec521aae8e18658584604051611839929190612f21565b60405180910390a350505050565b6000546001600160a01b031681565b61185e612575565b61186784611362565b60008581526006602090815260408083206001600160a01b03871684529091529020805491925090611899908561233a565b815581516118d09064e8d4a51000906118bc9087906001600160801b0316612179565b816118c357fe5b60018401549190046124cf565b81600101819055506000600586815481106118e757fe5b6000918252602090912001546001600160a01b03169050801561196d5781546040516345fb1ba160e11b81526001600160a01b03831691638bf637429161193a918a918991829160009190600401612ef2565b600060405180830381600087803b15801561195457600080fd5b505af1158015611968573d6000803e3d6000fd5b505050505b61199d33308760048a8154811061198057fe5b6000918252602090912001546001600160a01b031692919061235d565b836001600160a01b031686336001600160a01b03167f02d7e648dd130fc184d383e55bb126ac4c9c60e8f94bf05acdf557ba2d540b47886040516108099190612ee9565b60066020908152600092835260408084209091529082529020805460019091015482565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000546001600160a01b03163314611a535760405162461bcd60e51b81526004016105be90612cfe565b6007544390611a62908561233a565b6007556004805460018181019092557f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180546001600160a01b038087166001600160a01b03199283161790925560058054938401815560009081527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0909301805492861692909116919091179055604080516060810190915290815260039060208101611b0f846124a6565b6001600160401b03168152602001611b26876124a6565b6001600160401b039081169091528254600181810185556000948552602094859020845192018054958501516040909501518416600160c01b026001600160c01b0395909416600160801b0267ffffffffffffffff60801b196001600160801b039094166001600160801b0319909716969096179290921694909417929092161790556004546001600160a01b038085169290861691611bc591612203565b7f81ee0f8c5c46e2cb41984886f77a84181724abb86c32a5f6de539b07509d45e587604051611bf49190612ee9565b60405180910390a450505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166317caf6f16040518163ffffffff1660e01b815260040160206040518083038186803b158015611c5d57600080fd5b505afa158015611c71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c95919061287f565b604051631526fe2760e01b8152611d69906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690631526fe2790611d05907f000000000000000000000000000000000000000000000000000000000000000090600401612ee9565b60806040518083038186803b158015611d1d57600080fd5b505afa158015611d31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d559190612815565b6020015168056bc75e2d6310000090612179565b81611d7057fe5b04905090565b6005818154811061163d57fe5b611d8b612575565b611d9484611362565b6000858152600660209081526040808320338452909152812082518154939450909264e8d4a5100091611dd091906001600160801b0316612179565b81611dd757fe5b0490506000611df66108d48460010154846121b690919063ffffffff16565b9050611e3164e8d4a51000611e2186600001516001600160801b03168961217990919063ffffffff16565b81611e2857fe5b849190046121b6565b60018401558254611e429087612203565b8355611e786001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168683612226565b600060058881548110611e8757fe5b6000918252602090912001546001600160a01b031690508015611f0c5783546040516345fb1ba160e11b81526001600160a01b03831691638bf6374291611ed9918c9133918c91899190600401612ef2565b600060405180830381600087803b158015611ef357600080fd5b505af1158015611f07573d6000803e3d6000fd5b505050505b611f1e868860048b815481106107a957fe5b856001600160a01b031688336001600160a01b03167f8166bf25f8a2b7ed3c85049207da4358d16edbed977d23fa2ee6f0dde3ec21328a604051611f629190612ee9565b60405180910390a487336001600160a01b03167f71bab65ced2e5750775a0613be067df48ef06cf92a496ebf7663ae066092495484604051611fa49190612ee9565b60405180910390a35050505050505050565b606080836001600160401b0381118015611fcf57600080fd5b50604051908082528060200260200182016040528015611ff9578160200160208202803683370190505b509150836001600160401b038111801561201257600080fd5b5060405190808252806020026020018201604052801561204657816020015b60608152602001906001900390816120315790505b50905060005b8481101561213d57600060603088888581811061206557fe5b90506020028101906120779190612f69565b60405161208592919061299e565b600060405180830381855af49150503d80600081146120c0576040519150601f19603f3d011682016040523d82523d6000602084013e6120c5565b606091505b509150915081806120d4575085155b6120dd82612515565b906120fb5760405162461bcd60e51b81526004016105be9190612af6565b508185848151811061210957fe5b6020026020010190151590811515815250508084848151811061212857fe5b6020908102919091010152505060010161204c565b50935093915050565b6001546001600160a01b031681565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008115806121945750508082028282828161219157fe5b04145b6121b05760405162461bcd60e51b81526004016105be90612e4f565b92915050565b60008183038183128015906121cb5750838113155b806121e057506000831280156121e057508381135b6121fc5760405162461bcd60e51b81526004016105be90612dd6565b9392505050565b808203828111156121b05760405162461bcd60e51b81526004016105be90612b09565b60006060846001600160a01b031663a9059cbb858560405160240161224c929190612a43565b6040516020818303038152906040529060e01b6020820180516001600160e01b03838183161783525050505060405161228591906129ae565b6000604051808303816000865af19150503d80600081146122c2576040519150601f19603f3d011682016040523d82523d6000602084013e6122c7565b606091505b50915091508180156122f15750805115806122f15750808060200190518101906122f191906126af565b61230d5760405162461bcd60e51b81526004016105be90612ba0565b5050505050565b6000808212156123365760405162461bcd60e51b81526004016105be90612b38565b5090565b818101818110156121b05760405162461bcd60e51b81526004016105be90612cc7565b60006060856001600160a01b03166323b872dd868686604051602401612385939291906129de565b6040516020818303038152906040529060e01b6020820180516001600160e01b0383818316178352505050506040516123be91906129ae565b6000604051808303816000865af19150503d80600081146123fb576040519150601f19603f3d011682016040523d82523d6000602084013e612400565b606091505b509150915081801561242a57508051158061242a57508080602001905181019061242a91906126af565b6124465760405162461bcd60e51b81526004016105be90612e1a565b505050505050565b60006001600160801b038211156123365760405162461bcd60e51b81526004016105be90612c90565b8181016001600160801b0380831690821610156121b05760405162461bcd60e51b81526004016105be90612cc7565b60006001600160401b038211156123365760405162461bcd60e51b81526004016105be90612d68565b60008282018183128015906124e45750838112155b806124f957506000831280156124f957508381125b6121fc5760405162461bcd60e51b81526004016105be90612bd7565b606060448251101561255b575060408051808201909152601d81527f5472616e73616374696f6e2072657665727465642073696c656e746c7900000060208201526115d7565b600482019150818060200190518101906121b0919061278a565b604080516060810182526000808252602082018190529181019190915290565b60008083601f8401126125a6578182fd5b5081356001600160401b038111156125bc578182fd5b60208301915083602080830285010111156125d657600080fd5b9250929050565b6000806000606084860312156125f1578283fd5b83356125fc81612fff565b9250602084013561260c81613017565b9150604084013561261c81613017565b809150509250925092565b60008060006040848603121561263b578283fd5b83356001600160401b03811115612650578384fd5b61265c86828701612595565b909450925050602084013561261c81613017565b60008060208385031215612682578182fd5b82356001600160401b03811115612697578283fd5b6126a385828601612595565b90969095509350505050565b6000602082840312156126c0578081fd5b81516121fc81613017565b6000602082840312156126dc578081fd5b81356121fc81612fff565b6000602082840312156126f8578081fd5b81516121fc81612fff565b600080600080600080600080610100898b03121561271f578384fd5b883561272a81612fff565b9750602089013561273a81612fff565b9650604089013561274a81612fff565b9550606089013594506080890135935060a089013560ff8116811461276d578384fd5b979a969950949793969295929450505060c08201359160e0013590565b60006020828403121561279b578081fd5b81516001600160401b03808211156127b1578283fd5b818401915084601f8301126127c4578283fd5b8151818111156127d2578384fd5b6127e5601f8201601f1916602001612fad565b91508082528560208285010111156127fb578384fd5b61280c816020840160208601612fd3565b50949350505050565b600060808284031215612826578081fd5b6128306080612fad565b825161283b81612fff565b808252506020830151602082015260408301516040820152606083015160608201528091505092915050565b600060208284031215612878578081fd5b5035919050565b600060208284031215612890578081fd5b5051919050565b600080604083850312156128a9578182fd5b8235915060208301356128bb81612fff565b809150509250929050565b6000806000606084860312156128da578081fd5b8335925060208401356128ec81612fff565b9150604084013561261c81612fff565b600080600060608486031215612910578081fd5b8335925060208401359150604084013561261c81612fff565b6000806000806080858703121561293e578182fd5b8435935060208501359250604085013561295781612fff565b9150606085013561296781613017565b939692955090935050565b6000815180845261298a816020860160208601612fd3565b601f01601f19169290920160200192915050565b6000828483379101908152919050565b600082516129c0818460208701612fd3565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b6001600160a01b03929092168252602082015260400190565b604080825283519082018190526000906020906060840190828701845b82811015612a97578151151584529284019290840190600101612a79565b50505083810382850152808551612aae8184612ee9565b91508192508381028201848801865b83811015612ae7578583038552612ad5838351612972565b94870194925090860190600101612abd565b50909998505050505050505050565b6000602082526121fc6020830184612972565b602080825260159082015274426f72696e674d6174683a20556e646572666c6f7760581b604082015260600190565b6020808252600b908201526a0496e7465676572203c20360ac1b604082015260600190565b60208082526023908201527f4d61737465724368656656323a2042616c616e6365206d75737420657863656560408201526206420360ec1b606082015260800190565b6020808252601c908201527f426f72696e6745524332303a205472616e73666572206661696c656400000000604082015260600190565b60208082526021908201527f5369676e6564536166654d6174683a206164646974696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252601590820152744f776e61626c653a207a65726f206164647265737360581b604082015260600190565b60208082526029908201527f4d61737465724368656656323a206d696772617465642062616c616e6365206d6040820152680eae6e840dac2e8c6d60bb1b606082015260800190565b6020808252601c908201527f426f72696e674d6174683a2075696e74313238204f766572666c6f7700000000604082015260600190565b60208082526018908201527f426f72696e674d6174683a20416464204f766572666c6f770000000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c657220213d2070656e64696e67206f776e6572604082015260600190565b6020808252601b908201527f426f72696e674d6174683a2075696e743634204f766572666c6f770000000000604082015260600190565b6020808252601d908201527f4d61737465724368656656323a206e6f206d69677261746f7220736574000000604082015260600190565b60208082526024908201527f5369676e6564536166654d6174683a207375627472616374696f6e206f766572604082015263666c6f7760e01b606082015260800190565b6020808252818101527f426f72696e6745524332303a205472616e7366657246726f6d206661696c6564604082015260600190565b60208082526018908201527f426f72696e674d6174683a204d756c204f766572666c6f770000000000000000604082015260600190565b81516001600160801b031681526020808301516001600160401b0390811691830191909152604092830151169181019190915260600190565b6001600160801b039390931683526001600160401b03918216602084015216604082015260600190565b90815260200190565b9485526001600160a01b0393841660208601529190921660408401526060830191909152608082015260a00190565b9182521515602082015260400190565b918252602082015260400190565b6001600160401b0393909316835260208301919091526001600160801b0316604082015260600190565b6000808335601e19843603018112612f7f578283fd5b8301803591506001600160401b03821115612f98578283fd5b6020019150368190038213156125d657600080fd5b6040518181016001600160401b0381118282101715612fcb57600080fd5b604052919050565b60005b83811015612fee578181015183820152602001612fd6565b8381111561135c5750506000910152565b6001600160a01b038116811461301457600080fd5b50565b801515811461301457600080fdfea2646970667358221220814e5dfdee606b9ff8357a8c99c275bc5bee65fd89e04f2e557682da8ccc9f4264736f6c634300060c0033", + "deployedBytecode": "0x6080604052600436106101d85760003560e01c806361621aaa11610102578063ab560e1011610095578063d1abb90711610064578063d1abb90714610529578063d2423b5114610549578063e30c39781461056a578063edd8b1701461057f576101d8565b8063ab560e10146104bf578063ab7de098146104d4578063b0bcf42a146104f4578063c346253d14610509576101d8565b806388bba42f116100d157806388bba42f1461043c5780638da5cb5b1461045c5780638dbdbe6d1461047157806393f1a40b14610491576101d8565b806361621aaa146103c557806378ed5d1f146103da5780637c516e94146104075780637cd07e4714610427576101d8565b806319ab453c1161017a5780634e71e0c8116101495780634e71e0c81461034e5780634f70b15a1461036357806351eb05a61461037857806357a5b58c146103a5576101d8565b806319ab453c146102ce57806323cf3118146102ee5780632f940c701461030e578063454b06081461032e576101d8565b80631526fe27116101b65780631526fe271461024a57806317caf6f11461027957806318fccc761461028e578063195426ec146102ae576101d8565b8063078dfbe7146101dd578063081e3eda146101ff5780630ad58d2f1461022a575b600080fd5b3480156101e957600080fd5b506101fd6101f83660046125dd565b610594565b005b34801561020b57600080fd5b50610214610683565b6040516102219190612ee9565b60405180910390f35b34801561023657600080fd5b506101fd6102453660046128fc565b610689565b34801561025657600080fd5b5061026a610265366004612867565b610819565b60405161022193929190612ebf565b34801561028557600080fd5b5061021461085b565b34801561029a57600080fd5b506101fd6102a9366004612897565b610861565b3480156102ba57600080fd5b506102146102c9366004612897565b6109fb565b3480156102da57600080fd5b506101fd6102e93660046126cb565b610bf8565b3480156102fa57600080fd5b506101fd6103093660046126cb565b610e19565b34801561031a57600080fd5b506101fd610329366004612897565b610e65565b34801561033a57600080fd5b506101fd610349366004612867565b610f86565b34801561035a57600080fd5b506101fd611232565b34801561036f57600080fd5b506101fd6112bf565b34801561038457600080fd5b50610398610393366004612867565b611362565b6040516102219190612e86565b3480156103b157600080fd5b506101fd6103c0366004612670565b6115dc565b3480156103d157600080fd5b5061021461160c565b3480156103e657600080fd5b506103fa6103f5366004612867565b611630565b60405161022191906129ca565b34801561041357600080fd5b506101fd610422366004612703565b611657565b34801561043357600080fd5b506103fa6116cb565b34801561044857600080fd5b506101fd610457366004612929565b6116da565b34801561046857600080fd5b506103fa611847565b34801561047d57600080fd5b506101fd61048c3660046128fc565b611856565b34801561049d57600080fd5b506104b16104ac366004612897565b6119e1565b604051610221929190612f31565b3480156104cb57600080fd5b506103fa611a05565b3480156104e057600080fd5b506101fd6104ef3660046128c6565b611a29565b34801561050057600080fd5b50610214611c02565b34801561051557600080fd5b506103fa610524366004612867565b611d76565b34801561053557600080fd5b506101fd6105443660046128fc565b611d83565b61055c610557366004612627565b611fb6565b604051610221929190612a5c565b34801561057657600080fd5b506103fa612146565b34801561058b57600080fd5b506103fa612155565b6000546001600160a01b031633146105c75760405162461bcd60e51b81526004016105be90612cfe565b60405180910390fd5b8115610662576001600160a01b0383161515806105e15750805b6105fd5760405162461bcd60e51b81526004016105be90612c18565b600080546040516001600160a01b03808716939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0385166001600160a01b03199182161790915560018054909116905561067e565b600180546001600160a01b0319166001600160a01b0385161790555b505050565b60035490565b610691612575565b61069a84611362565b600085815260066020908152604080832033845290915290208151919250906106ec9064e8d4a51000906106d89087906001600160801b0316612179565b816106df57fe5b60018401549190046121b6565b600182015580546106fd9085612203565b815560058054600091908790811061071157fe5b6000918252602090912001546001600160a01b0316905080156107975781546040516345fb1ba160e11b81526001600160a01b03831691638bf6374291610764918a9133918a9160009190600401612ef2565b600060405180830381600087803b15801561077e57600080fd5b505af1158015610792573d6000803e3d6000fd5b505050505b6107c58486600489815481106107a957fe5b6000918252602090912001546001600160a01b03169190612226565b836001600160a01b031686336001600160a01b03167f8166bf25f8a2b7ed3c85049207da4358d16edbed977d23fa2ee6f0dde3ec2132886040516108099190612ee9565b60405180910390a4505050505050565b6003818154811061082657fe5b6000918252602090912001546001600160801b03811691506001600160401b03600160801b8204811691600160c01b90041683565b60075481565b610869612575565b61087283611362565b6000848152600660209081526040808320338452909152812082518154939450909264e8d4a51000916108ae91906001600160801b0316612179565b816108b557fe5b04905060006108d96108d48460010154846121b690919063ffffffff16565b612314565b600184018390559050801561091c5761091c6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168683612226565b60006005878154811061092b57fe5b6000918252602090912001546001600160a01b0316905080156109b05783546040516345fb1ba160e11b81526001600160a01b03831691638bf637429161097d918b9133918c91899190600401612ef2565b600060405180830381600087803b15801561099757600080fd5b505af11580156109ab573d6000803e3d6000fd5b505050505b86336001600160a01b03167f71bab65ced2e5750775a0613be067df48ef06cf92a496ebf7663ae0660924954846040516109ea9190612ee9565b60405180910390a350505050505050565b6000610a05612575565b60038481548110610a1257fe5b600091825260208083206040805160608101825291909301546001600160801b0380821683526001600160401b03600160801b8304811684860152600160c01b90920490911682850152888552600683528385206001600160a01b0389168652909252918320825160048054949650919492169288908110610a9057fe5b6000918252602090912001546040516370a0823160e01b81526001600160a01b03909116906370a0823190610ac99030906004016129ca565b60206040518083038186803b158015610ae157600080fd5b505afa158015610af5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b19919061287f565b905083602001516001600160401b031643118015610b3657508015155b15610bbf576000610b5d85602001516001600160401b03164361220390919063ffffffff16565b90506000600754610b8d87604001516001600160401b0316610b87610b80611c02565b8690612179565b90612179565b81610b9457fe5b049050610bba83610baa8364e8d4a51000612179565b81610bb157fe5b8691900461233a565b935050505b60018301548354610bed916108d49164e8d4a5100090610bdf9087612179565b81610be657fe5b04906121b6565b979650505050505050565b6040516370a0823160e01b81526000906001600160a01b038316906370a0823190610c279033906004016129ca565b60206040518083038186803b158015610c3f57600080fd5b505afa158015610c53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c77919061287f565b905080610c965760405162461bcd60e51b81526004016105be90612b5d565b610cab6001600160a01b03831633308461235d565b60405163095ea7b360e01b81526001600160a01b0383169063095ea7b390610cf9907f0000000000000000000000000000000000000000000000000000000000000000908590600401612a43565b602060405180830381600087803b158015610d1357600080fd5b505af1158015610d27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4b91906126af565b50604051631c57762b60e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e2bbb15890610dba907f0000000000000000000000000000000000000000000000000000000000000000908590600401612f31565b600060405180830381600087803b158015610dd457600080fd5b505af1158015610de8573d6000803e3d6000fd5b50506040517f98a9bd3b7a617581fc53b1e2992534e0e0cb5091c9d44aa1a7fc978f706caa83925060009150a15050565b6000546001600160a01b03163314610e435760405162461bcd60e51b81526004016105be90612cfe565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b60008281526006602090815260408083203384529091528120805482825560018201839055600580549293919286908110610e9c57fe5b6000918252602090912001546001600160a01b031690508015610f21576040516345fb1ba160e11b81526001600160a01b03821690638bf6374290610eee908890339089906000908190600401612ef2565b600060405180830381600087803b158015610f0857600080fd5b505af1158015610f1c573d6000803e3d6000fd5b505050505b610f338483600488815481106107a957fe5b836001600160a01b031685336001600160a01b03167f2cac5e20e1541d836381527a43f651851e302817b71dc8e810284e69210c1c6b85604051610f779190612ee9565b60405180910390a45050505050565b6002546001600160a01b0316610fae5760405162461bcd60e51b81526004016105be90612d9f565b600060048281548110610fbd57fe5b60009182526020822001546040516370a0823160e01b81526001600160a01b03909116925082906370a0823190610ff89030906004016129ca565b60206040518083038186803b15801561101057600080fd5b505afa158015611024573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611048919061287f565b60025460405163095ea7b360e01b81529192506001600160a01b038085169263095ea7b39261107d9216908590600401612a43565b602060405180830381600087803b15801561109757600080fd5b505af11580156110ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110cf91906126af565b5060025460405163ce5494bb60e01b81526000916001600160a01b03169063ce5494bb906111019086906004016129ca565b602060405180830381600087803b15801561111b57600080fd5b505af115801561112f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061115391906126e7565b6040516370a0823160e01b81529091506001600160a01b038216906370a08231906111829030906004016129ca565b60206040518083038186803b15801561119a57600080fd5b505afa1580156111ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111d2919061287f565b82146111f05760405162461bcd60e51b81526004016105be90612c47565b80600485815481106111fe57fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555050505050565b6001546001600160a01b031633811461125d5760405162461bcd60e51b81526004016105be90612d33565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b039092166001600160a01b0319928316179055600180549091169055565b604051631c57762b60e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e2bbb1589061132e907f000000000000000000000000000000000000000000000000000000000000000090600090600401612f31565b600060405180830381600087803b15801561134857600080fd5b505af115801561135c573d6000803e3d6000fd5b50505050565b61136a612575565b6003828154811061137757fe5b60009182526020918290206040805160608101825292909101546001600160801b03811683526001600160401b03600160801b82048116948401859052600160c01b909104169082015291504311156115d7576000600483815481106113d957fe5b6000918252602090912001546040516370a0823160e01b81526001600160a01b03909116906370a08231906114129030906004016129ca565b60206040518083038186803b15801561142a57600080fd5b505afa15801561143e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611462919061287f565b905080156114fb57600061148c83602001516001600160401b03164361220390919063ffffffff16565b905060006007546114af85604001516001600160401b0316610b87610b80611c02565b816114b657fe5b0490506114ed6114dc846114cf8464e8d4a51000612179565b816114d657fe5b0461244e565b85516001600160801b031690612477565b6001600160801b0316845250505b611504436124a6565b6001600160401b03166020830152600380548391908590811061152357fe5b6000918252602091829020835191018054848401516040958601516001600160801b03199092166001600160801b039094169390931767ffffffffffffffff60801b1916600160801b6001600160401b0394851602176001600160c01b0316600160c01b93909116929092029190911790558301518351915185927f0fc9545022a542541ad085d091fb09a2ab36fee366a4576ab63714ea907ad353926115cd9290918691612f3f565b60405180910390a2505b919050565b8060005b8181101561135c576116038484838181106115f757fe5b90506020020135611362565b506001016115e0565b7f000000000000000000000000000000000000000000000000000000000000000081565b6004818154811061163d57fe5b6000918252602090912001546001600160a01b0316905081565b60405163d505accf60e01b81526001600160a01b0389169063d505accf9061168f908a908a908a908a908a908a908a90600401612a02565b600060405180830381600087803b1580156116a957600080fd5b505af11580156116bd573d6000803e3d6000fd5b505050505050505050505050565b6002546001600160a01b031681565b6000546001600160a01b031633146117045760405162461bcd60e51b81526004016105be90612cfe565b6117438361173d6003878154811061171857fe5b60009182526020909120015460075490600160c01b90046001600160401b0316612203565b9061233a565b60075561174f836124a6565b6003858154811061175c57fe5b9060005260206000200160000160186101000a8154816001600160401b0302191690836001600160401b0316021790555080156117d05781600585815481106117a157fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055505b806117fc57600584815481106117e257fe5b6000918252602090912001546001600160a01b03166117fe565b815b6001600160a01b0316847f95895a6ab1df54420d241b55243258a33e61b2194db66c1179ec521aae8e18658584604051611839929190612f21565b60405180910390a350505050565b6000546001600160a01b031681565b61185e612575565b61186784611362565b60008581526006602090815260408083206001600160a01b03871684529091529020805491925090611899908561233a565b815581516118d09064e8d4a51000906118bc9087906001600160801b0316612179565b816118c357fe5b60018401549190046124cf565b81600101819055506000600586815481106118e757fe5b6000918252602090912001546001600160a01b03169050801561196d5781546040516345fb1ba160e11b81526001600160a01b03831691638bf637429161193a918a918991829160009190600401612ef2565b600060405180830381600087803b15801561195457600080fd5b505af1158015611968573d6000803e3d6000fd5b505050505b61199d33308760048a8154811061198057fe5b6000918252602090912001546001600160a01b031692919061235d565b836001600160a01b031686336001600160a01b03167f02d7e648dd130fc184d383e55bb126ac4c9c60e8f94bf05acdf557ba2d540b47886040516108099190612ee9565b60066020908152600092835260408084209091529082529020805460019091015482565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000546001600160a01b03163314611a535760405162461bcd60e51b81526004016105be90612cfe565b6007544390611a62908561233a565b6007556004805460018181019092557f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180546001600160a01b038087166001600160a01b03199283161790925560058054938401815560009081527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0909301805492861692909116919091179055604080516060810190915290815260039060208101611b0f846124a6565b6001600160401b03168152602001611b26876124a6565b6001600160401b039081169091528254600181810185556000948552602094859020845192018054958501516040909501518416600160c01b026001600160c01b0395909416600160801b0267ffffffffffffffff60801b196001600160801b039094166001600160801b0319909716969096179290921694909417929092161790556004546001600160a01b038085169290861691611bc591612203565b7f81ee0f8c5c46e2cb41984886f77a84181724abb86c32a5f6de539b07509d45e587604051611bf49190612ee9565b60405180910390a450505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166317caf6f16040518163ffffffff1660e01b815260040160206040518083038186803b158015611c5d57600080fd5b505afa158015611c71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c95919061287f565b604051631526fe2760e01b8152611d69906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690631526fe2790611d05907f000000000000000000000000000000000000000000000000000000000000000090600401612ee9565b60806040518083038186803b158015611d1d57600080fd5b505afa158015611d31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d559190612815565b6020015168056bc75e2d6310000090612179565b81611d7057fe5b04905090565b6005818154811061163d57fe5b611d8b612575565b611d9484611362565b6000858152600660209081526040808320338452909152812082518154939450909264e8d4a5100091611dd091906001600160801b0316612179565b81611dd757fe5b0490506000611df66108d48460010154846121b690919063ffffffff16565b9050611e3164e8d4a51000611e2186600001516001600160801b03168961217990919063ffffffff16565b81611e2857fe5b849190046121b6565b60018401558254611e429087612203565b8355611e786001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168683612226565b600060058881548110611e8757fe5b6000918252602090912001546001600160a01b031690508015611f0c5783546040516345fb1ba160e11b81526001600160a01b03831691638bf6374291611ed9918c9133918c91899190600401612ef2565b600060405180830381600087803b158015611ef357600080fd5b505af1158015611f07573d6000803e3d6000fd5b505050505b611f1e868860048b815481106107a957fe5b856001600160a01b031688336001600160a01b03167f8166bf25f8a2b7ed3c85049207da4358d16edbed977d23fa2ee6f0dde3ec21328a604051611f629190612ee9565b60405180910390a487336001600160a01b03167f71bab65ced2e5750775a0613be067df48ef06cf92a496ebf7663ae066092495484604051611fa49190612ee9565b60405180910390a35050505050505050565b606080836001600160401b0381118015611fcf57600080fd5b50604051908082528060200260200182016040528015611ff9578160200160208202803683370190505b509150836001600160401b038111801561201257600080fd5b5060405190808252806020026020018201604052801561204657816020015b60608152602001906001900390816120315790505b50905060005b8481101561213d57600060603088888581811061206557fe5b90506020028101906120779190612f69565b60405161208592919061299e565b600060405180830381855af49150503d80600081146120c0576040519150601f19603f3d011682016040523d82523d6000602084013e6120c5565b606091505b509150915081806120d4575085155b6120dd82612515565b906120fb5760405162461bcd60e51b81526004016105be9190612af6565b508185848151811061210957fe5b6020026020010190151590811515815250508084848151811061212857fe5b6020908102919091010152505060010161204c565b50935093915050565b6001546001600160a01b031681565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008115806121945750508082028282828161219157fe5b04145b6121b05760405162461bcd60e51b81526004016105be90612e4f565b92915050565b60008183038183128015906121cb5750838113155b806121e057506000831280156121e057508381135b6121fc5760405162461bcd60e51b81526004016105be90612dd6565b9392505050565b808203828111156121b05760405162461bcd60e51b81526004016105be90612b09565b60006060846001600160a01b031663a9059cbb858560405160240161224c929190612a43565b6040516020818303038152906040529060e01b6020820180516001600160e01b03838183161783525050505060405161228591906129ae565b6000604051808303816000865af19150503d80600081146122c2576040519150601f19603f3d011682016040523d82523d6000602084013e6122c7565b606091505b50915091508180156122f15750805115806122f15750808060200190518101906122f191906126af565b61230d5760405162461bcd60e51b81526004016105be90612ba0565b5050505050565b6000808212156123365760405162461bcd60e51b81526004016105be90612b38565b5090565b818101818110156121b05760405162461bcd60e51b81526004016105be90612cc7565b60006060856001600160a01b03166323b872dd868686604051602401612385939291906129de565b6040516020818303038152906040529060e01b6020820180516001600160e01b0383818316178352505050506040516123be91906129ae565b6000604051808303816000865af19150503d80600081146123fb576040519150601f19603f3d011682016040523d82523d6000602084013e612400565b606091505b509150915081801561242a57508051158061242a57508080602001905181019061242a91906126af565b6124465760405162461bcd60e51b81526004016105be90612e1a565b505050505050565b60006001600160801b038211156123365760405162461bcd60e51b81526004016105be90612c90565b8181016001600160801b0380831690821610156121b05760405162461bcd60e51b81526004016105be90612cc7565b60006001600160401b038211156123365760405162461bcd60e51b81526004016105be90612d68565b60008282018183128015906124e45750838112155b806124f957506000831280156124f957508381125b6121fc5760405162461bcd60e51b81526004016105be90612bd7565b606060448251101561255b575060408051808201909152601d81527f5472616e73616374696f6e2072657665727465642073696c656e746c7900000060208201526115d7565b600482019150818060200190518101906121b0919061278a565b604080516060810182526000808252602082018190529181019190915290565b60008083601f8401126125a6578182fd5b5081356001600160401b038111156125bc578182fd5b60208301915083602080830285010111156125d657600080fd5b9250929050565b6000806000606084860312156125f1578283fd5b83356125fc81612fff565b9250602084013561260c81613017565b9150604084013561261c81613017565b809150509250925092565b60008060006040848603121561263b578283fd5b83356001600160401b03811115612650578384fd5b61265c86828701612595565b909450925050602084013561261c81613017565b60008060208385031215612682578182fd5b82356001600160401b03811115612697578283fd5b6126a385828601612595565b90969095509350505050565b6000602082840312156126c0578081fd5b81516121fc81613017565b6000602082840312156126dc578081fd5b81356121fc81612fff565b6000602082840312156126f8578081fd5b81516121fc81612fff565b600080600080600080600080610100898b03121561271f578384fd5b883561272a81612fff565b9750602089013561273a81612fff565b9650604089013561274a81612fff565b9550606089013594506080890135935060a089013560ff8116811461276d578384fd5b979a969950949793969295929450505060c08201359160e0013590565b60006020828403121561279b578081fd5b81516001600160401b03808211156127b1578283fd5b818401915084601f8301126127c4578283fd5b8151818111156127d2578384fd5b6127e5601f8201601f1916602001612fad565b91508082528560208285010111156127fb578384fd5b61280c816020840160208601612fd3565b50949350505050565b600060808284031215612826578081fd5b6128306080612fad565b825161283b81612fff565b808252506020830151602082015260408301516040820152606083015160608201528091505092915050565b600060208284031215612878578081fd5b5035919050565b600060208284031215612890578081fd5b5051919050565b600080604083850312156128a9578182fd5b8235915060208301356128bb81612fff565b809150509250929050565b6000806000606084860312156128da578081fd5b8335925060208401356128ec81612fff565b9150604084013561261c81612fff565b600080600060608486031215612910578081fd5b8335925060208401359150604084013561261c81612fff565b6000806000806080858703121561293e578182fd5b8435935060208501359250604085013561295781612fff565b9150606085013561296781613017565b939692955090935050565b6000815180845261298a816020860160208601612fd3565b601f01601f19169290920160200192915050565b6000828483379101908152919050565b600082516129c0818460208701612fd3565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b6001600160a01b03929092168252602082015260400190565b604080825283519082018190526000906020906060840190828701845b82811015612a97578151151584529284019290840190600101612a79565b50505083810382850152808551612aae8184612ee9565b91508192508381028201848801865b83811015612ae7578583038552612ad5838351612972565b94870194925090860190600101612abd565b50909998505050505050505050565b6000602082526121fc6020830184612972565b602080825260159082015274426f72696e674d6174683a20556e646572666c6f7760581b604082015260600190565b6020808252600b908201526a0496e7465676572203c20360ac1b604082015260600190565b60208082526023908201527f4d61737465724368656656323a2042616c616e6365206d75737420657863656560408201526206420360ec1b606082015260800190565b6020808252601c908201527f426f72696e6745524332303a205472616e73666572206661696c656400000000604082015260600190565b60208082526021908201527f5369676e6564536166654d6174683a206164646974696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252601590820152744f776e61626c653a207a65726f206164647265737360581b604082015260600190565b60208082526029908201527f4d61737465724368656656323a206d696772617465642062616c616e6365206d6040820152680eae6e840dac2e8c6d60bb1b606082015260800190565b6020808252601c908201527f426f72696e674d6174683a2075696e74313238204f766572666c6f7700000000604082015260600190565b60208082526018908201527f426f72696e674d6174683a20416464204f766572666c6f770000000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c657220213d2070656e64696e67206f776e6572604082015260600190565b6020808252601b908201527f426f72696e674d6174683a2075696e743634204f766572666c6f770000000000604082015260600190565b6020808252601d908201527f4d61737465724368656656323a206e6f206d69677261746f7220736574000000604082015260600190565b60208082526024908201527f5369676e6564536166654d6174683a207375627472616374696f6e206f766572604082015263666c6f7760e01b606082015260800190565b6020808252818101527f426f72696e6745524332303a205472616e7366657246726f6d206661696c6564604082015260600190565b60208082526018908201527f426f72696e674d6174683a204d756c204f766572666c6f770000000000000000604082015260600190565b81516001600160801b031681526020808301516001600160401b0390811691830191909152604092830151169181019190915260600190565b6001600160801b039390931683526001600160401b03918216602084015216604082015260600190565b90815260200190565b9485526001600160a01b0393841660208601529190921660408401526060830191909152608082015260a00190565b9182521515602082015260400190565b918252602082015260400190565b6001600160401b0393909316835260208301919091526001600160801b0316604082015260600190565b6000808335601e19843603018112612f7f578283fd5b8301803591506001600160401b03821115612f98578283fd5b6020019150368190038213156125d657600080fd5b6040518181016001600160401b0381118282101715612fcb57600080fd5b604052919050565b60005b83811015612fee578181015183820152602001612fd6565b8381111561135c5750506000910152565b6001600160a01b038116811461301457600080fd5b50565b801515811461301457600080fdfea2646970667358221220814e5dfdee606b9ff8357a8c99c275bc5bee65fd89e04f2e557682da8ccc9f4264736f6c634300060c0033", + "linkReferences": {}, + "deployedLinkReferences": {} + }, + "MasterChefV2.dbg": { + "_format": "hh-sol-dbg-1", + "buildInfo": "../../build-info/b78e6e91d6666dbbf407d4a383cd8177.json" + }, + "IMigratorChef": { + "_format": "hh-sol-artifact-1", + "contractName": "IMigratorChef", + "sourceName": "contracts/MasterChefV2.sol", + "abi": [], + "bytecode": "0x", + "deployedBytecode": "0x", + "linkReferences": {}, + "deployedLinkReferences": {} + }, + "IMigratorChef.dbg": { + "_format": "hh-sol-dbg-1", + "buildInfo": "../../build-info/b78e6e91d6666dbbf407d4a383cd8177.json" + } +} From d0c7e9736e4f7ca0cecdb1f973fcab8971d561da Mon Sep 17 00:00:00 2001 From: Nuradil Date: Fri, 30 Apr 2021 13:59:44 +0600 Subject: [PATCH 33/41] Fix sourcePaths data format --- mythx_cli/fuzz/ide/hardhat.py | 2 +- mythx_cli/fuzz/run.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/mythx_cli/fuzz/ide/hardhat.py b/mythx_cli/fuzz/ide/hardhat.py index d5b3b7e..ea000c6 100644 --- a/mythx_cli/fuzz/ide/hardhat.py +++ b/mythx_cli/fuzz/ide/hardhat.py @@ -62,7 +62,7 @@ def fetch_data(self): continue result_contracts[relative_file_path] += [ { - "sourcePaths": list(build_info["output"]["contracts"].keys()), + "sourcePaths": {i: k for i, k in enumerate(build_info["output"]["contracts"].keys())}, "deployedSourceMap": data["evm"]["deployedBytecode"]["sourceMap"], "deployedBytecode": data["evm"]["deployedBytecode"]["object"], "sourceMap": data["evm"]["bytecode"]["sourceMap"], diff --git a/mythx_cli/fuzz/run.py b/mythx_cli/fuzz/run.py index fd4045c..2f80ee4 100644 --- a/mythx_cli/fuzz/run.py +++ b/mythx_cli/fuzz/run.py @@ -9,6 +9,7 @@ from enum import Enum from pathlib import Path import os +import traceback LOGGER = logging.getLogger("mythx-cli") @@ -171,7 +172,7 @@ def fuzz_run(ctx, address, more_addresses, target): "You can view campaign here: " + faas_url + "/campaigns/" + str(campaign_id) ) except Exception as e: - LOGGER.warning(f"Could not submit campaign to the FaaS") + LOGGER.warning(f"Could not submit campaign to the FaaS\n{traceback.format_exc()}") raise click.exceptions.UsageError( f"Unable to submit the campaign to the faas. Are you sure the service is running on {faas_url} ?" ) From 9182bca9ed20cb9a16c018fc473558e01f2d3c0a Mon Sep 17 00:00:00 2001 From: Nuradil Date: Tue, 4 May 2021 22:58:02 +0600 Subject: [PATCH 34/41] Add corpus target parameter to fuzzing --- mythx_cli/fuzz/faas.py | 2 - mythx_cli/fuzz/ide/brownie.py | 8 +- mythx_cli/fuzz/ide/hardhat.py | 38 +++++++--- mythx_cli/fuzz/rpc.py | 29 ++++---- mythx_cli/fuzz/run.py | 83 ++++++++++++--------- tests/test_fuzz_brownie.py | 92 +++++++++++------------ tests/test_fuzz_hardhat.py | 135 +++++++++++++++++++++++----------- 7 files changed, 228 insertions(+), 159 deletions(-) diff --git a/mythx_cli/fuzz/faas.py b/mythx_cli/fuzz/faas.py index 1a4ebaa..d821bdc 100644 --- a/mythx_cli/fuzz/faas.py +++ b/mythx_cli/fuzz/faas.py @@ -1,9 +1,7 @@ -import json import logging import random import string -import click import requests from mythx_cli.analyze.scribble import ScribbleMixin diff --git a/mythx_cli/fuzz/ide/brownie.py b/mythx_cli/fuzz/ide/brownie.py index 91939d2..1dc60c7 100644 --- a/mythx_cli/fuzz/ide/brownie.py +++ b/mythx_cli/fuzz/ide/brownie.py @@ -1,15 +1,9 @@ import json import logging -import os from pathlib import Path from typing import Dict, List -from mythx_cli.fuzz.exceptions import ( - BrownieError, - BuildArtifactsError, - PayloadError, - SourceError, -) +from mythx_cli.fuzz.exceptions import BuildArtifactsError from mythx_cli.fuzz.ide.generic import IDEArtifacts, JobBuilder from ...util import sol_files_by_directory diff --git a/mythx_cli/fuzz/ide/hardhat.py b/mythx_cli/fuzz/ide/hardhat.py index ea000c6..033d4fd 100644 --- a/mythx_cli/fuzz/ide/hardhat.py +++ b/mythx_cli/fuzz/ide/hardhat.py @@ -1,11 +1,12 @@ import json +from os.path import commonpath, relpath +from pathlib import Path +from typing import List +from mythx_cli.fuzz.exceptions import BuildArtifactsError from mythx_cli.fuzz.ide.generic import IDEArtifacts, JobBuilder -from typing import List + from ...util import sol_files_by_directory -from pathlib import Path -from mythx_cli.fuzz.exceptions import BuildArtifactsError -from os.path import commonpath, relpath class HardhatArtifacts(IDEArtifacts): @@ -17,7 +18,7 @@ def __init__(self, build_dir=None, targets=None): include.extend(sol_files_by_directory(target)) self._include = include - self._build_dir = Path(build_dir) or Path("./artifacts") + self._build_dir = Path(build_dir).absolute() or Path("./artifacts").absolute() self._contracts, self._sources = self.fetch_data() @property @@ -40,8 +41,12 @@ def fetch_data(self): continue file_name = Path(file_path).stem - file_artifact_path: Path = self._build_dir.joinpath(relative_file_path).joinpath(f"{file_name}.json") - file_debug_path: Path = self._build_dir.joinpath(relative_file_path).joinpath(f"{file_name}.dbg.json") + file_artifact_path: Path = self._build_dir.joinpath( + relative_file_path + ).joinpath(f"{file_name}.json") + file_debug_path: Path = self._build_dir.joinpath( + relative_file_path + ).joinpath(f"{file_name}.dbg.json") if not file_artifact_path.exists() or not file_debug_path.exists(): raise BuildArtifactsError("Could not find target artifacts") @@ -50,7 +55,9 @@ def fetch_data(self): with file_debug_path.open("r") as file: file_debug_artifact = json.load(file) build_info_name = Path(file_debug_artifact["buildInfo"]).name - with self._build_dir.joinpath(f"build-info/{build_info_name}").open("r") as file: + with self._build_dir.joinpath(f"build-info/{build_info_name}").open( + "r" + ) as file: build_info = json.load(file) result_contracts[relative_file_path] = [] @@ -62,8 +69,15 @@ def fetch_data(self): continue result_contracts[relative_file_path] += [ { - "sourcePaths": {i: k for i, k in enumerate(build_info["output"]["contracts"].keys())}, - "deployedSourceMap": data["evm"]["deployedBytecode"]["sourceMap"], + "sourcePaths": { + i: k + for i, k in enumerate( + build_info["output"]["contracts"].keys() + ) + }, + "deployedSourceMap": data["evm"]["deployedBytecode"][ + "sourceMap" + ], "deployedBytecode": data["evm"]["deployedBytecode"]["object"], "sourceMap": data["evm"]["bytecode"]["sourceMap"], "bytecode": data["evm"]["bytecode"]["object"], @@ -78,7 +92,9 @@ def fetch_data(self): result_sources[source_file_dep] = { "fileIndex": data["id"], - "source": build_info["input"]["sources"][source_file_dep]["content"], + "source": build_info["input"]["sources"][source_file_dep][ + "content" + ], "ast": data["ast"], } diff --git a/mythx_cli/fuzz/rpc.py b/mythx_cli/fuzz/rpc.py index 098c786..ee76b5d 100644 --- a/mythx_cli/fuzz/rpc.py +++ b/mythx_cli/fuzz/rpc.py @@ -1,7 +1,5 @@ -import json import logging -import os -from pathlib import Path +from typing import Optional import click import requests @@ -78,8 +76,20 @@ def get_all_blocks(self): blocks.append(self.get_block(block_number=i)) return blocks - def get_seed_state(self, address: str, other_addresses: [str]): + def get_seed_state( + self, address: str, other_addresses: [str], corpus_target: Optional[str] = None + ): + seed_state = { + "time-limit-secs": time_limit_seconds, + "discovery-probability-threshold": 0.0, + "assertion-checking-mode": 1, + "emit-mythx-report": True, + "num-cores": self.number_of_cores, + } """Get a seed state for the target contract to be used by Harvey""" + if corpus_target: + return dict({**seed_state, "analysis-setup": {"target": corpus_target}}) + try: blocks = self.get_all_blocks() processed_transactions = [] @@ -96,16 +106,7 @@ def get_seed_state(self, address: str, other_addresses: [str]): "other-addresses-under-test": other_addresses, } ) - return dict( - { - "time-limit-secs": time_limit_seconds, - "analysis-setup": setup, - "discovery-probability-threshold": 0.0, - "assertion-checking-mode": 1, - "emit-mythx-report": True, - "num-cores": self.number_of_cores, - } - ) + return dict({**seed_state, "analysis-setup": setup}) except Exception as e: LOGGER.warning(f"Could not generate seed state for address: {address}") raise click.exceptions.UsageError( diff --git a/mythx_cli/fuzz/run.py b/mythx_cli/fuzz/run.py index 2f80ee4..d4cc540 100644 --- a/mythx_cli/fuzz/run.py +++ b/mythx_cli/fuzz/run.py @@ -1,15 +1,17 @@ import logging +import os +import traceback +from enum import Enum +from pathlib import Path + import click from mythx_cli.fuzz.ide.brownie import BrownieJob from mythx_cli.fuzz.ide.hardhat import HardhatJob + from .exceptions import RPCCallError from .faas import FaasClient from .rpc import RPCClient -from enum import Enum -from pathlib import Path -import os -import traceback LOGGER = logging.getLogger("mythx-cli") @@ -19,22 +21,22 @@ class IDE(Enum): - BROWNIE = 'brownie' - HARDHAT = 'hardhat' - TRUFFLE = 'truffle' - SOLIDITY = 'solidity' + BROWNIE = "brownie" + HARDHAT = "hardhat" + TRUFFLE = "truffle" + SOLIDITY = "solidity" -def determine_ide(build_directory) -> IDE: - root_dir = Path(build_directory).parent +def determine_ide() -> IDE: + root_dir = Path.cwd().absolute() files = list(os.walk(root_dir))[0][2] - if 'brownie-config.yaml' in files: + if "brownie-config.yaml" in files: return IDE.BROWNIE - if 'hardhat.config.ts' in files: + if "hardhat.config.ts" in files: return IDE.HARDHAT - if 'hardhat.config.js' in files: + if "hardhat.config.js" in files: return IDE.HARDHAT - if 'truffle-config.js' in files: + if "truffle-config.js" in files: return IDE.TRUFFLE return IDE.SOLIDITY @@ -50,8 +52,17 @@ def determine_ide(build_directory) -> IDE: type=click.STRING, help="Addresses of other contracts to analyze, separated by commas", ) +@click.option( + "-c", + "--corpus-target", + type=click.STRING, + help="Project UUID, Campaign UUID or Corpus UUID to reuse the corpus from. " + "In case of a project, corpus from the project's latest submitted campaign will be used", + default=None, + required=False, +) @click.pass_obj -def fuzz_run(ctx, address, more_addresses, target): +def fuzz_run(ctx, address, more_addresses, target, corpus_target): # read YAML config params from ctx dict, e.g. ganache rpc url # Introduce a separate `fuzz` section in the YAML file @@ -122,27 +133,30 @@ def fuzz_run(ctx, address, more_addresses, target): else default_config["campaign_name_prefix"] ) - try: - rpc_client = RPCClient(rpc_url, number_of_cores) - contract_code_response = rpc_client.contract_exists(contract_address) - except RPCCallError as e: - raise click.exceptions.UsageError(f"RPC endpoint." f"\n{e}") - - if not contract_code_response: - LOGGER.warning(f"Contract code not found") - raise click.exceptions.ClickException( - f"Unable to find a contract deployed at {contract_address}." - ) - if more_addresses is None: other_addresses = [] else: other_addresses = more_addresses.split(",") - # We get the seed state from the provided rpc endpoint - seed_state = rpc_client.get_seed_state(contract_address, other_addresses) + _corpus_target = corpus_target or analyze_config.get("corpus_target", None) + + rpc_client = RPCClient(rpc_url, number_of_cores) + if not _corpus_target: + try: + contract_code_response = rpc_client.contract_exists(contract_address) + except RPCCallError as e: + raise click.exceptions.UsageError(f"RPC endpoint." f"\n{e}") + + if not contract_code_response: + LOGGER.warning(f"Contract code not found") + raise click.exceptions.ClickException( + f"Unable to find a contract deployed at {contract_address}." + ) + seed_state = rpc_client.get_seed_state( + contract_address, other_addresses, _corpus_target + ) - ide = determine_ide(analyze_config["build_directory"]) + ide = determine_ide() if ide == IDE.BROWNIE: artifacts = BrownieJob(target, analyze_config["build_directory"]) @@ -160,9 +174,7 @@ def fuzz_run(ctx, address, more_addresses, target): ) faas_client = FaasClient( - faas_url=faas_url, - campaign_name_prefix=campaign_name_prefix, - project_type=ide, + faas_url=faas_url, campaign_name_prefix=campaign_name_prefix, project_type=ide ) try: campaign_id = faas_client.create_faas_campaign( @@ -172,8 +184,9 @@ def fuzz_run(ctx, address, more_addresses, target): "You can view campaign here: " + faas_url + "/campaigns/" + str(campaign_id) ) except Exception as e: - LOGGER.warning(f"Could not submit campaign to the FaaS\n{traceback.format_exc()}") + LOGGER.warning( + f"Could not submit campaign to the FaaS\n{traceback.format_exc()}" + ) raise click.exceptions.UsageError( f"Unable to submit the campaign to the faas. Are you sure the service is running on {faas_url} ?" ) - diff --git a/tests/test_fuzz_brownie.py b/tests/test_fuzz_brownie.py index 87d33dd..66d74b6 100644 --- a/tests/test_fuzz_brownie.py +++ b/tests/test_fuzz_brownie.py @@ -1,5 +1,6 @@ import json import os +from pathlib import Path from unittest.mock import patch import pytest @@ -19,28 +20,33 @@ FAAS_URL = "http://localhost:9899" -def setup_brownie_project(base_path, switch_dir=False): +@pytest.fixture() +def brownie_project(tmp_path, switch_dir=False): # switch to temp dir if requested if switch_dir: - os.chdir(str(base_path)) + os.chdir(str(tmp_path)) # add brownie project structure - os.makedirs(str(base_path / "build/contracts/")) - os.makedirs(str(base_path / "contracts/")) + os.makedirs(str(tmp_path / "build/contracts/")) + os.makedirs(str(tmp_path / "contracts/")) - with open(base_path / "brownie-config.yaml", "w+") as config_f: + with open("./brownie-config.yaml", "w+") as config_f: json.dump("sample", config_f) # patch brownie artifact with temp path - BROWNIE_ARTIFACT["allSourcePaths"][0] = f"{base_path}/contracts/sample.sol" - BROWNIE_ARTIFACT["sourcePath"] = f"{base_path}/contracts/sample.sol" + BROWNIE_ARTIFACT["allSourcePaths"][0] = f"{tmp_path}/contracts/sample.sol" + BROWNIE_ARTIFACT["sourcePath"] = f"{tmp_path}/contracts/sample.sol" # add sample brownie artifact - with open(base_path / "build/contracts/Foo.json", "w+") as artifact_f: + with open(tmp_path / "build/contracts/Foo.json", "w+") as artifact_f: json.dump(BROWNIE_ARTIFACT, artifact_f) - with open(base_path / "contracts/sample.sol", "w+") as sol_f: + with open(tmp_path / "contracts/sample.sol", "w+") as sol_f: sol_f.write("sol code here") + yield None + # cleaning up test files + os.remove(str(Path("./brownie-config.yaml").absolute())) + def generate_config_file(base_path="", not_include=[]): config_file = "fuzz:" @@ -95,9 +101,7 @@ def test_fuzz_no_target(tmp_path): assert result.exit_code != 0 -def test_fuzz_no_contract_at_address(tmp_path): - setup_brownie_project(tmp_path, switch_dir=False) - +def test_fuzz_no_contract_at_address(tmp_path, brownie_project): with open(".mythx.yml", "w+") as conf_f: conf_f.write(generate_config_file(base_path=tmp_path)) @@ -118,8 +122,7 @@ def test_fuzz_no_contract_at_address(tmp_path): assert result.exit_code != 0 -def test_faas_not_running(tmp_path): - setup_brownie_project(tmp_path, switch_dir=False) +def test_faas_not_running(tmp_path, brownie_project): with open(".mythx.yml", "w+") as conf_f: conf_f.write(generate_config_file(base_path=tmp_path)) @@ -149,13 +152,11 @@ def test_faas_not_running(tmp_path): assert result.exit_code != 0 -def test_faas_target_config_file(tmp_path): +def test_faas_target_config_file(tmp_path, brownie_project): """Here we reuse the test_faas_not_running logic to check that the target is being read from the config file. This is possible because the faas not running error is triggered after the Target check. If the target was not available, a different error would be thrown and the test would fail""" - setup_brownie_project(tmp_path, switch_dir=False) - with open(".mythx.yml", "w+") as conf_f: conf_f.write(generate_config_file(base_path=tmp_path)) @@ -199,30 +200,7 @@ def test_rpc_not_running(tmp_path): assert result.exit_code != 0 -@pytest.mark.parametrize( - "keyword", - ( - "parameters", - "name", - "corpus", - "sources", - "contracts", - "address-under-test", - "source", - "fileIndex", - "sourcePaths", - "deployedSourceMap", - "mainSourceFile", - "contractName", - "bytecode", - "deployedBytecode", - "sourceMap", - "deployedSourceMap", - ), -) -def test_fuzz_run(tmp_path, keyword): - setup_brownie_project(tmp_path, switch_dir=False) - +def test_fuzz_run(tmp_path, brownie_project): with open(".mythx.yml", "w+") as conf_f: conf_f.write(generate_config_file(base_path=tmp_path)) @@ -256,7 +234,29 @@ def test_fuzz_run(tmp_path, keyword): ) request_payload = json.dumps(called_with[0]) - assert keyword in request_payload + + keywords = [ + "parameters", + "name", + "corpus", + "sources", + "contracts", + "address-under-test", + "source", + "fileIndex", + "sourcePaths", + "deployedSourceMap", + "mainSourceFile", + "contractName", + "bytecode", + "deployedBytecode", + "sourceMap", + "deployedSourceMap", + ] + + for keyword in keywords: + assert keyword in request_payload + assert result.exit_code == 0 @@ -270,9 +270,7 @@ def test_fuzz_subcommands_present(keyword): @patch("mythx_cli.analyze.scribble.ScribbleMixin.instrument_solc_in_place") -def test_fuzz_arm(mock, tmp_path): - setup_brownie_project(tmp_path, switch_dir=False) - +def test_fuzz_arm(mock, tmp_path, brownie_project): runner = CliRunner() result = runner.invoke(cli, ["fuzz", "arm", f"{tmp_path}/contracts/sample.sol"]) @@ -287,9 +285,7 @@ def test_fuzz_arm(mock, tmp_path): @patch("mythx_cli.analyze.scribble.ScribbleMixin.disarm_solc_in_place") -def test_fuzz_disarm(mock, tmp_path): - setup_brownie_project(tmp_path, switch_dir=False) - +def test_fuzz_disarm(mock, tmp_path, brownie_project): runner = CliRunner() result = runner.invoke(cli, ["fuzz", "disarm", f"{tmp_path}/contracts/sample.sol"]) diff --git a/tests/test_fuzz_hardhat.py b/tests/test_fuzz_hardhat.py index 551547d..d61c835 100644 --- a/tests/test_fuzz_hardhat.py +++ b/tests/test_fuzz_hardhat.py @@ -1,5 +1,6 @@ import json import os +from pathlib import Path from unittest.mock import patch import pytest @@ -20,33 +21,42 @@ FAAS_URL = "http://localhost:9899" -def setup_hardhat_project(base_path, switch_dir=False): +@pytest.fixture() +def hardhat_project(tmp_path, switch_dir=False): # switch to temp dir if requested if switch_dir: - os.chdir(str(base_path)) + os.chdir(str(tmp_path)) # add hardhat project structure - os.makedirs(str(base_path / "artifacts/contracts/MasterChefV2.sol/")) - os.makedirs(str(base_path / "artifacts/build-info/")) - os.makedirs(str(base_path / "contracts")) + os.makedirs(str(tmp_path / "artifacts/contracts/MasterChefV2.sol/")) + os.makedirs(str(tmp_path / "artifacts/build-info/")) + os.makedirs(str(tmp_path / "contracts")) # add sample brownie artifact - with open(base_path / "artifacts/build-info/b78e6e91d6666dbbf407d4a383cd8177.json", "w+") as artifact_f: + with open( + tmp_path / "artifacts/build-info/b78e6e91d6666dbbf407d4a383cd8177.json", "w+" + ) as artifact_f: json.dump(HARDHAT_BUILD_INFO_ARTIFACT, artifact_f) - with open(base_path / "hardhat.config.ts", "w+") as config_f: + with open("./hardhat.config.ts", "w+") as config_f: json.dump("sample", config_f) for filename, content in HARDHAT_ARTIFACT.items(): - with open(base_path / f"artifacts/contracts/MasterChefV2.sol/{filename}.json", "w+") as sol_f: + with open( + tmp_path / f"artifacts/contracts/MasterChefV2.sol/{filename}.json", "w+" + ) as sol_f: json.dump(content, sol_f) - with open(base_path / "contracts/MasterChefV2.sol", "w+") as sol_f: + with open(tmp_path / "contracts/MasterChefV2.sol", "w+") as sol_f: sol_f.write("sol code here") - with open(base_path / "contracts/sample.sol", "w+") as sol_f: + with open(tmp_path / "contracts/sample.sol", "w+") as sol_f: sol_f.write("sol code here") + yield None + + os.remove(Path("./hardhat.config.ts").absolute()) + def generate_config_file(base_path="", not_include=[]): config_file = "fuzz:" @@ -101,9 +111,7 @@ def test_fuzz_no_target(tmp_path): assert result.exit_code != 0 -def test_fuzz_no_contract_at_address(tmp_path): - setup_hardhat_project(tmp_path, switch_dir=False) - +def test_fuzz_no_contract_at_address(tmp_path, hardhat_project): with open(".mythx.yml", "w+") as conf_f: conf_f.write(generate_config_file(base_path=tmp_path)) @@ -124,9 +132,7 @@ def test_fuzz_no_contract_at_address(tmp_path): assert result.exit_code != 0 -def test_faas_not_running(tmp_path): - setup_hardhat_project(tmp_path, switch_dir=False) - +def test_faas_not_running(tmp_path, hardhat_project): with open(".mythx.yml", "w+") as conf_f: conf_f.write(generate_config_file(base_path=tmp_path)) @@ -146,7 +152,9 @@ def test_faas_not_running(tmp_path): ) runner = CliRunner() - result = runner.invoke(cli, ["fuzz", "run", f"{tmp_path}/contracts/MasterChefV2.sol"]) + result = runner.invoke( + cli, ["fuzz", "run", f"{tmp_path}/contracts/MasterChefV2.sol"] + ) assert ( "Error: Unable to submit the campaign to the faas. Are you sure the service is running on" @@ -155,13 +163,11 @@ def test_faas_not_running(tmp_path): assert result.exit_code != 0 -def test_faas_target_config_file(tmp_path): +def test_faas_target_config_file(tmp_path, hardhat_project): """Here we reuse the test_faas_not_running logic to check that the target is being read from the config file. This is possible because the faas not running error is triggered after the Target check. If the target was not available, a different error would be thrown and the test would fail""" - setup_hardhat_project(tmp_path, switch_dir=False) - with open(".mythx.yml", "w+") as conf_f: conf_f.write(generate_config_file(base_path=tmp_path)) @@ -199,15 +205,52 @@ def test_rpc_not_running(tmp_path): requests_mock.side_effect = RequestException() runner = CliRunner() - result = runner.invoke(cli, ["fuzz", "run", f"{tmp_path}/contracts/MasterChefV2.sol"]) + result = runner.invoke( + cli, ["fuzz", "run", f"{tmp_path}/contracts/MasterChefV2.sol"] + ) assert "HTTP error calling RPC method eth_getCode with parameters" in result.output assert result.exit_code != 0 -@pytest.mark.parametrize( - "keyword", - ( +def test_fuzz_run(tmp_path, hardhat_project): + with open(".mythx.yml", "w+") as conf_f: + conf_f.write(generate_config_file(base_path=tmp_path)) + + with patch.object( + RPCClient, "contract_exists" + ) as contract_exists_mock, patch.object( + RPCClient, "get_all_blocks" + ) as get_all_blocks_mock, patch.object( + FaasClient, "start_faas_campaign" + ) as start_faas_campaign_mock: + get_all_blocks_mock.return_value = get_test_case( + "testdata/ganache-all-blocks.json" + ) + contract_exists_mock.return_value = True + campaign_id = "560ba03a-8744-4da6-aeaa-a62568ccbf44" + start_faas_campaign_mock.return_value = campaign_id + + runner = CliRunner() + result = runner.invoke( + cli, ["fuzz", "run", f"{tmp_path}/contracts/MasterChefV2.sol"] + ) + + contract_exists_mock.assert_called_with( + "0x7277646075fa72737e1F6114654C5d9949a67dF2" + ) + contract_exists_mock.assert_called_once() + get_all_blocks_mock.assert_called_once() + start_faas_campaign_mock.assert_called_once() + called_with = start_faas_campaign_mock.call_args + assert ( + f"You can view campaign here: {FAAS_URL}/campaigns/{campaign_id}" + in result.output + ) + + request_payload = json.dumps(called_with[0]) + + keywords = [ "parameters", "name", "corpus", @@ -224,11 +267,15 @@ def test_rpc_not_running(tmp_path): "deployedBytecode", "sourceMap", "deployedSourceMap", - ), -) -def test_fuzz_run(tmp_path, keyword): - setup_hardhat_project(tmp_path, switch_dir=False) + ] + + for keyword in keywords: + assert keyword in request_payload + assert result.exit_code == 0 + + +def test_fuzz_run_corpus_target(tmp_path, hardhat_project): with open(".mythx.yml", "w+") as conf_f: conf_f.write(generate_config_file(base_path=tmp_path)) @@ -247,13 +294,19 @@ def test_fuzz_run(tmp_path, keyword): start_faas_campaign_mock.return_value = campaign_id runner = CliRunner() - result = runner.invoke(cli, ["fuzz", "run", f"{tmp_path}/contracts/MasterChefV2.sol"]) + result = runner.invoke( + cli, + [ + "fuzz", + "run", + f"{tmp_path}/contracts/MasterChefV2.sol", + "-c", + "prj_639cffb2a3e0407fbe2c701caaf5ab33", + ], + ) - contract_exists_mock.assert_called_with( - "0x7277646075fa72737e1F6114654C5d9949a67dF2" - ) - contract_exists_mock.assert_called_once() - get_all_blocks_mock.assert_called_once() + contract_exists_mock.assert_not_called() + get_all_blocks_mock.assert_not_called() start_faas_campaign_mock.assert_called_once() called_with = start_faas_campaign_mock.call_args assert ( @@ -261,8 +314,10 @@ def test_fuzz_run(tmp_path, keyword): in result.output ) - request_payload = json.dumps(called_with[0]) - assert keyword in request_payload + assert called_with[0][0]["corpus"] == { + "target": "prj_639cffb2a3e0407fbe2c701caaf5ab33" + } + assert result.exit_code == 0 @@ -276,9 +331,7 @@ def test_fuzz_subcommands_present(keyword): @patch("mythx_cli.analyze.scribble.ScribbleMixin.instrument_solc_in_place") -def test_fuzz_arm(mock, tmp_path): - setup_hardhat_project(tmp_path, switch_dir=False) - +def test_fuzz_arm(mock, tmp_path, hardhat_project): runner = CliRunner() result = runner.invoke(cli, ["fuzz", "arm", f"{tmp_path}/contracts/sample.sol"]) @@ -293,9 +346,7 @@ def test_fuzz_arm(mock, tmp_path): @patch("mythx_cli.analyze.scribble.ScribbleMixin.disarm_solc_in_place") -def test_fuzz_disarm(mock, tmp_path): - setup_hardhat_project(tmp_path, switch_dir=False) - +def test_fuzz_disarm(mock, tmp_path, hardhat_project): runner = CliRunner() result = runner.invoke(cli, ["fuzz", "disarm", f"{tmp_path}/contracts/sample.sol"]) From 83f30fdf6c5bd155399c07478deb1a9cc3a1ba61 Mon Sep 17 00:00:00 2001 From: Nuradil Date: Thu, 13 May 2021 19:41:57 +0600 Subject: [PATCH 35/41] Fix errors output --- mythx_cli/fuzz/exceptions.py | 3 ++- mythx_cli/fuzz/faas.py | 5 ++++- mythx_cli/fuzz/run.py | 6 +++++- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/mythx_cli/fuzz/exceptions.py b/mythx_cli/fuzz/exceptions.py index 8679aa3..d50be52 100644 --- a/mythx_cli/fuzz/exceptions.py +++ b/mythx_cli/fuzz/exceptions.py @@ -6,8 +6,9 @@ class FaaSError(Exception): """Base class for FaaS module exceptions""" - def __init__(self, message): + def __init__(self, message, detail=None): self.message = message + self.detail = detail pass diff --git a/mythx_cli/fuzz/faas.py b/mythx_cli/fuzz/faas.py index d821bdc..d7ab516 100644 --- a/mythx_cli/fuzz/faas.py +++ b/mythx_cli/fuzz/faas.py @@ -45,10 +45,13 @@ def start_faas_campaign(self, payload): response_data = response.json() if response.status_code != requests.codes.ok: raise BadStatusCode( - f"Got http status code {response.status_code} for request {req_url}" + f"Got http status code {response.status_code} for request {req_url}", + detail=response_data["detail"], ) return response_data["id"] except Exception as e: + if isinstance(e, BadStatusCode): + raise e raise RequestError(f"Error starting FaaS campaign.") def create_faas_campaign(self, campaign_data, seed_state): diff --git a/mythx_cli/fuzz/run.py b/mythx_cli/fuzz/run.py index d4cc540..e2b42c9 100644 --- a/mythx_cli/fuzz/run.py +++ b/mythx_cli/fuzz/run.py @@ -9,7 +9,7 @@ from mythx_cli.fuzz.ide.brownie import BrownieJob from mythx_cli.fuzz.ide.hardhat import HardhatJob -from .exceptions import RPCCallError +from .exceptions import BadStatusCode, RPCCallError from .faas import FaasClient from .rpc import RPCClient @@ -183,6 +183,10 @@ def fuzz_run(ctx, address, more_addresses, target, corpus_target): click.echo( "You can view campaign here: " + faas_url + "/campaigns/" + str(campaign_id) ) + except BadStatusCode as e: + raise click.exceptions.UsageError( + f"Campaign submission error. Detail - {e.detail}" + ) except Exception as e: LOGGER.warning( f"Could not submit campaign to the FaaS\n{traceback.format_exc()}" From dbb2959904fe6889409f7fec87d6ae4a68b028b8 Mon Sep 17 00:00:00 2001 From: Joao Santos Date: Tue, 18 May 2021 18:47:59 +0100 Subject: [PATCH 36/41] feat: add map_to_original_source flag --- mythx_cli/fuzz/ide/brownie.py | 16 ++++++++++---- mythx_cli/fuzz/run.py | 19 +++++++++++++++-- mythx_cli/util.py | 40 ++++++++++++++++++++++------------- 3 files changed, 54 insertions(+), 21 deletions(-) diff --git a/mythx_cli/fuzz/ide/brownie.py b/mythx_cli/fuzz/ide/brownie.py index 1dc60c7..07a8cca 100644 --- a/mythx_cli/fuzz/ide/brownie.py +++ b/mythx_cli/fuzz/ide/brownie.py @@ -7,17 +7,25 @@ from mythx_cli.fuzz.ide.generic import IDEArtifacts, JobBuilder from ...util import sol_files_by_directory +from ...util import files_by_directory LOGGER = logging.getLogger("mythx-cli") class BrownieArtifacts(IDEArtifacts): - def __init__(self, build_dir=None, targets=None): + def __init__(self, build_dir=None, targets=None, map_to_original_source=False): self._include = [] if targets: include = [] for target in targets: - include.extend(sol_files_by_directory(target)) + if not map_to_original_source: + LOGGER.debug(f"Mapping instrumented code") + include.extend(files_by_directory(target, ".sol")) + else: + # We replace .sol with .sol.original in case the target is a file and not a directory + target = target.replace(".sol", ".sol.original") + LOGGER.debug(f"Mapping original code, {target}") + include.extend(files_by_directory(target, ".sol.original")) self._include = include self._build_dir = build_dir or Path("./build/contracts") @@ -122,8 +130,8 @@ def _get_build_artifacts(build_dir) -> Dict: class BrownieJob: - def __init__(self, target: List[str], build_dir: Path): - artifacts = BrownieArtifacts(build_dir, targets=target) + def __init__(self, target: List[str], build_dir: Path, map_to_original_source: bool): + artifacts = BrownieArtifacts(build_dir, targets=target, map_to_original_source=map_to_original_source) self._jb = JobBuilder(artifacts) self.payload = None diff --git a/mythx_cli/fuzz/run.py b/mythx_cli/fuzz/run.py index e2b42c9..8ddf235 100644 --- a/mythx_cli/fuzz/run.py +++ b/mythx_cli/fuzz/run.py @@ -61,8 +61,16 @@ def determine_ide() -> IDE: default=None, required=False, ) +@click.option( + "-s", + "--map-to-original-source", + is_flag=True, + default=False, + help="Map the analyses results to the original source code, instead of the instrumented one. " + "This is meant to be used with Scribble.", +) @click.pass_obj -def fuzz_run(ctx, address, more_addresses, target, corpus_target): +def fuzz_run(ctx, address, more_addresses, corpus_target, map_to_original_source, target): # read YAML config params from ctx dict, e.g. ganache rpc url # Introduce a separate `fuzz` section in the YAML file @@ -87,6 +95,7 @@ def fuzz_run(ctx, address, more_addresses, target, corpus_target): "faas_url": "http://localhost:8080", "harvey_num_cores": 2, "campaign_name_prefix": "untitled", + "map_to_original_source": False, } config_options = analyze_config.keys() # Mandatory config parameters verification @@ -109,6 +118,12 @@ def fuzz_run(ctx, address, more_addresses, target, corpus_target): ) if not target: target = analyze_config["targets"] + if not map_to_original_source: + map_to_original_source = ( + analyze_config["map_to_original_source"] + if "map_to_original_source" in config_options + else default_config["map_to_original_source"] + ) # Optional config parameters # Here we parse the config parameters from the config file and use defaults for non available values contract_address = analyze_config["deployed_contract_address"] @@ -159,7 +174,7 @@ def fuzz_run(ctx, address, more_addresses, target, corpus_target): ide = determine_ide() if ide == IDE.BROWNIE: - artifacts = BrownieJob(target, analyze_config["build_directory"]) + artifacts = BrownieJob(target, analyze_config["build_directory"], map_to_original_source=map_to_original_source) artifacts.generate_payload() elif ide == IDE.HARDHAT: artifacts = HardhatJob(target, analyze_config["build_directory"]) diff --git a/mythx_cli/util.py b/mythx_cli/util.py index 66a30d7..c85bbc4 100644 --- a/mythx_cli/util.py +++ b/mythx_cli/util.py @@ -250,19 +250,28 @@ def write_or_print(ctx, data: str, mode="a+") -> None: LOGGER.debug(f"Writing data to {ctx['output']}") outfile.write(data + "\n") - def sol_files_by_directory(target_path: AnyStr) -> List: - """Gathers all the solidity files inside the target path + """Gathers all the .sol files inside the target path including sub-directories and returns them as a List. - Non solidity files are ignored. + Non .sol files are ignored. :param target_path: The directory to look for .sol files :return: """ - sol_files = [] - # We start by checking if the target_path is potentially a .sol file - if target_path.endswith(".sol"): - # If .sol file we check if the target exists or if it's a user input error + return files_by_directory(target_path, ".sol") + +def files_by_directory(target_path: AnyStr, extension: AnyStr) -> List: + """Gathers all the target extension files inside the target path + including sub-directories and returns them as a List. + Non target extension files are ignored. + + :param target_path: The directory to look for target extension files + :return: + """ + target_files = [] + # We start by checking if the target_path is potentially a target extension file + if target_path.endswith(extension): + # If target extension file we check if the target exists or if it's a user input error if not os.path.isfile(target_path): raise click.exceptions.UsageError( "Could not find " @@ -270,23 +279,24 @@ def sol_files_by_directory(target_path: AnyStr) -> List: + ". Did you pass the correct directory?" ) else: - # If it's a valid .sol file there is no need to search further and we just append it to our - # List to be returned - sol_files.append(target_path) + """ If it's a valid target extension file there is no need to search further and we just append it to our + list to be returned, removing the .original extension, leaving only the .sol """ + target_files.append(target_path.replace(".original","")) source_dir = os.walk(target_path) for sub_dir in source_dir: if len(sub_dir[2]) > 0: - # sub directory with .sol files + # sub directory with target extension files file_prefix = sub_dir[0] for file in sub_dir[2]: if "__scribble_" in file: LOGGER.debug(f"Skipped for being a scribble file {file}") continue - if not file.endswith(".sol"): + if not file.endswith(extension): LOGGER.debug(f"Skipped for not being a solidity file: {file}") continue file_name = file_prefix + "/" + file - LOGGER.debug(f"Found solidity file: {file_name}") - sol_files.append(file_name) - return sol_files + LOGGER.debug(f"Found target extension file: {file_name}") + # We remove the .original extension, added by Scribble + target_files.append(file_name.replace(".original","")) + return target_files From 9973ce7308525a132e30a6152b30f888a7e4cf82 Mon Sep 17 00:00:00 2001 From: Joao Santos Date: Fri, 21 May 2021 17:57:02 +0100 Subject: [PATCH 37/41] fix: feature broken in brownie feat: feature support for hardhat --- mythx_cli/fuzz/ide/brownie.py | 27 ++++++++++++++++----------- mythx_cli/fuzz/ide/hardhat.py | 24 ++++++++++++++++++------ mythx_cli/fuzz/run.py | 2 +- mythx_cli/util.py | 15 +++++++++++++-- 4 files changed, 48 insertions(+), 20 deletions(-) diff --git a/mythx_cli/fuzz/ide/brownie.py b/mythx_cli/fuzz/ide/brownie.py index 07a8cca..12416de 100644 --- a/mythx_cli/fuzz/ide/brownie.py +++ b/mythx_cli/fuzz/ide/brownie.py @@ -6,7 +6,7 @@ from mythx_cli.fuzz.exceptions import BuildArtifactsError from mythx_cli.fuzz.ide.generic import IDEArtifacts, JobBuilder -from ...util import sol_files_by_directory +from ...util import sol_files_by_directory, get_content_from_file from ...util import files_by_directory LOGGER = logging.getLogger("mythx-cli") @@ -18,20 +18,20 @@ def __init__(self, build_dir=None, targets=None, map_to_original_source=False): if targets: include = [] for target in targets: - if not map_to_original_source: - LOGGER.debug(f"Mapping instrumented code") - include.extend(files_by_directory(target, ".sol")) - else: - # We replace .sol with .sol.original in case the target is a file and not a directory - target = target.replace(".sol", ".sol.original") - LOGGER.debug(f"Mapping original code, {target}") - include.extend(files_by_directory(target, ".sol.original")) + # if not map_to_original_source: + LOGGER.debug(f"Mapping instrumented code") + include.extend(files_by_directory(target, ".sol")) + # else: + # # We replace .sol with .sol.original in case the target is a file and not a directory + # target = target.replace(".sol", ".sol.original") + # LOGGER.debug(f"Mapping original code, {target}") + # include.extend(files_by_directory(target, ".sol.original")) self._include = include self._build_dir = build_dir or Path("./build/contracts") build_files_by_source_file = self._get_build_artifacts(self._build_dir) - self._contracts, self._sources = self.fetch_data(build_files_by_source_file) + self._contracts, self._sources = self.fetch_data(build_files_by_source_file, map_to_original_source) @property def contracts(self): @@ -41,7 +41,7 @@ def contracts(self): def sources(self): return self._sources - def fetch_data(self, build_files_by_source_file): + def fetch_data(self, build_files_by_source_file, map_to_original_source=False): result_contracts = {} result_sources = {} for source_file, contracts in build_files_by_source_file.items(): @@ -83,6 +83,11 @@ def fetch_data(self, build_files_by_source_file): "source": target_file["source"], "ast": target_file["ast"], } + + if map_to_original_source and Path(source_file_dep+".original").is_file(): + # we check if the current source file has a non instrumented version + # if it does, we include that one as the source code + result_sources[source_file_dep]["source"] = get_content_from_file(source_file_dep+".original") return result_contracts, result_sources @staticmethod diff --git a/mythx_cli/fuzz/ide/hardhat.py b/mythx_cli/fuzz/ide/hardhat.py index 033d4fd..2779c41 100644 --- a/mythx_cli/fuzz/ide/hardhat.py +++ b/mythx_cli/fuzz/ide/hardhat.py @@ -6,20 +6,27 @@ from mythx_cli.fuzz.exceptions import BuildArtifactsError from mythx_cli.fuzz.ide.generic import IDEArtifacts, JobBuilder -from ...util import sol_files_by_directory +from ...util import sol_files_by_directory, LOGGER, files_by_directory, get_content_from_file class HardhatArtifacts(IDEArtifacts): - def __init__(self, build_dir=None, targets=None): + def __init__(self, build_dir=None, targets=None, map_to_original_source=False): self._include = [] if targets: include = [] for target in targets: + # if not map_to_original_source: include.extend(sol_files_by_directory(target)) + # else: + # # We replace .sol with .sol.original in case the target is a file and not a directory + # target = target.replace(".sol", ".sol.original") + # LOGGER.debug(f"Mapping original code, {target}") + # include.extend(files_by_directory(target, ".sol.original")) self._include = include + print("-----> ",self._include) self._build_dir = Path(build_dir).absolute() or Path("./artifacts").absolute() - self._contracts, self._sources = self.fetch_data() + self._contracts, self._sources = self.fetch_data(map_to_original_source) @property def contracts(self): @@ -29,7 +36,7 @@ def contracts(self): def sources(self): return self._sources - def fetch_data(self): + def fetch_data(self, map_to_original_source=False): result_contracts = {} result_sources = {} @@ -98,12 +105,17 @@ def fetch_data(self): "ast": data["ast"], } + if map_to_original_source and Path(source_file_dep+".original").is_file(): + # we check if the current source file has a non instrumented version + # if it does, we include that one as the source code + result_sources[source_file_dep]["source"] = get_content_from_file(source_file_dep+".original") + return result_contracts, result_sources class HardhatJob: - def __init__(self, target: List[str], build_dir: Path): - artifacts = HardhatArtifacts(build_dir, targets=target) + def __init__(self, target: List[str], build_dir: Path, map_to_original_source: bool): + artifacts = HardhatArtifacts(build_dir, targets=target, map_to_original_source=map_to_original_source) self._jb = JobBuilder(artifacts) self.payload = None diff --git a/mythx_cli/fuzz/run.py b/mythx_cli/fuzz/run.py index 8ddf235..c48de59 100644 --- a/mythx_cli/fuzz/run.py +++ b/mythx_cli/fuzz/run.py @@ -177,7 +177,7 @@ def fuzz_run(ctx, address, more_addresses, corpus_target, map_to_original_source artifacts = BrownieJob(target, analyze_config["build_directory"], map_to_original_source=map_to_original_source) artifacts.generate_payload() elif ide == IDE.HARDHAT: - artifacts = HardhatJob(target, analyze_config["build_directory"]) + artifacts = HardhatJob(target, analyze_config["build_directory"], map_to_original_source=map_to_original_source) artifacts.generate_payload() elif ide == IDE.TRUFFLE: raise click.exceptions.UsageError( diff --git a/mythx_cli/util.py b/mythx_cli/util.py index c85bbc4..7440b7c 100644 --- a/mythx_cli/util.py +++ b/mythx_cli/util.py @@ -250,6 +250,7 @@ def write_or_print(ctx, data: str, mode="a+") -> None: LOGGER.debug(f"Writing data to {ctx['output']}") outfile.write(data + "\n") + def sol_files_by_directory(target_path: AnyStr) -> List: """Gathers all the .sol files inside the target path including sub-directories and returns them as a List. @@ -260,6 +261,7 @@ def sol_files_by_directory(target_path: AnyStr) -> List: """ return files_by_directory(target_path, ".sol") + def files_by_directory(target_path: AnyStr, extension: AnyStr) -> List: """Gathers all the target extension files inside the target path including sub-directories and returns them as a List. @@ -281,7 +283,7 @@ def files_by_directory(target_path: AnyStr, extension: AnyStr) -> List: else: """ If it's a valid target extension file there is no need to search further and we just append it to our list to be returned, removing the .original extension, leaving only the .sol """ - target_files.append(target_path.replace(".original","")) + target_files.append(target_path.replace(".original", "")) source_dir = os.walk(target_path) for sub_dir in source_dir: if len(sub_dir[2]) > 0: @@ -298,5 +300,14 @@ def files_by_directory(target_path: AnyStr, extension: AnyStr) -> List: file_name = file_prefix + "/" + file LOGGER.debug(f"Found target extension file: {file_name}") # We remove the .original extension, added by Scribble - target_files.append(file_name.replace(".original","")) + target_files.append(file_name.replace(".original", "")) return target_files + + +def get_content_from_file(file_path: AnyStr) -> AnyStr: + reader = open(file_path) + try: + source_code = reader.read() + finally: + reader.close() + return source_code From 8c90c06e5e9474f14fe4a989388512021a413871 Mon Sep 17 00:00:00 2001 From: Joao Santos Date: Fri, 21 May 2021 17:58:30 +0100 Subject: [PATCH 38/41] cleanup --- mythx_cli/fuzz/ide/brownie.py | 10 +--------- mythx_cli/fuzz/ide/hardhat.py | 10 +--------- 2 files changed, 2 insertions(+), 18 deletions(-) diff --git a/mythx_cli/fuzz/ide/brownie.py b/mythx_cli/fuzz/ide/brownie.py index 12416de..8c698c4 100644 --- a/mythx_cli/fuzz/ide/brownie.py +++ b/mythx_cli/fuzz/ide/brownie.py @@ -7,7 +7,6 @@ from mythx_cli.fuzz.ide.generic import IDEArtifacts, JobBuilder from ...util import sol_files_by_directory, get_content_from_file -from ...util import files_by_directory LOGGER = logging.getLogger("mythx-cli") @@ -18,14 +17,7 @@ def __init__(self, build_dir=None, targets=None, map_to_original_source=False): if targets: include = [] for target in targets: - # if not map_to_original_source: - LOGGER.debug(f"Mapping instrumented code") - include.extend(files_by_directory(target, ".sol")) - # else: - # # We replace .sol with .sol.original in case the target is a file and not a directory - # target = target.replace(".sol", ".sol.original") - # LOGGER.debug(f"Mapping original code, {target}") - # include.extend(files_by_directory(target, ".sol.original")) + include.extend(sol_files_by_directory(target)) self._include = include self._build_dir = build_dir or Path("./build/contracts") diff --git a/mythx_cli/fuzz/ide/hardhat.py b/mythx_cli/fuzz/ide/hardhat.py index 2779c41..eeebc49 100644 --- a/mythx_cli/fuzz/ide/hardhat.py +++ b/mythx_cli/fuzz/ide/hardhat.py @@ -6,7 +6,7 @@ from mythx_cli.fuzz.exceptions import BuildArtifactsError from mythx_cli.fuzz.ide.generic import IDEArtifacts, JobBuilder -from ...util import sol_files_by_directory, LOGGER, files_by_directory, get_content_from_file +from ...util import sol_files_by_directory, get_content_from_file class HardhatArtifacts(IDEArtifacts): @@ -15,16 +15,8 @@ def __init__(self, build_dir=None, targets=None, map_to_original_source=False): if targets: include = [] for target in targets: - # if not map_to_original_source: include.extend(sol_files_by_directory(target)) - # else: - # # We replace .sol with .sol.original in case the target is a file and not a directory - # target = target.replace(".sol", ".sol.original") - # LOGGER.debug(f"Mapping original code, {target}") - # include.extend(files_by_directory(target, ".sol.original")) self._include = include - - print("-----> ",self._include) self._build_dir = Path(build_dir).absolute() or Path("./artifacts").absolute() self._contracts, self._sources = self.fetch_data(map_to_original_source) From bb75d5fa756fd6ccf601fe2f56da255bd8b04f85 Mon Sep 17 00:00:00 2001 From: Joao Santos Date: Mon, 24 May 2021 15:00:54 +0100 Subject: [PATCH 39/41] test: adds brownie tests fr map to original source --- tests/test_fuzz_brownie.py | 69 +++++++++++++++++++++++++++++++++++++- tests/test_fuzz_hardhat.py | 15 +++++++-- 2 files changed, 80 insertions(+), 4 deletions(-) diff --git a/tests/test_fuzz_brownie.py b/tests/test_fuzz_brownie.py index 66d74b6..ffc62fc 100644 --- a/tests/test_fuzz_brownie.py +++ b/tests/test_fuzz_brownie.py @@ -19,6 +19,9 @@ GANACHE_URL = "http://localhost:9898" FAAS_URL = "http://localhost:9899" +INSTRUMENTED_SOL_CODE = "sol code here" +ORIGINAL_SOL_CODE = "original sol code here" + @pytest.fixture() def brownie_project(tmp_path, switch_dir=False): @@ -41,7 +44,9 @@ def brownie_project(tmp_path, switch_dir=False): with open(tmp_path / "build/contracts/Foo.json", "w+") as artifact_f: json.dump(BROWNIE_ARTIFACT, artifact_f) with open(tmp_path / "contracts/sample.sol", "w+") as sol_f: - sol_f.write("sol code here") + sol_f.write(INSTRUMENTED_SOL_CODE) + with open(tmp_path / "contracts/sample.sol.original", "w+") as sol_f: + sol_f.write(ORIGINAL_SOL_CODE) yield None # cleaning up test files @@ -259,6 +264,68 @@ def test_fuzz_run(tmp_path, brownie_project): assert result.exit_code == 0 +def test_fuzz_run_map_to_original_source(tmp_path, brownie_project): + with open(".mythx.yml", "w+") as conf_f: + conf_f.write(generate_config_file(base_path=tmp_path)) + + with patch.object( + RPCClient, "contract_exists" + ) as contract_exists_mock, patch.object( + RPCClient, "get_all_blocks" + ) as get_all_blocks_mock, patch.object( + FaasClient, "start_faas_campaign" + ) as start_faas_campaign_mock: + get_all_blocks_mock.return_value = get_test_case( + "testdata/ganache-all-blocks.json" + ) + contract_exists_mock.return_value = True + campaign_id = "560ba03a-8744-4da6-aeaa-a62568ccbf44" + start_faas_campaign_mock.return_value = campaign_id + + runner = CliRunner() + result = runner.invoke(cli, ["fuzz", "run", "--map-to-original-source",f"{tmp_path}/contracts"]) + + contract_exists_mock.assert_called_with( + "0x7277646075fa72737e1F6114654C5d9949a67dF2" + ) + contract_exists_mock.assert_called_once() + get_all_blocks_mock.assert_called_once() + start_faas_campaign_mock.assert_called_once() + called_with = start_faas_campaign_mock.call_args + assert ( + f"You can view campaign here: {FAAS_URL}/campaigns/{campaign_id}" + in result.output + ) + + request_payload = json.dumps(called_with[0]) + + assert ORIGINAL_SOL_CODE in request_payload + + keywords = [ + "parameters", + "name", + "corpus", + "sources", + "contracts", + "address-under-test", + "source", + "fileIndex", + "sourcePaths", + "deployedSourceMap", + "mainSourceFile", + "contractName", + "bytecode", + "deployedBytecode", + "sourceMap", + "deployedSourceMap", + ] + + for keyword in keywords: + assert keyword in request_payload + + + + assert result.exit_code == 0 @pytest.mark.parametrize("keyword", ("run", "disarm", "arm", "run")) def test_fuzz_subcommands_present(keyword): diff --git a/tests/test_fuzz_hardhat.py b/tests/test_fuzz_hardhat.py index d61c835..44c266b 100644 --- a/tests/test_fuzz_hardhat.py +++ b/tests/test_fuzz_hardhat.py @@ -20,6 +20,9 @@ GANACHE_URL = "http://localhost:9898" FAAS_URL = "http://localhost:9899" +INSTRUMENTED_SOL_CODE = "sol code here" +ORIGINAL_SOL_CODE = "original sol code here" + @pytest.fixture() def hardhat_project(tmp_path, switch_dir=False): @@ -48,10 +51,16 @@ def hardhat_project(tmp_path, switch_dir=False): json.dump(content, sol_f) with open(tmp_path / "contracts/MasterChefV2.sol", "w+") as sol_f: - sol_f.write("sol code here") + sol_f.write(INSTRUMENTED_SOL_CODE) + + with open(tmp_path / "contracts/sample.sol", "w+") as sol_f: + sol_f.write(INSTRUMENTED_SOL_CODE) + + with open(tmp_path / "contracts/MasterChefV2.sol.original", "w+") as sol_f: + sol_f.write(ORIGINAL_SOL_CODE) - with open(tmp_path / "contracts/sample.sol", "w+") as sol_f: - sol_f.write("sol code here") + with open(tmp_path / "contracts/sample.sol.original", "w+") as sol_f: + sol_f.write(ORIGINAL_SOL_CODE) yield None From bb11a558aa7e2c84b196edc85d0509372382b885 Mon Sep 17 00:00:00 2001 From: Joao Santos Date: Fri, 25 Jun 2021 11:17:32 +0100 Subject: [PATCH 40/41] feat: adds --dry-run flag --- mythx_cli/fuzz/faas.py | 8 +++++++- mythx_cli/fuzz/run.py | 24 ++++++++++++++++-------- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/mythx_cli/fuzz/faas.py b/mythx_cli/fuzz/faas.py index d7ab516..4eeed7e 100644 --- a/mythx_cli/fuzz/faas.py +++ b/mythx_cli/fuzz/faas.py @@ -1,3 +1,4 @@ +import json import logging import random import string @@ -54,7 +55,7 @@ def start_faas_campaign(self, payload): raise e raise RequestError(f"Error starting FaaS campaign.") - def create_faas_campaign(self, campaign_data, seed_state): + def create_faas_campaign(self, campaign_data, seed_state, dry_run = False): """Submit a campaign to the FaaS and start that campaign. This function takes a FaaS payload and makes an HTTP request to the Faas backend, which @@ -102,6 +103,11 @@ def create_faas_campaign(self, campaign_data, seed_state): f"Error getting Scribble arming metadata." ) from e + if dry_run: + print("Printing output \n --------") + print(f"{json.dumps(api_payload)}") + print("End of output \n --------") + return "campaign not started due to --dry-run option" campaign_id = self.start_faas_campaign(api_payload) return campaign_id diff --git a/mythx_cli/fuzz/run.py b/mythx_cli/fuzz/run.py index c48de59..a8d4e37 100644 --- a/mythx_cli/fuzz/run.py +++ b/mythx_cli/fuzz/run.py @@ -57,7 +57,7 @@ def determine_ide() -> IDE: "--corpus-target", type=click.STRING, help="Project UUID, Campaign UUID or Corpus UUID to reuse the corpus from. " - "In case of a project, corpus from the project's latest submitted campaign will be used", + "In case of a project, corpus from the project's latest submitted campaign will be used", default=None, required=False, ) @@ -69,8 +69,16 @@ def determine_ide() -> IDE: help="Map the analyses results to the original source code, instead of the instrumented one. " "This is meant to be used with Scribble.", ) + +@click.option( + "--dry-run", + is_flag=True, + default=False, + help="Outputs the data to be sent to the FaaS API without making the request.", +) + @click.pass_obj -def fuzz_run(ctx, address, more_addresses, corpus_target, map_to_original_source, target): +def fuzz_run(ctx, address, more_addresses, corpus_target, map_to_original_source, dry_run, target): # read YAML config params from ctx dict, e.g. ganache rpc url # Introduce a separate `fuzz` section in the YAML file @@ -119,11 +127,11 @@ def fuzz_run(ctx, address, more_addresses, corpus_target, map_to_original_source if not target: target = analyze_config["targets"] if not map_to_original_source: - map_to_original_source = ( - analyze_config["map_to_original_source"] - if "map_to_original_source" in config_options - else default_config["map_to_original_source"] - ) + map_to_original_source = ( + analyze_config["map_to_original_source"] + if "map_to_original_source" in config_options + else default_config["map_to_original_source"] + ) # Optional config parameters # Here we parse the config parameters from the config file and use defaults for non available values contract_address = analyze_config["deployed_contract_address"] @@ -193,7 +201,7 @@ def fuzz_run(ctx, address, more_addresses, corpus_target, map_to_original_source ) try: campaign_id = faas_client.create_faas_campaign( - campaign_data=artifacts, seed_state=seed_state + campaign_data=artifacts, seed_state=seed_state, dry_run=dry_run ) click.echo( "You can view campaign here: " + faas_url + "/campaigns/" + str(campaign_id) From f512d4937b544d9b2c4d18b0ca7a88e012d266fc Mon Sep 17 00:00:00 2001 From: Joao Santos Date: Thu, 5 Aug 2021 12:39:06 +0100 Subject: [PATCH 41/41] feat: add api_key as config file parameter --- mythx_cli/fuzz/faas.py | 16 ++++++++++------ mythx_cli/fuzz/run.py | 18 ++++++++++++++++-- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/mythx_cli/fuzz/faas.py b/mythx_cli/fuzz/faas.py index 4eeed7e..0073e36 100644 --- a/mythx_cli/fuzz/faas.py +++ b/mythx_cli/fuzz/faas.py @@ -4,6 +4,7 @@ import string import requests +from requests.structures import CaseInsensitiveDict from mythx_cli.analyze.scribble import ScribbleMixin @@ -17,8 +18,6 @@ LOGGER = logging.getLogger("mythx-cli") -headers = {"Content-Type": "application/json"} - class FaasClient: """ A client to interact with the FaaS API. @@ -27,10 +26,14 @@ class FaasClient: API can consume and submits it, also triggering the start of a Campaign. """ - def __init__(self, faas_url, campaign_name_prefix, project_type): + def __init__(self, faas_url, campaign_name_prefix, project_type, api_key): self.faas_url = faas_url self.campaign_name_prefix = campaign_name_prefix self.project_type = project_type + self.api_key = api_key + self.headers = CaseInsensitiveDict() + self.headers["Content-Type"] = "application/json" + self.headers["Authorization"] = "Bearer " + str(self.api_key) def generate_campaign_name(self): """Return a random name with the provided prefix self.campaign_name_prefix.""" @@ -41,10 +44,11 @@ def generate_campaign_name(self): def start_faas_campaign(self, payload): """Make HTTP request to the faas""" try: - req_url = f"{self.faas_url}/api/campaigns?start_immediately=true" - response = requests.post(req_url, json=payload, headers=headers) + req_url = f"{self.faas_url}/api/campaigns/?start_immediately=true" + response = requests.post(req_url, json=payload, headers=self.headers) response_data = response.json() if response.status_code != requests.codes.ok: + print(response.text) raise BadStatusCode( f"Got http status code {response.status_code} for request {req_url}", detail=response_data["detail"], @@ -55,7 +59,7 @@ def start_faas_campaign(self, payload): raise e raise RequestError(f"Error starting FaaS campaign.") - def create_faas_campaign(self, campaign_data, seed_state, dry_run = False): + def create_faas_campaign(self, campaign_data, seed_state, dry_run=False): """Submit a campaign to the FaaS and start that campaign. This function takes a FaaS payload and makes an HTTP request to the Faas backend, which diff --git a/mythx_cli/fuzz/run.py b/mythx_cli/fuzz/run.py index a8d4e37..711bc40 100644 --- a/mythx_cli/fuzz/run.py +++ b/mythx_cli/fuzz/run.py @@ -77,8 +77,16 @@ def determine_ide() -> IDE: help="Outputs the data to be sent to the FaaS API without making the request.", ) +@click.option( + "-k", + "--api-key", + type=click.STRING, + help="API key, can be created on the FaaS Dashboard. ", + default=None, + required=False, +) @click.pass_obj -def fuzz_run(ctx, address, more_addresses, corpus_target, map_to_original_source, dry_run, target): +def fuzz_run(ctx, address, more_addresses, corpus_target, map_to_original_source, dry_run, api_key, target): # read YAML config params from ctx dict, e.g. ganache rpc url # Introduce a separate `fuzz` section in the YAML file @@ -132,6 +140,12 @@ def fuzz_run(ctx, address, more_addresses, corpus_target, map_to_original_source if "map_to_original_source" in config_options else default_config["map_to_original_source"] ) + if not api_key: + api_key = ( + analyze_config["api_key"] + if "api_key" in config_options + else None + ) # Optional config parameters # Here we parse the config parameters from the config file and use defaults for non available values contract_address = analyze_config["deployed_contract_address"] @@ -197,7 +211,7 @@ def fuzz_run(ctx, address, more_addresses, corpus_target, map_to_original_source ) faas_client = FaasClient( - faas_url=faas_url, campaign_name_prefix=campaign_name_prefix, project_type=ide + faas_url=faas_url, campaign_name_prefix=campaign_name_prefix, project_type=ide, api_key=api_key ) try: campaign_id = faas_client.create_faas_campaign(