├── .github └── workflows │ ├── black.yml │ ├── linter.yml │ ├── mypy.yml │ ├── pip-audit.yml │ └── pylint.yml ├── .gitignore ├── .travis.yml ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── evm_cfg_builder ├── __init__.py ├── __main__.py ├── cfg │ ├── __init__.py │ ├── basic_block.py │ ├── cfg.py │ └── function.py ├── known_hashes │ ├── __init__.py │ ├── download_sigs.py │ └── known_hashes.py └── value_analysis │ ├── __init__.py │ └── value_set_analysis.py ├── examples ├── expected_output │ ├── explore_cfg.txt │ └── explore_functions.txt ├── explore_cfg.py ├── explore_functions.py ├── token-runtime.evm └── token.sol ├── mypy.ini ├── pyproject.toml ├── setup.py └── tests ├── expected-fomo3d-output ├── fomo3d.evm_FULL_GRAPH.dot ├── fomo3d.evm_Hourglass().dot ├── fomo3d.evm__dispatcher.dot ├── fomo3d.evm__fallback.dot ├── fomo3d.evm_administrators(bytes32).dot ├── fomo3d.evm_balanceOf(address).dot ├── fomo3d.evm_buy(address).dot ├── fomo3d.evm_buyPrice().dot ├── fomo3d.evm_calculateEthereumReceived(uint256).dot ├── fomo3d.evm_calculateTokensReceived(uint256).dot ├── fomo3d.evm_decimals().dot ├── fomo3d.evm_disableInitialStage().dot ├── fomo3d.evm_dividendsOf(address).dot ├── fomo3d.evm_exit().dot ├── fomo3d.evm_myDividends(bool).dot ├── fomo3d.evm_myTokens().dot ├── fomo3d.evm_name().dot ├── fomo3d.evm_onlyAmbassadors().dot ├── fomo3d.evm_reinvest().dot ├── fomo3d.evm_sell(uint256).dot ├── fomo3d.evm_sellPrice().dot ├── fomo3d.evm_setAdministrator(bytes32,bool).dot ├── fomo3d.evm_setName(string).dot ├── fomo3d.evm_setStakingRequirement(uint256).dot ├── fomo3d.evm_setSymbol(string).dot ├── fomo3d.evm_stakingRequirement().dot ├── fomo3d.evm_symbol().dot ├── fomo3d.evm_totalEthereumBalance().dot ├── fomo3d.evm_totalSupply().dot ├── fomo3d.evm_transfer(address,uint256).dot └── fomo3d.evm_withdraw().dot ├── fomo3d.evm ├── fomo3d.sol ├── recurse.evm └── recurse.sol /.github/workflows/black.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: Black 3 | 4 | defaults: 5 | run: 6 | # To load bashrc 7 | shell: bash -ieo pipefail {0} 8 | 9 | on: 10 | pull_request: 11 | branches: [master, dev, dev-linters] 12 | 13 | jobs: 14 | build: 15 | name: Black 16 | runs-on: ubuntu-latest 17 | 18 | steps: 19 | - name: Checkout Code 20 | uses: actions/checkout@v2 21 | 22 | - name: Set up Python 3.6 23 | uses: actions/setup-python@v2 24 | with: 25 | python-version: 3.6 26 | 27 | - name: Install dependencies 28 | run: | 29 | pip install . 30 | pip install deepdiff numpy 31 | 32 | mkdir -p .github/linters 33 | cp pyproject.toml .github/linters 34 | 35 | - name: Black 36 | uses: github/super-linter@v4 37 | if: always() 38 | env: 39 | # run linter on everything to catch preexisting problems 40 | VALIDATE_ALL_CODEBASE: true 41 | DEFAULT_BRANCH: master 42 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 43 | # Run only black 44 | VALIDATE_PYTHON_BLACK: true 45 | PYTHON_BLACK_CONFIG_FILE: pyproject.toml 46 | FILTER_REGEX_EXCLUDE: "*.known_hashes.py" 47 | -------------------------------------------------------------------------------- /.github/workflows/linter.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: Lint Code Base 3 | 4 | defaults: 5 | run: 6 | # To load bashrc 7 | shell: bash -ieo pipefail {0} 8 | 9 | on: 10 | pull_request: 11 | branches: [master, dev, dev-linters] 12 | 13 | jobs: 14 | build: 15 | name: Lint Code Base 16 | runs-on: ubuntu-latest 17 | 18 | steps: 19 | - name: Checkout Code 20 | uses: actions/checkout@v2 21 | 22 | - name: Set up Python 3.6 23 | uses: actions/setup-python@v2 24 | with: 25 | python-version: 3.6 26 | 27 | - name: Install dependencies 28 | run: | 29 | pip install . 30 | 31 | mkdir -p .github/linters 32 | cp pyproject.toml .github/linters 33 | 34 | - name: Lint everything else 35 | uses: github/super-linter@v4 36 | if: always() 37 | env: 38 | # run linter on everything to catch preexisting problems 39 | VALIDATE_ALL_CODEBASE: true 40 | DEFAULT_BRANCH: master 41 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 42 | # Always false 43 | VALIDATE_PYTHON: false 44 | VALIDATE_PYTHON_PYLINT: false 45 | VALIDATE_PYTHON_BLACK: false 46 | VALIDATE_PYTHON_ISORT: false 47 | # Always false 48 | VALIDATE_JSON: false 49 | VALIDATE_JAVASCRIPT_STANDARD: false 50 | VALIDATE_PYTHON_FLAKE8: false 51 | VALIDATE_DOCKERFILE: false 52 | VALIDATE_DOCKERFILE_HADOLINT: false 53 | VALIDATE_EDITORCONFIG: false 54 | VALIDATE_JSCPD: false 55 | VALIDATE_PYTHON_MYPY: false 56 | SHELLCHECK_OPTS: "-e SC1090 -e SC2181 -e SC2103" 57 | -------------------------------------------------------------------------------- /.github/workflows/mypy.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: Mypy 3 | 4 | defaults: 5 | run: 6 | # To load bashrc 7 | shell: bash -ieo pipefail {0} 8 | 9 | on: 10 | pull_request: 11 | branches: [master, dev, dev-linters] 12 | 13 | jobs: 14 | build: 15 | name: Mypy 16 | runs-on: ubuntu-latest 17 | 18 | steps: 19 | - name: Checkout Code 20 | uses: actions/checkout@v2 21 | 22 | - name: Set up Python 3.6 23 | uses: actions/setup-python@v2 24 | with: 25 | python-version: 3.6 26 | 27 | - name: Install dependencies 28 | run: | 29 | pip install . 30 | pip install types-setuptools 31 | 32 | mkdir -p .github/linters 33 | cp mypy.ini .github/linters 34 | 35 | - name: Mypy 36 | uses: github/super-linter@v4 37 | if: always() 38 | env: 39 | # run linter on everything to catch preexisting problems 40 | VALIDATE_ALL_CODEBASE: true 41 | DEFAULT_BRANCH: master 42 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 43 | # Run only black 44 | VALIDATE_PYTHON_MYPY: true 45 | PYTHON_MYPY_CONFIG_FILE: mypy.ini 46 | -------------------------------------------------------------------------------- /.github/workflows/pip-audit.yml: -------------------------------------------------------------------------------- 1 | name: pip-audit 2 | 3 | on: 4 | push: 5 | branches: [ dev, master ] 6 | pull_request: 7 | branches: [ dev, master ] 8 | schedule: [ cron: "0 7 * * 2" ] 9 | 10 | jobs: 11 | build: 12 | runs-on: ubuntu-latest 13 | steps: 14 | - name: Checkout repository 15 | uses: actions/checkout@v2 16 | - name: Set up Python 3.10 17 | uses: actions/setup-python@v2 18 | with: 19 | python-version: "3.10" 20 | - name: Install pip-audit 21 | run: | 22 | python -m pip install --upgrade pip 23 | python -m pip install pip-audit 24 | - name: Run pip-audit 25 | run: | 26 | echo "-e ." > audit.txt 27 | pip-audit --strict --desc -r audit.txt 28 | -------------------------------------------------------------------------------- /.github/workflows/pylint.yml: -------------------------------------------------------------------------------- 1 | --- 2 | name: Pylint 3 | 4 | defaults: 5 | run: 6 | # To load bashrc 7 | shell: bash -ieo pipefail {0} 8 | 9 | on: 10 | pull_request: 11 | branches: [master, dev, dev-linters] 12 | 13 | jobs: 14 | build: 15 | name: Pylint 16 | runs-on: ubuntu-latest 17 | 18 | steps: 19 | - name: Checkout Code 20 | uses: actions/checkout@v2 21 | 22 | - name: Set up Python 3.6 23 | uses: actions/setup-python@v2 24 | with: 25 | python-version: 3.6 26 | 27 | - name: Install dependencies 28 | run: | 29 | pip install . 30 | pip install deepdiff numpy 31 | 32 | mkdir -p .github/linters 33 | cp pyproject.toml .github/linters 34 | 35 | - name: Pylint 36 | uses: github/super-linter@v4 37 | if: always() 38 | env: 39 | # run linter on everything to catch preexisting problems 40 | VALIDATE_ALL_CODEBASE: true 41 | DEFAULT_BRANCH: master 42 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 43 | # Run only pylint 44 | VALIDATE_PYTHON: true 45 | VALIDATE_PYTHON_PYLINT: true 46 | PYTHON_PYLINT_CONFIG_FILE: pyproject.toml 47 | 48 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *dot 2 | *sw* 3 | *.pyc 4 | __pycache__ -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | sudo: required 2 | os: 3 | - linux 4 | language: python 5 | python: 6 | - 3.6 7 | env: 8 | - TEST_SUITE=scripts/travis_tests.sh 9 | # - TEST_SUITE=scripts/travis_test_truffle.sh 10 | # - TEST_SUITE=scripts/travis_test_embark.sh 11 | branches: 12 | only: 13 | - master 14 | - dev 15 | 16 | install: 17 | - scripts/travis_install.sh 18 | 19 | script: 20 | - $TEST_SUITE 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing to evm-cfg-buidler 2 | First, thanks for your interest in contributing to evm-cfg-builder! We welcome and appreciate all contributions, including bug reports, feature suggestions, tutorials/blog posts, and code improvements. 3 | 4 | If you're unsure where to start, we recommend our [`good first issue`](https://github.com/crytic/evm-cfg-builder/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) and [`help wanted`](https://github.com/crytic/evm-cfg-builder/issues?q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22) issue labels. 5 | 6 | ## Bug reports and feature suggestions 7 | Bug reports and feature suggestions can be submitted to our issue tracker. For bug reports, attaching the contract that caused the bug will help us in debugging and resolving the issue quickly. If you find a security vulnerability, do not open an issue; email opensource@trailofbits.com instead. 8 | 9 | ## Questions 10 | Questions can be submitted to the issue tracker, but you may get a faster response if you ask in our [chat room](https://empireslacking.herokuapp.com/) (in the #ethereum channel). 11 | 12 | ## Code 13 | evm-cfg-builder uses the pull request contribution model. Please make an account on Github, fork this repo, and submit code contributions via pull request. For more documentation, look [here](https://guides.github.com/activities/forking/). 14 | 15 | Some pull request guidelines: 16 | 17 | - Work from the [`dev`](https://github.com/crytic/evm-cfg-builder/tree/dev) branch. We performed extensive tests prior to merging anything to `master`, working from `dev` will allow us to merge your work faster. 18 | - Minimize irrelevant changes (formatting, whitespace, etc) to code that would otherwise not be touched by this patch. Save formatting or style corrections for a separate pull request that does not make any semantic changes. 19 | - When possible, large changes should be split up into smaller focused pull requests. 20 | - Fill out the pull request description with a summary of what your patch does, key changes that have been made, and any further points of discussion, if applicable. 21 | - Title your pull request with a brief description of what it's changing. "Fixes #123" is a good comment to add to the description, but makes for an unclear title on its own. 22 | - We use the [Google style guide](https://github.com/google/styleguide/blob/gh-pages/pyguide.md#38-comments-and-docstrings) for documentation. 23 | - If there are specific operations whose purpose would not be clear to a naive user, documentation should alleviate that. 24 | - Add type hints to function parameters, return variables, class variables, lists and sets. If possible add type hints to dictionaries. 25 | 26 | ## Linters 27 | 28 | Several linters and security checkers are run on the PRs. 29 | 30 | To run them locally: 31 | 32 | - `pylint crytic_compile --rcfile pyproject.toml` 33 | - `black crytic_compile --config pyproject.toml` 34 | - `mypy crytic_compile --config mypy.ini` 35 | 36 | We use pylint `2.11.1`, black `21.12b0`, mypy `0.812`. 37 | 38 | ## Development Environment 39 | Instructions for installing a development version of evm-cfg-builder can be found in our [wiki](https://github.com/crytic/evm-cfg-builder/wiki/Developer-installation). 40 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # EVM CFG BUILDER 2 | [![Build Status](https://travis-ci.org/crytic/evm_cfg_builder.svg?branch=master)](https://travis-ci.org/crytic/evm_cfg_builder) 3 | [![Slack Status](https://empireslacking.herokuapp.com/badge.svg)](https://empireslacking.herokuapp.com) 4 | [![PyPI version](https://badge.fury.io/py/evm-cfg-builder.svg)](https://badge.fury.io/py/evm-cfg-builder) 5 | 6 | `evm-cfg-builder` is used to extract a control flow graph (CFG) from EVM bytecode. It is used by Ethersplay, Manticore, and other tools from Trail of Bits. It is a reliable foundation to build program analysis tools for EVM. 7 | 8 | We encourage contributions that address any known [issues](https://github.com/trailofbits/evm_cfg_builder/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc) and will pay out bounties for accepted PRs. Join us on the [Empire Hacking Slack](https://empireslacking.herokuapp.com) to discuss using or extending `evm-cfg-builder`. 9 | 10 | ## Features 11 | 12 | * Reliably recovers a Control Flow Graph (CFG) from EVM bytecode using a dedicated Value Set Analysis 13 | * Recovers functions names 14 | * Recovers attributes (e.g., payable, view, pure) 15 | * Outputs the CFG to a dot file 16 | * Library API 17 | 18 | ## Usage 19 | 20 | ### Command-line 21 | 22 | To export basic dissassembly information, run: 23 | ```bash 24 | evm-cfg-builder mycontract.evm 25 | ``` 26 | 27 | To export the CFG of each function (dot format), run: 28 | ```bash 29 | evm-cfg-builder mycontract.evm --export-dot my_dir 30 | ``` 31 | 32 | dot files can be read using xdot. 33 | 34 | ### Library 35 | See [examples/explore_cfg.py](examples/explore_cfg.py) and [examples/explore_functions.py](examples/explore_functions.py) for library examples. 36 | 37 | ## How to install 38 | 39 | ### Using Pip 40 | ```bash 41 | pip install evm-cfg-builder 42 | ``` 43 | 44 | ### Using Git 45 | ```bash 46 | git clone https://github.com/trailofbits/evm_cfg_builder 47 | pip install . 48 | ``` 49 | 50 | ## Requirements 51 | 52 | * Python >= 3.6 53 | * [pyevmasm](https://github.com/trailofbits/pyevmasm) 54 | 55 | ## Getting Help 56 | 57 | Feel free to stop by our [Slack channel](https://empireslacking.herokuapp.com) (#ethereum) for help using or extending evm-cfg-builder. 58 | 59 | ## License 60 | 61 | `evm-cfg-builder` is licensed and distributed under the AGPLv3. [Contact us](mailto:opensource@trailofbits.com) if you're looking for an exception to the terms. 62 | -------------------------------------------------------------------------------- /evm_cfg_builder/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crytic/evm_cfg_builder/98c9e9658387e76d20d84da6fa2ba8e2fbb9b65a/evm_cfg_builder/__init__.py -------------------------------------------------------------------------------- /evm_cfg_builder/__main__.py: -------------------------------------------------------------------------------- 1 | import argparse 2 | import cProfile 3 | import json 4 | import logging 5 | import os 6 | import pstats 7 | import sys 8 | from typing import Optional, Union 9 | 10 | from crytic_compile import cryticparser, CryticCompile, InvalidCompilation, is_supported 11 | from pkg_resources import require 12 | 13 | from evm_cfg_builder.cfg.cfg import CFG 14 | from evm_cfg_builder.known_hashes.known_hashes import known_hashes 15 | 16 | logging.basicConfig() 17 | logger = logging.getLogger("evm-cfg-builder") 18 | 19 | 20 | def output_to_dot(d: str, filename: str, cfg: CFG) -> None: 21 | if not os.path.exists(d): 22 | os.makedirs(d) 23 | filename = os.path.basename(filename) 24 | filename = os.path.join(d, filename + "_") 25 | cfg.output_to_dot(filename) 26 | for function in cfg.functions: 27 | function.output_to_dot(filename) 28 | 29 | 30 | def parse_args() -> argparse.Namespace: 31 | parser = argparse.ArgumentParser( 32 | description="evm-cfg-builder", usage="evm-cfg-builder contract.evm [flag]" 33 | ) 34 | 35 | parser.add_argument("filename", help="contract.evm") 36 | 37 | parser.add_argument( 38 | "--export-dot", 39 | help="Export the functions to .dot files in the directory", 40 | action="store", 41 | dest="dot_directory", 42 | default="crytic-export/evm", 43 | ) 44 | 45 | parser.add_argument( 46 | "--disable-optimizations", 47 | help="Disable the CFG recovery optimizations", 48 | action="store_true", 49 | dest="disable_optimizations", 50 | default=False, 51 | ) 52 | 53 | parser.add_argument( 54 | "--disable-cfg", 55 | help="Disable the CFG recovery", 56 | action="store_true", 57 | dest="disable_cfg", 58 | default=False, 59 | ) 60 | 61 | parser.add_argument( 62 | "--export-abi", 63 | help="Export the contract's ABI", 64 | action="store", 65 | dest="export_abi", 66 | default=None, 67 | ) 68 | 69 | parser.add_argument( 70 | "--version", 71 | help="displays the current version", 72 | version=require("evm-cfg-builder")[0].version, 73 | action="version", 74 | ) 75 | 76 | parser.add_argument( 77 | "--perf", 78 | help=argparse.SUPPRESS, 79 | action="store_true", 80 | default=False, 81 | ) 82 | 83 | cryticparser.init(parser) 84 | 85 | if len(sys.argv) == 1: 86 | parser.print_help(sys.stderr) 87 | sys.exit(1) 88 | args = parser.parse_args() 89 | return args 90 | 91 | 92 | def _run(bytecode: Optional[Union[str, bytes]], filename: str, args: argparse.Namespace) -> None: 93 | 94 | optimization_enabled = False 95 | if args.disable_optimizations: 96 | optimization_enabled = True 97 | 98 | cfg = CFG( 99 | bytecode, optimization_enabled=optimization_enabled, compute_cfgs=not args.disable_cfg 100 | ) 101 | 102 | for function in cfg.functions: 103 | logger.info(function) 104 | 105 | if args.dot_directory: 106 | output_to_dot(args.dot_directory, filename, cfg) 107 | 108 | if args.export_abi: 109 | export = [] 110 | for function in cfg.functions: 111 | export.append( 112 | { 113 | "hash_id": hex(function.hash_id), 114 | "start_addr": hex(function.start_addr), 115 | "signature": function.name if function.name != hex(function.hash_id) else None, 116 | "attributes": function.attributes, 117 | } 118 | ) 119 | 120 | with open(args.export_abi, "w", encoding="utf-8") as f: 121 | json.dump(export, f) 122 | 123 | 124 | # pylint: disable=too-many-locals,too-many-nested-blocks 125 | def main() -> None: 126 | 127 | l = logging.getLogger("evm-cfg-builder") 128 | l.setLevel(logging.INFO) 129 | args = parse_args() 130 | 131 | cp: Optional[cProfile.Profile] = None 132 | if args.perf: 133 | cp = cProfile.Profile() 134 | cp.enable() 135 | 136 | if is_supported(args.filename): 137 | filename = args.filename 138 | del args.filename 139 | try: 140 | cryticCompile = CryticCompile(filename, **vars(args)) 141 | for key, compilation_unit in cryticCompile.compilation_units.items(): 142 | for contract in compilation_unit.contracts_names: 143 | bytecode_init = compilation_unit.bytecode_init(contract) 144 | if bytecode_init: 145 | for signature, hash_id in compilation_unit.hashes(contract).items(): 146 | known_hashes[hash_id] = signature 147 | logger.info(f"Analyze {contract}") 148 | _run(bytecode_init, f"{key}-{filename}-{contract}-init", args) 149 | runtime_bytecode = compilation_unit.bytecode_runtime(contract) 150 | if runtime_bytecode: 151 | _run(runtime_bytecode, f"{key}-{filename}-{contract}-runtime", args) 152 | else: 153 | logger.info("Runtime bytecode not available") 154 | except InvalidCompilation as e: 155 | logger.error(e) 156 | 157 | else: 158 | with open(args.filename, "rb") as f: 159 | bytecode = f.read() 160 | logger.info(f"Analyze {args.filename}") 161 | _run(bytecode, args.filename, args) 162 | 163 | if args.perf and cp: 164 | cp.disable() 165 | stats = pstats.Stats(cp).sort_stats("cumtime") 166 | stats.print_stats() 167 | 168 | 169 | if __name__ == "__main__": 170 | main() 171 | -------------------------------------------------------------------------------- /evm_cfg_builder/cfg/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crytic/evm_cfg_builder/98c9e9658387e76d20d84da6fa2ba8e2fbb9b65a/evm_cfg_builder/cfg/__init__.py -------------------------------------------------------------------------------- /evm_cfg_builder/cfg/basic_block.py: -------------------------------------------------------------------------------- 1 | from typing import List, Dict 2 | 3 | from pyevmasm import Instruction 4 | 5 | 6 | class BasicBlock: 7 | def __init__(self) -> None: 8 | self._instructions: List[Instruction] = [] 9 | # incoming_basic_blocks and outgoing_basic_blocks are dict 10 | # The key is the function hash 11 | # It allows to compute the VSA only 12 | # On a specific function, to separate 13 | # the merging 14 | self._incoming_basic_blocks: Dict[int, List["BasicBlock"]] = {} 15 | self._outgoing_basic_blocks: Dict[int, List["BasicBlock"]] = {} 16 | 17 | # List of function keys that reaches the BB 18 | self.reacheable: List[int] = [] 19 | 20 | def add_instruction(self, instruction: Instruction) -> None: 21 | self._instructions.append(instruction) 22 | 23 | def __repr__(self) -> str: 24 | return f"" 25 | 26 | @property 27 | def start(self) -> Instruction: 28 | """First instruction of the basic block.""" 29 | return self._instructions[0] 30 | 31 | @property 32 | def end(self) -> Instruction: 33 | """Last instruction of the basic block.""" 34 | return self._instructions[-1] 35 | 36 | @property 37 | def instructions(self) -> List[Instruction]: 38 | return list(self._instructions) 39 | 40 | def incoming_basic_blocks(self, key: int) -> List["BasicBlock"]: 41 | return self._incoming_basic_blocks.get(key, []) 42 | 43 | def outgoing_basic_blocks(self, key: int) -> List["BasicBlock"]: 44 | return self._outgoing_basic_blocks.get(key, []) 45 | 46 | @property 47 | def incoming_basic_blocks_as_dict(self) -> Dict[int, List["BasicBlock"]]: 48 | return self._incoming_basic_blocks 49 | 50 | @property 51 | def outgoing_basic_blocks_as_dict(self) -> Dict[int, List["BasicBlock"]]: 52 | return self._outgoing_basic_blocks 53 | 54 | @property 55 | def all_incoming_basic_blocks(self) -> List["BasicBlock"]: 56 | bbs_ = self._incoming_basic_blocks.values() 57 | bbs = [bb for sublist in bbs_ for bb in sublist] 58 | return list(set(bbs)) 59 | 60 | @property 61 | def all_outgoing_basic_blocks(self) -> List["BasicBlock"]: 62 | bbs_ = self._outgoing_basic_blocks.values() 63 | bbs = [bb for sublist in bbs_ for bb in sublist] 64 | return list(set(bbs)) 65 | 66 | def add_incoming_basic_block(self, father: "BasicBlock", key: int) -> None: 67 | if not key in self._incoming_basic_blocks: 68 | self._incoming_basic_blocks[key] = [] 69 | if father not in self._incoming_basic_blocks[key]: 70 | self._incoming_basic_blocks[key].append(father) 71 | 72 | def add_outgoing_basic_block(self, son: "BasicBlock", key: int) -> None: 73 | if not key in self._outgoing_basic_blocks: 74 | self._outgoing_basic_blocks[key] = [] 75 | if son not in self._outgoing_basic_blocks[key]: 76 | self._outgoing_basic_blocks[key].append(son) 77 | 78 | def ends_with_jumpi(self) -> bool: 79 | return self.end.name == "JUMPI" 80 | 81 | def ends_with_jump_or_jumpi(self) -> bool: 82 | return self.end.name in ("JUMP", "JUMPI") 83 | -------------------------------------------------------------------------------- /evm_cfg_builder/cfg/cfg.py: -------------------------------------------------------------------------------- 1 | import logging 2 | import re 3 | from typing import Optional, Union, Tuple, List, Dict 4 | 5 | from pyevmasm import disassemble_all, Instruction 6 | 7 | from evm_cfg_builder.cfg.basic_block import BasicBlock 8 | from evm_cfg_builder.cfg.function import Function 9 | from evm_cfg_builder.known_hashes.known_hashes import known_hashes 10 | 11 | 12 | logger = logging.getLogger("evm-cfg-builder") 13 | 14 | BASIC_BLOCK_END = [ 15 | "STOP", 16 | "SELFDESTRUCT", 17 | "RETURN", 18 | "REVERT", 19 | "INVALID", 20 | "SUICIDE", 21 | "JUMP", 22 | "JUMPI", 23 | ] 24 | 25 | 26 | def convert_bytecode(bytecode: Optional[Union[str, bytes]]) -> Optional[bytes]: 27 | """ 28 | Convert the bytecode to bytes 29 | Remove trailing \n 30 | Remove '0x' 31 | Replace library call to 'AAA.AAA' 32 | Args: 33 | bytecode (str|bytes) 34 | Return: 35 | (bytes) 36 | """ 37 | if bytecode is not None: 38 | if isinstance(bytecode, str): 39 | for library_found in re.findall(r"__.{36}__", bytecode): 40 | logger.info("Replace library %s by %s", library_found, "A" * 40) 41 | bytecode = re.sub(r"__.{36}__", "A" * 40, bytecode) 42 | 43 | bytecode = bytecode.replace("\n", "") 44 | if bytecode.startswith("0x"): 45 | bytecode = bytes.fromhex(bytecode[2:]) 46 | else: 47 | bytecode = bytes.fromhex(bytecode) 48 | else: 49 | for library_found in re.findall(b"__.{36}__", bytecode): 50 | logger.info("Replace library %s by %s", library_found, "A" * 40) 51 | bytecode = re.sub(b"__.{36}__", b"A" * 40, bytecode) 52 | if bytecode.startswith(b"0x"): 53 | bytecode = bytes.fromhex(bytecode[2:].decode().replace("\n", "")) 54 | 55 | return bytecode 56 | 57 | 58 | class CFG: 59 | """Implements the control flow graph (CFG) of an EVM bytecode.""" 60 | 61 | # pylint: disable=too-many-arguments 62 | def __init__( 63 | self, 64 | bytecode: Optional[Union[str, bytes]] = None, 65 | remove_metadata: bool = True, 66 | analyze: bool = True, 67 | optimization_enabled: bool = True, 68 | compute_cfgs: bool = True, 69 | ) -> None: 70 | """Initialize an EVM CFG. 71 | 72 | :param bytecode: The EVM bytecode 73 | :type bytecode: None, str, bytes 74 | :param remove_metadata: Automatically remove metadata 75 | :type remove_metadata: bool 76 | :param analyze: Automatically analyze the bytecode 77 | :type analyze: bool 78 | """ 79 | self._functions: Dict[int, Function] = {} 80 | # __basic_blocks is a dict that matches 81 | # an address to the basic block 82 | # The address can be the first or the last 83 | # instructions 84 | self._basic_blocks: Dict[int, BasicBlock] = {} 85 | self._instructions: Dict[int, Instruction] = {} 86 | 87 | self._optimization_enabled = optimization_enabled 88 | 89 | assert isinstance(bytecode, (type(None), str, bytes)) 90 | 91 | self._bytecode = convert_bytecode(bytecode) 92 | 93 | if remove_metadata: 94 | self.remove_metadata() 95 | if analyze: 96 | self.create_functions() 97 | if compute_cfgs: 98 | self.create_cfgs() 99 | 100 | def __repr__(self) -> str: 101 | return f"" 102 | 103 | @property 104 | def bytecode(self) -> Optional[bytes]: 105 | return self._bytecode 106 | 107 | @bytecode.setter 108 | def bytecode(self, bytecode: Optional[Union[str, bytes]]) -> None: 109 | assert isinstance(bytecode, (type(None), str, bytes)) 110 | 111 | bytecode = convert_bytecode(bytecode) 112 | 113 | self.clear() 114 | self._bytecode = bytecode 115 | 116 | @property 117 | def basic_blocks(self) -> List[BasicBlock]: 118 | """ 119 | Return the list of basic_block 120 | """ 121 | bbs = self._basic_blocks.values() 122 | return list(set(bbs)) 123 | 124 | @property 125 | def entry_point(self) -> BasicBlock: 126 | """ 127 | Return the entry point of the cfg (the basic block at 0x0) 128 | """ 129 | return self._basic_blocks[0] 130 | 131 | @property 132 | def functions(self) -> List[Function]: 133 | """ 134 | Return the list of functions 135 | """ 136 | return list(self._functions.values()) 137 | 138 | @property 139 | def instructions(self) -> List[Instruction]: 140 | """ 141 | Return the list of instructions 142 | """ 143 | return list(self._instructions.values()) 144 | 145 | def get_instruction_at(self, addr: int) -> Instruction: 146 | """Return the instruction at the provided address. 147 | 148 | :param addr: Address of instruction 149 | :type addr: int 150 | """ 151 | return self._instructions.get(addr) 152 | 153 | def get_basic_block_at(self, addr: int) -> Optional[BasicBlock]: 154 | """Return the basic block at the provided address. 155 | 156 | The address is either the starting or ending instruction of the 157 | basic block. 158 | 159 | :param addr: Address of basic block start or end 160 | :type addr: int 161 | :return: BasicBlock, None -- the requested basic block 162 | """ 163 | return self._basic_blocks.get(addr) 164 | 165 | def get_function_at(self, addr: int) -> Optional[Function]: 166 | """Return the function at the provided address. 167 | 168 | :param addr: Address of the function 169 | :type addr: int 170 | :return: Function, None -- the requested function 171 | """ 172 | return self._functions.get(addr) 173 | 174 | def create_functions(self) -> None: 175 | """ 176 | Create the functions. The CFGs are not computed 177 | :return: 178 | """ 179 | self.compute_basic_blocks() 180 | self.compute_functions(self._basic_blocks[0], True) 181 | self.add_function(Function(Function.DISPATCHER_ID, 0, self._basic_blocks[0], self)) 182 | 183 | for function in self.functions: 184 | if function.hash_id in known_hashes: 185 | function.name = known_hashes[function.hash_id] 186 | 187 | def create_cfgs(self) -> None: 188 | """ 189 | Compute the CFGs 190 | :return: 191 | """ 192 | # pylint: disable=import-outside-toplevel 193 | from evm_cfg_builder.value_analysis.value_set_analysis import StackValueAnalysis 194 | 195 | for function in self.functions: 196 | 197 | vsa = StackValueAnalysis( 198 | self, function.entry, function.hash_id, self._optimization_enabled 199 | ) 200 | bbs = vsa.analyze() 201 | 202 | function.basic_blocks = [self._basic_blocks[bb] for bb in bbs] 203 | 204 | if function.hash_id != Function.DISPATCHER_ID: 205 | function.check_payable() 206 | function.check_view() 207 | function.check_pure() 208 | 209 | def clear(self) -> None: 210 | self._functions = {} 211 | self._basic_blocks = {} 212 | self._instructions = {} 213 | self._bytecode = bytes() 214 | 215 | def remove_metadata(self) -> None: 216 | """ 217 | Init bytecode contains metadata that needs to be removed 218 | see http://solidity.readthedocs.io/en/v0.4.24/metadata.html#encoding-of-the-metadata-hash-in-the-bytecode 219 | """ 220 | if self.bytecode: 221 | self.bytecode = re.sub( 222 | bytes( 223 | r"\xa1\x65\x62\x7a\x7a\x72\x30\x58\x20[\x00-\xff]{32}\x00\x29".encode("charmap") 224 | ), 225 | b"", 226 | self.bytecode, 227 | ) 228 | 229 | def compute_basic_blocks(self) -> None: 230 | """ 231 | Split instructions into BasicBlock 232 | Args: 233 | self: CFG 234 | Returns: 235 | None 236 | """ 237 | # Do nothing if basic_blocks already exist 238 | if self._basic_blocks: 239 | return 240 | 241 | bb = BasicBlock() 242 | 243 | for instruction in disassemble_all(self.bytecode): 244 | self._instructions[instruction.pc] = instruction 245 | 246 | if instruction.name == "JUMPDEST": 247 | # JUMPDEST indicates a new BasicBlock. Set the end pc 248 | # of the current block, and switch to a new one. 249 | if bb.instructions: 250 | self._basic_blocks[bb.end.pc] = bb 251 | 252 | bb = BasicBlock() 253 | 254 | self._basic_blocks[instruction.pc] = bb 255 | 256 | bb.add_instruction(instruction) 257 | 258 | if bb.start.pc == instruction.pc: 259 | self._basic_blocks[instruction.pc] = bb 260 | 261 | if bb.end.name in BASIC_BLOCK_END: 262 | self._basic_blocks[bb.end.pc] = bb 263 | bb = BasicBlock() 264 | 265 | def compute_functions(self, block: "BasicBlock", is_entry_block: bool = False) -> None: 266 | """ 267 | Create function from basic block 268 | The heuristic skips the first basic block(s) as they are generated by solc. 269 | The heuristic checks for: 270 | - If the basic block contains CALLVALUE: Solidity 0.5.2 added a general 'payable' 271 | to contract (https://github.com/ethereum/solidity/releases/tag/v0.5.2). In that case nothing is executed 272 | (including no fallback function) 273 | - If the basic block contains CALLDATASIZE (checked by is_jump_to_function), the fallback function is executed 274 | (this was added at some point in Solidity 0.4.x, it might not be present in old versions 275 | """ 276 | if is_entry_block: 277 | if block.ends_with_jumpi(): 278 | ins = [i.name for i in block.instructions] 279 | if "CALLVALUE" in ins: 280 | # last_push 281 | assert len(block.instructions) > 2 282 | push = block.instructions[-2] 283 | assert push.name.startswith("PUSH") 284 | destination = push.operand 285 | true_branch = self._basic_blocks[destination] 286 | self.compute_functions(true_branch) 287 | return 288 | 289 | function_start, function_hash = is_jump_to_function(block) 290 | if function_start: 291 | # The disptacher can be a tree and not a list of comparison 292 | # As a result, if GT is in the basic block, we are branching to 293 | # a branch of the dispatcher tree rather than directy calling the funciton 294 | if "GT" in [i.name for i in block.instructions]: 295 | next_branch = self._basic_blocks[function_start] 296 | self.compute_functions(next_branch) 297 | 298 | else: 299 | assert function_hash 300 | new_function = Function( 301 | function_hash, function_start, self._basic_blocks[function_start], self 302 | ) 303 | 304 | self._functions[function_start] = new_function 305 | 306 | if block.ends_with_jumpi(): 307 | false_branch = self._basic_blocks[block.end.pc + 1] 308 | self.compute_functions(false_branch) 309 | 310 | def add_function(self, func: Function) -> None: 311 | assert isinstance(func, Function) 312 | self._functions[func.start_addr] = func 313 | 314 | def compute_simple_edges(self, key: int) -> None: 315 | for bb in self._basic_blocks.values(): 316 | 317 | if bb.end.name == "JUMPI": 318 | dst = self._basic_blocks[bb.end.pc + 1] 319 | bb.add_outgoing_basic_block(dst, key) 320 | dst.add_incoming_basic_block(bb, key) 321 | 322 | # A bb can be split in the middle if it has a JUMPDEST 323 | # Because another edge can target the JUMPDEST 324 | if bb.end.name not in BASIC_BLOCK_END: 325 | try: 326 | dst = self._basic_blocks[bb.end.pc + 1 + bb.end.operand_size] 327 | except KeyError: 328 | continue 329 | assert dst.start.name == "JUMPDEST" 330 | bb.add_outgoing_basic_block(dst, key) 331 | dst.add_incoming_basic_block(bb, key) 332 | 333 | def compute_reachability(self, entry_point: "BasicBlock", key: int) -> None: 334 | bbs_saw = [entry_point] 335 | 336 | bbs_to_explore = [entry_point] 337 | while bbs_to_explore: 338 | bb = bbs_to_explore.pop() 339 | for son in bb.outgoing_basic_blocks(key): 340 | if not son in bbs_saw: 341 | bbs_saw.append(son) 342 | bbs_to_explore.append(son) 343 | 344 | for bb in bbs_saw: 345 | bb.reacheable.append(key) 346 | 347 | # clean son/fathers that are created by compute_simple_edges 348 | # but are not reacheable 349 | for bb in self._basic_blocks.values(): 350 | if not bb in bbs_saw: 351 | if key in bb.incoming_basic_blocks_as_dict.keys(): 352 | bb.incoming_basic_blocks_as_dict.pop(key) 353 | if key in bb.outgoing_basic_blocks_as_dict.keys(): 354 | bb.outgoing_basic_blocks_as_dict.pop(key) 355 | 356 | def output_to_dot(self, base_filename: str) -> None: 357 | 358 | with open(f"{base_filename}-FULL_GRAPH.dot", "w", encoding="utf-8") as f: 359 | f.write("digraph{\n") 360 | for basic_block in self.basic_blocks: 361 | instructions_ = [f"{hex(ins.pc)}:{str(ins)}" for ins in basic_block.instructions] 362 | instructions = "\n".join(instructions_) 363 | 364 | f.write(f'{basic_block.start.pc}[label="{instructions}"]\n') 365 | 366 | for son in basic_block.all_outgoing_basic_blocks: 367 | f.write(f"{basic_block.start.pc} -> {son.start.pc}\n") 368 | 369 | f.write("\n}") 370 | 371 | 372 | def is_jump_to_function(block: BasicBlock) -> Tuple[Optional[int], Optional[int]]: 373 | """ 374 | Heuristic: 375 | Recent solc version add a first check if calldatasize <4 and jump in fallback 376 | Args: 377 | block (BasicBlock) 378 | Returns: 379 | (int): function hash, or None 380 | """ 381 | has_calldata_size = False 382 | last_pushed_value: Optional[int] = None 383 | previous_last_pushed_value: Optional[int] = None 384 | for i in block.instructions: 385 | if i.name == "CALLDATASIZE": 386 | has_calldata_size = True 387 | 388 | if i.name.startswith("PUSH"): 389 | previous_last_pushed_value = last_pushed_value 390 | last_pushed_value = i.operand 391 | 392 | if block.ends_with_jumpi() and has_calldata_size: 393 | return last_pushed_value, -1 394 | 395 | if block.ends_with_jumpi() and previous_last_pushed_value: 396 | return last_pushed_value, previous_last_pushed_value 397 | 398 | return None, None 399 | -------------------------------------------------------------------------------- /evm_cfg_builder/cfg/function.py: -------------------------------------------------------------------------------- 1 | import logging 2 | from typing import List, TYPE_CHECKING 3 | 4 | if TYPE_CHECKING: 5 | from evm_cfg_builder.cfg.cfg import CFG 6 | from evm_cfg_builder.cfg.basic_block import BasicBlock 7 | 8 | logger = logging.getLogger("evm-cfg-builder") 9 | 10 | 11 | # pylint: disable=too-many-instance-attributes 12 | class Function: 13 | DISPATCHER_ID = -2 14 | FALLBACK_ID = -1 15 | 16 | def __init__(self, hash_id: int, start_addr: int, entry_basic_block: "BasicBlock", cfg: "CFG"): 17 | self._hash_id: int = hash_id 18 | self._start_addr: int = start_addr 19 | self._entry: "BasicBlock" = entry_basic_block 20 | if hash_id == self.FALLBACK_ID: 21 | self.name = "_fallback" 22 | elif hash_id == Function.DISPATCHER_ID: 23 | self.name = "_dispatcher" 24 | else: 25 | self._name = hex(hash_id) 26 | self._basic_blocks: List["BasicBlock"] = [] 27 | self._attributes: List[str] = [] 28 | self._cfg: "CFG" = cfg 29 | 30 | def __repr__(self) -> str: 31 | return f"" 32 | 33 | @property 34 | def start_addr(self) -> int: 35 | return self._start_addr 36 | 37 | @property 38 | def hash_id(self) -> int: 39 | return self._hash_id 40 | 41 | @property 42 | def key(self) -> int: 43 | return self.hash_id 44 | 45 | @property 46 | def name(self) -> str: 47 | return self._name 48 | 49 | @name.setter 50 | def name(self, n: str) -> None: 51 | self._name = n 52 | 53 | @property 54 | def basic_blocks(self) -> List["BasicBlock"]: 55 | """ 56 | Returns 57 | list(BasicBlock) 58 | """ 59 | return self._basic_blocks 60 | 61 | @basic_blocks.setter 62 | def basic_blocks(self, bbs: List["BasicBlock"]) -> None: 63 | self._basic_blocks = bbs 64 | 65 | @property 66 | def entry(self) -> "BasicBlock": 67 | return self._entry 68 | 69 | @property 70 | def attributes(self) -> List[str]: 71 | """ 72 | Returns 73 | list(str) 74 | """ 75 | return self._attributes 76 | 77 | def add_attributes(self, attr: str) -> None: 78 | if not attr in self.attributes: 79 | self._attributes.append(attr) 80 | 81 | def check_payable(self) -> None: 82 | entry = self.entry 83 | if any(ins.name == "CALLVALUE" for ins in entry.instructions): 84 | return 85 | self.add_attributes("payable") 86 | 87 | def check_view(self) -> None: 88 | changing_state_ops = [ 89 | "CREATE", 90 | "CREATE2", 91 | "CALL", 92 | "CALLCODE", 93 | "DELEGATECALL", 94 | "SELFDESTRUCT", 95 | "SSTORE", 96 | ] 97 | 98 | for bb in self.basic_blocks: 99 | if any(ins.name in changing_state_ops for ins in bb.instructions): 100 | return 101 | 102 | self.add_attributes("view") 103 | 104 | def check_pure(self) -> None: 105 | state_ops = [ 106 | "CREATE", 107 | "CREATE2", 108 | "CALL", 109 | "CALLCODE", 110 | "DELEGATECALL", 111 | "SELFDESTRUCT", 112 | "SSTORE", 113 | "ADDRESS", 114 | "BALANCE", 115 | "ORIGIN", 116 | "CALLER", 117 | "CALLVALUE", 118 | "CALLDATALOAD", 119 | "CALLDATASIZE", 120 | "CALLDATACOPY", 121 | "CODESIZE", 122 | "CODECOPY", 123 | "EXTCODESIZE", 124 | "EXTCODEHASH", 125 | "EXTCODECOPY", 126 | "RETURNDATASIZE", 127 | "RETURNDATACOPY", 128 | "BLOCKHASH", 129 | "COINBASE", 130 | "TIMESTAMP", 131 | "NUMBER", 132 | "DIFFICULTY", 133 | "GASLIMIT", 134 | "LOG0", 135 | "LOG1", 136 | "LOG2", 137 | "LOG3", 138 | "LOG4", 139 | "CALL", 140 | "CALLCODE", 141 | "DELEGATECALL", 142 | "STATICCALL", 143 | "SELFDESTRUCT", 144 | "SSTORE", 145 | "SLOAD", 146 | ] 147 | 148 | for bb in self.basic_blocks: 149 | if any(ins.name in state_ops for ins in bb.instructions): 150 | return 151 | 152 | self.add_attributes("pure") 153 | 154 | def __str__(self) -> str: 155 | attrs = "" 156 | if self.attributes: 157 | attrs = ", " + ",".join(self.attributes) 158 | return f"{self.name}, {len(self.basic_blocks)} #bbs {attrs}" 159 | 160 | def output_to_dot(self, base_filename: str) -> None: 161 | 162 | if self.key == Function.DISPATCHER_ID: 163 | self.output_dispatcher_to_dot(base_filename) 164 | return 165 | 166 | with open(f"{base_filename}{self.name}.dot", "w", encoding="utf-8") as f: 167 | f.write("digraph{\n") 168 | for basic_block in self.basic_blocks: 169 | instructions_ = [f"{hex(ins.pc)}:{str(ins)}" for ins in basic_block.instructions] 170 | instructions = "\n".join(instructions_) 171 | 172 | f.write(f'{basic_block.start.pc}[label="{instructions}"]\n') 173 | 174 | for son in basic_block.outgoing_basic_blocks(self.key): 175 | f.write(f"{basic_block.start.pc} -> {son.start.pc}\n") 176 | 177 | if not basic_block.outgoing_basic_blocks(self.key): 178 | if basic_block.ends_with_jump_or_jumpi(): 179 | logger.error(f"Missing branches {self.name}:{hex(basic_block.end.pc)}") 180 | 181 | f.write("\n}") 182 | 183 | def output_dispatcher_to_dot(self, base_filename: str) -> None: 184 | 185 | with open(f"{base_filename}{self.name}.dot", "w", encoding="utf-8") as f: 186 | f.write("digraph{\n") 187 | for basic_block in self.basic_blocks: 188 | instructions_ = [f"{hex(ins.pc)}:{str(ins)}" for ins in basic_block.instructions] 189 | instructions = "\n".join(instructions_) 190 | 191 | f.write(f'{basic_block.start.pc}[label="{instructions}"]\n') 192 | 193 | for son in basic_block.outgoing_basic_blocks(self.key): 194 | f.write(f"{basic_block.start.pc} -> {son.start.pc}\n") 195 | 196 | if not basic_block.outgoing_basic_blocks(self.key): 197 | if basic_block.ends_with_jump_or_jumpi(): 198 | logger.error(f"Missing branches {self.name}:{hex(basic_block.end.pc)}") 199 | for function in self._cfg.functions: 200 | if function != self: 201 | f.write(f'{function.start_addr}[label="Call {function.name}"]\n') 202 | 203 | f.write("\n}") 204 | -------------------------------------------------------------------------------- /evm_cfg_builder/known_hashes/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crytic/evm_cfg_builder/98c9e9658387e76d20d84da6fa2ba8e2fbb9b65a/evm_cfg_builder/known_hashes/__init__.py -------------------------------------------------------------------------------- /evm_cfg_builder/known_hashes/download_sigs.py: -------------------------------------------------------------------------------- 1 | """ 2 | Queries and import function signatures from https://www.4byte.directory/ 3 | """ 4 | import sys 5 | from typing import Tuple, Dict 6 | 7 | try: 8 | import requests 9 | except ImportError: 10 | print('Run "pip install requests" t run this script') 11 | sys.exit(0) 12 | import known_hashes 13 | 14 | 15 | def get_results(url: str, num_parsed: int) -> Tuple[str, int]: 16 | """ 17 | Queries the API for a json formatted list of functions and their associated function signatures 18 | """ 19 | resp = requests.get(url) 20 | resp.raise_for_status() 21 | 22 | json_data = resp.json() 23 | next_url: str = json_data["next"] 24 | results = json_data["results"] 25 | 26 | cur_parsed = 0 27 | for result in results: 28 | hex_sig = result["hex_signature"] 29 | text_sig = result["text_signature"] 30 | # If a key already exists, do not overwrite it. This helps cover the corner 31 | # case of a hash collision. An example of this is 32 | # owner() and ideal_warn_timed(uint256,uint128) 33 | if int(hex_sig, 16) not in known_hashes.known_hashes: 34 | # hex_sig is a 'str', parse it into an 'int' 35 | known_hashes.known_hashes[int(hex_sig, 16)] = text_sig 36 | 37 | cur_parsed += 1 38 | 39 | num_parsed += cur_parsed 40 | # Display a status update 41 | percentage_comp = num_parsed / json_data["count"] * 100 42 | print(f"Parsed {num_parsed}/{json_data['count']} results ({percentage_comp:.2f}%)") 43 | 44 | return next_url, cur_parsed 45 | 46 | 47 | def iterate_paginated_results(url: str) -> None: 48 | """ 49 | 4byte paginates the results for effeciency because there are > 400,000 function signatures. 50 | This will move from page to page and collect all the signatures available. 51 | """ 52 | results_parsed = 0 53 | while True: 54 | url, num_parsed = get_results(url, results_parsed) 55 | if not url: 56 | break 57 | 58 | results_parsed += num_parsed 59 | 60 | print("Finished iterating over results") 61 | 62 | 63 | def sort_dict(unsorted_dict: Dict) -> Dict: 64 | sorted_dict = dict(sorted(unsorted_dict.items())) 65 | return sorted_dict 66 | 67 | 68 | def save_results() -> None: 69 | """ 70 | Write the dict to the known_hashes.py file 71 | We write the key and value as shown below to maintain the current format 72 | of the key being an int - displayed as hex (4 bytes). 73 | """ 74 | sorted_dict = sort_dict(known_hashes.known_hashes) 75 | with open("known_hashes.py", "w", encoding="utf-8") as f: 76 | f.write("known_hashes = {\n") 77 | for k, v in sorted_dict.items(): 78 | # format the key as so 79 | # pad the output with 0's (#0) 80 | # pad the output to 10 char's (10) 81 | # format into hex representation (x) 82 | f.write(f" {k:#010x}: '{v}',\n") 83 | f.write("}\n") 84 | 85 | print("Saved results!") 86 | 87 | 88 | if __name__ == "__main__": 89 | iterate_paginated_results("https://www.4byte.directory/api/v1/signatures/") 90 | save_results() 91 | -------------------------------------------------------------------------------- /evm_cfg_builder/value_analysis/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crytic/evm_cfg_builder/98c9e9658387e76d20d84da6fa2ba8e2fbb9b65a/evm_cfg_builder/value_analysis/__init__.py -------------------------------------------------------------------------------- /examples/expected_output/explore_cfg.txt: -------------------------------------------------------------------------------- 1 | -> [, ] 2 | -> [, ] 3 | -> [] 4 | -> [] 5 | -> [, ] 6 | -> [] 7 | -> [] 8 | -> [] 9 | -> [, ] 10 | -> [] 11 | -> [] 12 | -> [] 13 | -> [, ] 14 | -> [] 15 | -> [] 16 | -> [] 17 | -> [, ] 18 | -> [] 19 | -> [] 20 | -> [] 21 | -> [, ] 22 | -> [] 23 | -> [] 24 | -> [] 25 | -> [, ] 26 | -> [] 27 | -> [] 28 | -> [] 29 | -> [, ] 30 | -> [] 31 | -> [] 32 | -> [] 33 | -> [, ] 34 | -> [] 35 | -> [] 36 | -> [] 37 | -> [, ] 38 | -> [] 39 | -> [, ] 40 | -> [, ] 41 | -> [] 42 | -> [] 43 | -> [, ] 44 | -> [] 45 | -> [] 46 | -> [] 47 | -> [, ] 48 | -> [] 49 | -> [] 50 | -> [, ] 51 | -> [] 52 | -> [, ] 53 | -> [, ] 54 | -> [] 55 | -> [, ] 56 | -> [] 57 | -> [, ] 58 | -> [] 59 | -> [] 60 | -> [] 61 | -> [, ] 62 | -> [] 63 | -> [, ] 64 | -> [, ] 65 | -> [] 66 | -> [, ] 67 | -> [, ] 68 | -> [] 69 | -> [, ] 70 | -> [, ] 71 | -> [] 72 | -> [] 73 | -> [, ] 74 | -> [] 75 | -> [] 76 | -> [] 77 | -> [, ] 78 | -> [] 79 | -> [, ] 80 | -> [, ] 81 | -> [] 82 | -> [, ] 83 | -> [] 84 | -> [, ] 85 | -> [] 86 | -> [] 87 | -> [, ] 88 | -> [] 89 | -> [] 90 | -> [] 91 | -> [, ] 92 | -> [] 93 | -> [] 94 | -> [] 95 | -> [] 96 | -> [] 97 | -> [, ] 98 | -> [, ] 99 | -> [] 100 | -------------------------------------------------------------------------------- /examples/explore_cfg.py: -------------------------------------------------------------------------------- 1 | import sys 2 | from evm_cfg_builder.cfg.cfg import CFG 3 | 4 | if len(sys.argv) != 2: 5 | print("Usage python explore_cfg.py contract.evm") 6 | sys.exit(-1) 7 | 8 | with open(sys.argv[1], encoding="utf-8") as f: 9 | runtime_bytecode = f.read() 10 | 11 | cfg = CFG(runtime_bytecode) 12 | 13 | for basic_block in cfg.basic_blocks: 14 | print( 15 | f"{basic_block} -> {sorted(basic_block.all_outgoing_basic_blocks, key=lambda x:x.start.pc)}" 16 | ) 17 | -------------------------------------------------------------------------------- /examples/explore_functions.py: -------------------------------------------------------------------------------- 1 | import sys 2 | from evm_cfg_builder.cfg.cfg import CFG 3 | 4 | if len(sys.argv) != 2: 5 | print("Usage python explore_functions.py contract.evm") 6 | sys.exit(-1) 7 | 8 | with open(sys.argv[1], encoding="utf-8") as f: 9 | runtime_bytecode = f.read() 10 | 11 | cfg = CFG(runtime_bytecode) 12 | 13 | for function in sorted(cfg.functions, key=lambda x: x.start_addr): 14 | print(f"Function {function.name}") 15 | # Each function may have a list of attributes 16 | # An attribute can be: 17 | # - payable 18 | # - view 19 | # - pure 20 | if sorted(function.attributes): 21 | print("\tAttributes:") 22 | for attr in function.attributes: 23 | print(f"\t\t-{attr}") 24 | 25 | print("\n\tBasic Blocks:") 26 | for basic_block in sorted(function.basic_blocks, key=lambda x: x.start.pc): 27 | # Each basic block has a start and end instruction 28 | # instructions are pyevmasm.Instruction objects 29 | print(f"\t- @{len(basic_block.start.pc)}-{hex(basic_block.end.pc)}") 30 | 31 | print("\t\tInstructions:") 32 | for ins in basic_block.instructions: 33 | print(f"\t\t- {ins.name}") 34 | 35 | # Each Basic block has a list of incoming and outgoing basic blocks 36 | # A basic block can be shared by different functions 37 | # And the list of incoming/outgoing basic blocks depends of the function 38 | # incoming_basic_blocks(function_key) returns the list for the given function 39 | print("\t\tIncoming basic_block:") 40 | for incoming_bb in sorted( 41 | basic_block.incoming_basic_blocks(function.key), key=lambda x: x.start.pc 42 | ): 43 | print(f"\t\t- {incoming_bb}") 44 | 45 | print("\t\tOutgoing basic_block:") 46 | for outgoing_bb in sorted( 47 | basic_block.outgoing_basic_blocks(function.key), key=lambda x: x.start.pc 48 | ): 49 | print(f"\t\t- {outgoing_bb}") 50 | -------------------------------------------------------------------------------- /examples/token-runtime.evm: -------------------------------------------------------------------------------- 1 | 0x6080604052600436106100af576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde03146100b4578063095ea7b31461014457806318160ddd146101a957806323b872dd146101d457806327e235e314610259578063313ce567146102b05780635c658165146102e157806370a082311461035857806395d89b41146103af578063a9059cbb1461043f578063dd62ed3e146104a4575b600080fd5b3480156100c057600080fd5b506100c961051b565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101095780820151818401526020810190506100ee565b50505050905090810190601f1680156101365780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561015057600080fd5b5061018f600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506105b9565b604051808215151515815260200191505060405180910390f35b3480156101b557600080fd5b506101be6106ab565b6040518082815260200191505060405180910390f35b3480156101e057600080fd5b5061023f600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506106b1565b604051808215151515815260200191505060405180910390f35b34801561026557600080fd5b5061029a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061094b565b6040518082815260200191505060405180910390f35b3480156102bc57600080fd5b506102c5610963565b604051808260ff1660ff16815260200191505060405180910390f35b3480156102ed57600080fd5b50610342600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610976565b6040518082815260200191505060405180910390f35b34801561036457600080fd5b50610399600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061099b565b6040518082815260200191505060405180910390f35b3480156103bb57600080fd5b506103c46109e4565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156104045780820151818401526020810190506103e9565b50505050905090810190601f1680156104315780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561044b57600080fd5b5061048a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610a82565b604051808215151515815260200191505060405180910390f35b3480156104b057600080fd5b50610505600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610bdb565b6040518082815260200191505060405180910390f35b60038054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105b15780601f10610586576101008083540402835291602001916105b1565b820191906000526020600020905b81548152906001019060200180831161059457829003601f168201915b505050505081565b600081600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b60005481565b600080600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101580156107825750828110155b151561078d57600080fd5b82600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555082600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8110156108da5782600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a360019150509392505050565b60016020528060005260406000206000915090505481565b600460009054906101000a900460ff1681565b6002602052816000526040600020602052806000526040600020600091509150505481565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60058054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610a7a5780601f10610a4f57610100808354040283529160200191610a7a565b820191906000526020600020905b815481529060010190602001808311610a5d57829003601f168201915b505050505081565b600081600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410151515610ad257600080fd5b81600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555081600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050929150505600a165627a7a7230582076ce5edca0cb79a34f44093c5ee1fcd5fadde8c358ba33d53c447da4f1d4e7ef0029 2 | -------------------------------------------------------------------------------- /examples/token.sol: -------------------------------------------------------------------------------- 1 | // from https://github.com/ConsenSys/Tokens/blob/fdf687c69d998266a95f15216b1955a4965a0a6d/contracts/eip20/ 2 | 3 | pragma solidity ^0.4.25; 4 | 5 | contract EIP20Interface { 6 | /* This is a slight change to the ERC20 base standard. 7 | function totalSupply() constant returns (uint256 supply); 8 | is replaced with: 9 | uint256 public totalSupply; 10 | This automatically creates a getter function for the totalSupply. 11 | This is moved to the base contract since public getter functions are not 12 | currently recognised as an implementation of the matching abstract 13 | function by the compiler. 14 | */ 15 | /// total amount of tokens 16 | uint256 public totalSupply; 17 | 18 | /// @param _owner The address from which the balance will be retrieved 19 | /// @return The balance 20 | function balanceOf(address _owner) public view returns (uint256 balance); 21 | 22 | /// @notice send `_value` token to `_to` from `msg.sender` 23 | /// @param _to The address of the recipient 24 | /// @param _value The amount of token to be transferred 25 | /// @return Whether the transfer was successful or not 26 | function transfer(address _to, uint256 _value) public returns (bool success); 27 | 28 | /// @notice send `_value` token to `_to` from `_from` on the condition it is approved by `_from` 29 | /// @param _from The address of the sender 30 | /// @param _to The address of the recipient 31 | /// @param _value The amount of token to be transferred 32 | /// @return Whether the transfer was successful or not 33 | function transferFrom(address _from, address _to, uint256 _value) public returns (bool success); 34 | 35 | /// @notice `msg.sender` approves `_spender` to spend `_value` tokens 36 | /// @param _spender The address of the account able to transfer the tokens 37 | /// @param _value The amount of tokens to be approved for transfer 38 | /// @return Whether the approval was successful or not 39 | function approve(address _spender, uint256 _value) public returns (bool success); 40 | 41 | /// @param _owner The address of the account owning tokens 42 | /// @param _spender The address of the account able to transfer the tokens 43 | /// @return Amount of remaining tokens allowed to spent 44 | function allowance(address _owner, address _spender) public view returns (uint256 remaining); 45 | 46 | // solhint-disable-next-line no-simple-event-func-name 47 | event Transfer(address indexed _from, address indexed _to, uint256 _value); 48 | event Approval(address indexed _owner, address indexed _spender, uint256 _value); 49 | } 50 | 51 | contract EIP20 is EIP20Interface { 52 | 53 | uint256 constant private MAX_UINT256 = 2**256 - 1; 54 | mapping (address => uint256) public balances; 55 | mapping (address => mapping (address => uint256)) public allowed; 56 | /* 57 | NOTE: 58 | The following variables are OPTIONAL vanities. One does not have to include them. 59 | They allow one to customise the token contract & in no way influences the core functionality. 60 | Some wallets/interfaces might not even bother to look at this information. 61 | */ 62 | string public name; //fancy name: eg Simon Bucks 63 | uint8 public decimals; //How many decimals to show. 64 | string public symbol; //An identifier: eg SBX 65 | 66 | function EIP20( 67 | uint256 _initialAmount, 68 | string _tokenName, 69 | uint8 _decimalUnits, 70 | string _tokenSymbol 71 | ) public { 72 | balances[msg.sender] = _initialAmount; // Give the creator all initial tokens 73 | totalSupply = _initialAmount; // Update total supply 74 | name = _tokenName; // Set the name for display purposes 75 | decimals = _decimalUnits; // Amount of decimals for display purposes 76 | symbol = _tokenSymbol; // Set the symbol for display purposes 77 | } 78 | 79 | function transfer(address _to, uint256 _value) public returns (bool success) { 80 | require(balances[msg.sender] >= _value); 81 | balances[msg.sender] -= _value; 82 | balances[_to] += _value; 83 | emit Transfer(msg.sender, _to, _value); //solhint-disable-line indent, no-unused-vars 84 | return true; 85 | } 86 | 87 | function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) { 88 | uint256 allowance = allowed[_from][msg.sender]; 89 | require(balances[_from] >= _value && allowance >= _value); 90 | balances[_to] += _value; 91 | balances[_from] -= _value; 92 | if (allowance < MAX_UINT256) { 93 | allowed[_from][msg.sender] -= _value; 94 | } 95 | emit Transfer(_from, _to, _value); //solhint-disable-line indent, no-unused-vars 96 | return true; 97 | } 98 | 99 | function balanceOf(address _owner) public view returns (uint256 balance) { 100 | return balances[_owner]; 101 | } 102 | 103 | function approve(address _spender, uint256 _value) public returns (bool success) { 104 | allowed[msg.sender][_spender] = _value; 105 | emit Approval(msg.sender, _spender, _value); //solhint-disable-line indent, no-unused-vars 106 | return true; 107 | } 108 | 109 | function allowance(address _owner, address _spender) public view returns (uint256 remaining) { 110 | return allowed[_owner][_spender]; 111 | } 112 | } 113 | -------------------------------------------------------------------------------- /mypy.ini: -------------------------------------------------------------------------------- 1 | [mypy] 2 | warn_incomplete_stub = true 3 | ignore_missing_imports = true 4 | disallow_untyped_calls = true 5 | disallow_untyped_defs = true 6 | disallow_incomplete_defs = true 7 | check_untyped_defs = true 8 | disallow_untyped_decorators = true 9 | warn_redundant_casts = true 10 | warn_no_return = true 11 | warn_unreachable = true 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.black] 2 | target-version = ["py36"] 3 | line-length = 100 4 | exclude = "known_hashes.py" 5 | [tool.pylint.messages_control] 6 | disable = """ 7 | missing-module-docstring, 8 | missing-class-docstring, 9 | missing-function-docstring, 10 | unnecessary-lambda, 11 | bad-continuation, 12 | cyclic-import, 13 | line-too-long, 14 | invalid-name, 15 | fixme, 16 | too-many-return-statements, 17 | too-many-ancestors, 18 | logging-fstring-interpolation, 19 | logging-not-lazy, 20 | duplicate-code, 21 | import-error, 22 | unsubscriptable-object 23 | """ 24 | ignore="known_hashes.py" 25 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | from setuptools import setup, find_packages 2 | 3 | with open("README.md", encoding="utf-8") as file_readme: 4 | long_description = file_readme.read() 5 | 6 | setup( 7 | name="evm-cfg-builder", 8 | description="EVM cfg builder written in Python 3.", 9 | url="https://github.com/trailofbits/evm_cfg_builder", 10 | author="Trail of Bits", 11 | version="0.3.1", 12 | packages=find_packages(), 13 | python_requires=">=3.6", 14 | install_requires=["pyevmasm>=0.1.1", "crytic-compile>=0.1.13"], 15 | license="AGPL-3.0", 16 | long_description=long_description, 17 | entry_points={"console_scripts": ["evm-cfg-builder = evm_cfg_builder.__main__:main"]}, 18 | ) 19 | -------------------------------------------------------------------------------- /tests/expected-fomo3d-output/fomo3d.evm_Hourglass().dot: -------------------------------------------------------------------------------- 1 | digraph{ 2 | 1403[label="0x57b:JUMPDEST 3 | 0x57c:CALLVALUE 4 | 0x57d:DUP1 5 | 0x57e:ISZERO 6 | 0x57f:PUSH2 0x587 7 | 0x582:JUMPI"] 8 | 1403 -> 1411 9 | 1403 -> 1415 10 | 1411[label="0x583:PUSH1 0x0 11 | 0x585:DUP1 12 | 0x586:REVERT"] 13 | 1415[label="0x587:JUMPDEST 14 | 0x588:POP 15 | 0x589:PUSH2 0x590 16 | 0x58c:PUSH2 0x17d2 17 | 0x58f:JUMP"] 18 | 1415 -> 6098 19 | 6098[label="0x17d2:JUMPDEST 20 | 0x17d3:JUMP"] 21 | 6098 -> 1424 22 | 1424[label="0x590:JUMPDEST 23 | 0x591:STOP"] 24 | 25 | } -------------------------------------------------------------------------------- /tests/expected-fomo3d-output/fomo3d.evm__dispatcher.dot: -------------------------------------------------------------------------------- 1 | digraph{ 2 | 0[label="0x0:PUSH1 0x80 3 | 0x2:PUSH1 0x40 4 | 0x4:MSTORE 5 | 0x5:PUSH1 0x4 6 | 0x7:CALLDATASIZE 7 | 0x8:LT 8 | 0x9:PUSH2 0x169 9 | 0xc:JUMPI"] 10 | 0 -> 13 11 | 0 -> 361 12 | 13[label="0xd:PUSH1 0x0 13 | 0xf:CALLDATALOAD 14 | 0x10:PUSH29 0x100000000000000000000000000000000000000000000000000000000 15 | 0x2e:SWAP1 16 | 0x2f:DIV 17 | 0x30:PUSH4 0xffffffff 18 | 0x35:AND 19 | 0x36:DUP1 20 | 0x37:PUSH3 0x65318b 21 | 0x3b:EQ 22 | 0x3c:PUSH2 0x177 23 | 0x3f:JUMPI"] 24 | 13 -> 64 25 | 13 -> 375 26 | 64[label="0x40:DUP1 27 | 0x41:PUSH4 0x6fdde03 28 | 0x46:EQ 29 | 0x47:PUSH2 0x1ce 30 | 0x4a:JUMPI"] 31 | 64 -> 75 32 | 64 -> 462 33 | 75[label="0x4b:DUP1 34 | 0x4c:PUSH4 0x10d0ffdd 35 | 0x51:EQ 36 | 0x52:PUSH2 0x25e 37 | 0x55:JUMPI"] 38 | 75 -> 86 39 | 75 -> 606 40 | 86[label="0x56:DUP1 41 | 0x57:PUSH4 0x18160ddd 42 | 0x5c:EQ 43 | 0x5d:PUSH2 0x29f 44 | 0x60:JUMPI"] 45 | 86 -> 97 46 | 86 -> 671 47 | 97[label="0x61:DUP1 48 | 0x62:PUSH4 0x22609373 49 | 0x67:EQ 50 | 0x68:PUSH2 0x2ca 51 | 0x6b:JUMPI"] 52 | 97 -> 108 53 | 97 -> 714 54 | 108[label="0x6c:DUP1 55 | 0x6d:PUSH4 0x27defa1f 56 | 0x72:EQ 57 | 0x73:PUSH2 0x30b 58 | 0x76:JUMPI"] 59 | 108 -> 119 60 | 108 -> 779 61 | 119[label="0x77:DUP1 62 | 0x78:PUSH4 0x313ce567 63 | 0x7d:EQ 64 | 0x7e:PUSH2 0x33a 65 | 0x81:JUMPI"] 66 | 119 -> 130 67 | 119 -> 826 68 | 130[label="0x82:DUP1 69 | 0x83:PUSH4 0x392efb52 70 | 0x88:EQ 71 | 0x89:PUSH2 0x36b 72 | 0x8c:JUMPI"] 73 | 130 -> 141 74 | 130 -> 875 75 | 141[label="0x8d:DUP1 76 | 0x8e:PUSH4 0x3ccfd60b 77 | 0x93:EQ 78 | 0x94:PUSH2 0x3b4 79 | 0x97:JUMPI"] 80 | 141 -> 152 81 | 141 -> 948 82 | 152[label="0x98:DUP1 83 | 0x99:PUSH4 0x4b750334 84 | 0x9e:EQ 85 | 0x9f:PUSH2 0x3cb 86 | 0xa2:JUMPI"] 87 | 152 -> 163 88 | 152 -> 971 89 | 163[label="0xa3:DUP1 90 | 0xa4:PUSH4 0x56d399e8 91 | 0xa9:EQ 92 | 0xaa:PUSH2 0x3f6 93 | 0xad:JUMPI"] 94 | 163 -> 174 95 | 163 -> 1014 96 | 174[label="0xae:DUP1 97 | 0xaf:PUSH4 0x688abbf7 98 | 0xb4:EQ 99 | 0xb5:PUSH2 0x421 100 | 0xb8:JUMPI"] 101 | 174 -> 185 102 | 174 -> 1057 103 | 185[label="0xb9:DUP1 104 | 0xba:PUSH4 0x6b2f4632 105 | 0xbf:EQ 106 | 0xc0:PUSH2 0x464 107 | 0xc3:JUMPI"] 108 | 185 -> 196 109 | 185 -> 1124 110 | 196[label="0xc4:DUP1 111 | 0xc5:PUSH4 0x70a08231 112 | 0xca:EQ 113 | 0xcb:PUSH2 0x48f 114 | 0xce:JUMPI"] 115 | 196 -> 207 116 | 196 -> 1167 117 | 207[label="0xcf:DUP1 118 | 0xd0:PUSH4 0x8328b610 119 | 0xd5:EQ 120 | 0xd6:PUSH2 0x4e6 121 | 0xd9:JUMPI"] 122 | 207 -> 218 123 | 207 -> 1254 124 | 218[label="0xda:DUP1 125 | 0xdb:PUSH4 0x8620410b 126 | 0xe0:EQ 127 | 0xe1:PUSH2 0x513 128 | 0xe4:JUMPI"] 129 | 218 -> 229 130 | 218 -> 1299 131 | 229[label="0xe5:DUP1 132 | 0xe6:PUSH4 0x89135ae9 133 | 0xeb:EQ 134 | 0xec:PUSH2 0x53e 135 | 0xef:JUMPI"] 136 | 229 -> 240 137 | 229 -> 1342 138 | 240[label="0xf0:DUP1 139 | 0xf1:PUSH4 0x8fea64bd 140 | 0xf6:EQ 141 | 0xf7:PUSH2 0x57b 142 | 0xfa:JUMPI"] 143 | 240 -> 251 144 | 240 -> 1403 145 | 251[label="0xfb:DUP1 146 | 0xfc:PUSH4 0x949e8acd 147 | 0x101:EQ 148 | 0x102:PUSH2 0x592 149 | 0x105:JUMPI"] 150 | 251 -> 262 151 | 251 -> 1426 152 | 262[label="0x106:DUP1 153 | 0x107:PUSH4 0x95d89b41 154 | 0x10c:EQ 155 | 0x10d:PUSH2 0x5bd 156 | 0x110:JUMPI"] 157 | 262 -> 273 158 | 262 -> 1469 159 | 273[label="0x111:DUP1 160 | 0x112:PUSH4 0xa8e04f34 161 | 0x117:EQ 162 | 0x118:PUSH2 0x64d 163 | 0x11b:JUMPI"] 164 | 273 -> 284 165 | 273 -> 1613 166 | 284[label="0x11c:DUP1 167 | 0x11d:PUSH4 0xa9059cbb 168 | 0x122:EQ 169 | 0x123:PUSH2 0x664 170 | 0x126:JUMPI"] 171 | 284 -> 295 172 | 284 -> 1636 173 | 295[label="0x127:DUP1 174 | 0x128:PUSH4 0xb84c8246 175 | 0x12d:EQ 176 | 0x12e:PUSH2 0x6c9 177 | 0x131:JUMPI"] 178 | 295 -> 306 179 | 295 -> 1737 180 | 306[label="0x132:DUP1 181 | 0x133:PUSH4 0xc47f0027 182 | 0x138:EQ 183 | 0x139:PUSH2 0x732 184 | 0x13c:JUMPI"] 185 | 306 -> 317 186 | 306 -> 1842 187 | 317[label="0x13d:DUP1 188 | 0x13e:PUSH4 0xe4849b32 189 | 0x143:EQ 190 | 0x144:PUSH2 0x79b 191 | 0x147:JUMPI"] 192 | 317 -> 328 193 | 317 -> 1947 194 | 328[label="0x148:DUP1 195 | 0x149:PUSH4 0xe9fad8ee 196 | 0x14e:EQ 197 | 0x14f:PUSH2 0x7c8 198 | 0x152:JUMPI"] 199 | 328 -> 339 200 | 328 -> 1992 201 | 339[label="0x153:DUP1 202 | 0x154:PUSH4 0xf088d547 203 | 0x159:EQ 204 | 0x15a:PUSH2 0x7df 205 | 0x15d:JUMPI"] 206 | 339 -> 350 207 | 339 -> 2015 208 | 350[label="0x15e:DUP1 209 | 0x15f:PUSH4 0xfdb5a03e 210 | 0x164:EQ 211 | 0x165:PUSH2 0x829 212 | 0x168:JUMPI"] 213 | 350 -> 361 214 | 350 -> 2089 215 | 361[label="Call _fallback"] 216 | 375[label="Call dividendsOf(address)"] 217 | 462[label="Call name()"] 218 | 606[label="Call calculateTokensReceived(uint256)"] 219 | 671[label="Call totalSupply()"] 220 | 714[label="Call calculateEthereumReceived(uint256)"] 221 | 779[label="Call onlyAmbassadors()"] 222 | 826[label="Call decimals()"] 223 | 875[label="Call administrators(bytes32)"] 224 | 948[label="Call withdraw()"] 225 | 971[label="Call sellPrice()"] 226 | 1014[label="Call stakingRequirement()"] 227 | 1057[label="Call myDividends(bool)"] 228 | 1124[label="Call totalEthereumBalance()"] 229 | 1167[label="Call balanceOf(address)"] 230 | 1254[label="Call setStakingRequirement(uint256)"] 231 | 1299[label="Call buyPrice()"] 232 | 1342[label="Call setAdministrator(bytes32,bool)"] 233 | 1403[label="Call Hourglass()"] 234 | 1426[label="Call myTokens()"] 235 | 1469[label="Call symbol()"] 236 | 1613[label="Call disableInitialStage()"] 237 | 1636[label="Call transfer(address,uint256)"] 238 | 1737[label="Call setSymbol(string)"] 239 | 1842[label="Call setName(string)"] 240 | 1947[label="Call sell(uint256)"] 241 | 1992[label="Call exit()"] 242 | 2015[label="Call buy(address)"] 243 | 2089[label="Call reinvest()"] 244 | 245 | } -------------------------------------------------------------------------------- /tests/expected-fomo3d-output/fomo3d.evm_administrators(bytes32).dot: -------------------------------------------------------------------------------- 1 | digraph{ 2 | 875[label="0x36b:JUMPDEST 3 | 0x36c:CALLVALUE 4 | 0x36d:DUP1 5 | 0x36e:ISZERO 6 | 0x36f:PUSH2 0x377 7 | 0x372:JUMPI"] 8 | 875 -> 883 9 | 875 -> 887 10 | 883[label="0x373:PUSH1 0x0 11 | 0x375:DUP1 12 | 0x376:REVERT"] 13 | 887[label="0x377:JUMPDEST 14 | 0x378:POP 15 | 0x379:PUSH2 0x39a 16 | 0x37c:PUSH1 0x4 17 | 0x37e:DUP1 18 | 0x37f:CALLDATASIZE 19 | 0x380:SUB 20 | 0x381:DUP2 21 | 0x382:ADD 22 | 0x383:SWAP1 23 | 0x384:DUP1 24 | 0x385:DUP1 25 | 0x386:CALLDATALOAD 26 | 0x387:PUSH1 0x0 27 | 0x389:NOT 28 | 0x38a:AND 29 | 0x38b:SWAP1 30 | 0x38c:PUSH1 0x20 31 | 0x38e:ADD 32 | 0x38f:SWAP1 33 | 0x390:SWAP3 34 | 0x391:SWAP2 35 | 0x392:SWAP1 36 | 0x393:POP 37 | 0x394:POP 38 | 0x395:POP 39 | 0x396:PUSH2 0x1323 40 | 0x399:JUMP"] 41 | 887 -> 4899 42 | 4899[label="0x1323:JUMPDEST 43 | 0x1324:PUSH1 0xa 44 | 0x1326:PUSH1 0x20 45 | 0x1328:MSTORE 46 | 0x1329:DUP1 47 | 0x132a:PUSH1 0x0 48 | 0x132c:MSTORE 49 | 0x132d:PUSH1 0x40 50 | 0x132f:PUSH1 0x0 51 | 0x1331:SHA3 52 | 0x1332:PUSH1 0x0 53 | 0x1334:SWAP2 54 | 0x1335:POP 55 | 0x1336:SLOAD 56 | 0x1337:SWAP1 57 | 0x1338:PUSH2 0x100 58 | 0x133b:EXP 59 | 0x133c:SWAP1 60 | 0x133d:DIV 61 | 0x133e:PUSH1 0xff 62 | 0x1340:AND 63 | 0x1341:DUP2 64 | 0x1342:JUMP"] 65 | 4899 -> 922 66 | 922[label="0x39a:JUMPDEST 67 | 0x39b:PUSH1 0x40 68 | 0x39d:MLOAD 69 | 0x39e:DUP1 70 | 0x39f:DUP3 71 | 0x3a0:ISZERO 72 | 0x3a1:ISZERO 73 | 0x3a2:ISZERO 74 | 0x3a3:ISZERO 75 | 0x3a4:DUP2 76 | 0x3a5:MSTORE 77 | 0x3a6:PUSH1 0x20 78 | 0x3a8:ADD 79 | 0x3a9:SWAP2 80 | 0x3aa:POP 81 | 0x3ab:POP 82 | 0x3ac:PUSH1 0x40 83 | 0x3ae:MLOAD 84 | 0x3af:DUP1 85 | 0x3b0:SWAP2 86 | 0x3b1:SUB 87 | 0x3b2:SWAP1 88 | 0x3b3:RETURN"] 89 | 90 | } -------------------------------------------------------------------------------- /tests/expected-fomo3d-output/fomo3d.evm_balanceOf(address).dot: -------------------------------------------------------------------------------- 1 | digraph{ 2 | 1167[label="0x48f:JUMPDEST 3 | 0x490:CALLVALUE 4 | 0x491:DUP1 5 | 0x492:ISZERO 6 | 0x493:PUSH2 0x49b 7 | 0x496:JUMPI"] 8 | 1167 -> 1175 9 | 1167 -> 1179 10 | 1175[label="0x497:PUSH1 0x0 11 | 0x499:DUP1 12 | 0x49a:REVERT"] 13 | 1179[label="0x49b:JUMPDEST 14 | 0x49c:POP 15 | 0x49d:PUSH2 0x4d0 16 | 0x4a0:PUSH1 0x4 17 | 0x4a2:DUP1 18 | 0x4a3:CALLDATASIZE 19 | 0x4a4:SUB 20 | 0x4a5:DUP2 21 | 0x4a6:ADD 22 | 0x4a7:SWAP1 23 | 0x4a8:DUP1 24 | 0x4a9:DUP1 25 | 0x4aa:CALLDATALOAD 26 | 0x4ab:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 27 | 0x4c0:AND 28 | 0x4c1:SWAP1 29 | 0x4c2:PUSH1 0x20 30 | 0x4c4:ADD 31 | 0x4c5:SWAP1 32 | 0x4c6:SWAP3 33 | 0x4c7:SWAP2 34 | 0x4c8:SWAP1 35 | 0x4c9:POP 36 | 0x4ca:POP 37 | 0x4cb:POP 38 | 0x4cc:PUSH2 0x15d6 39 | 0x4cf:JUMP"] 40 | 1179 -> 5590 41 | 5590[label="0x15d6:JUMPDEST 42 | 0x15d7:PUSH1 0x0 43 | 0x15d9:PUSH1 0x4 44 | 0x15db:PUSH1 0x0 45 | 0x15dd:DUP4 46 | 0x15de:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 47 | 0x15f3:AND 48 | 0x15f4:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 49 | 0x1609:AND 50 | 0x160a:DUP2 51 | 0x160b:MSTORE 52 | 0x160c:PUSH1 0x20 53 | 0x160e:ADD 54 | 0x160f:SWAP1 55 | 0x1610:DUP2 56 | 0x1611:MSTORE 57 | 0x1612:PUSH1 0x20 58 | 0x1614:ADD 59 | 0x1615:PUSH1 0x0 60 | 0x1617:SHA3 61 | 0x1618:SLOAD 62 | 0x1619:SWAP1 63 | 0x161a:POP 64 | 0x161b:SWAP2 65 | 0x161c:SWAP1 66 | 0x161d:POP 67 | 0x161e:JUMP"] 68 | 5590 -> 1232 69 | 1232[label="0x4d0:JUMPDEST 70 | 0x4d1:PUSH1 0x40 71 | 0x4d3:MLOAD 72 | 0x4d4:DUP1 73 | 0x4d5:DUP3 74 | 0x4d6:DUP2 75 | 0x4d7:MSTORE 76 | 0x4d8:PUSH1 0x20 77 | 0x4da:ADD 78 | 0x4db:SWAP2 79 | 0x4dc:POP 80 | 0x4dd:POP 81 | 0x4de:PUSH1 0x40 82 | 0x4e0:MLOAD 83 | 0x4e1:DUP1 84 | 0x4e2:SWAP2 85 | 0x4e3:SUB 86 | 0x4e4:SWAP1 87 | 0x4e5:RETURN"] 88 | 89 | } -------------------------------------------------------------------------------- /tests/expected-fomo3d-output/fomo3d.evm_buyPrice().dot: -------------------------------------------------------------------------------- 1 | digraph{ 2 | 1299[label="0x513:JUMPDEST 3 | 0x514:CALLVALUE 4 | 0x515:DUP1 5 | 0x516:ISZERO 6 | 0x517:PUSH2 0x51f 7 | 0x51a:JUMPI"] 8 | 1299 -> 1307 9 | 1299 -> 1311 10 | 1307[label="0x51b:PUSH1 0x0 11 | 0x51d:DUP1 12 | 0x51e:REVERT"] 13 | 1311[label="0x51f:JUMPDEST 14 | 0x520:POP 15 | 0x521:PUSH2 0x528 16 | 0x524:PUSH2 0x16b3 17 | 0x527:JUMP"] 18 | 1311 -> 5811 19 | 5811[label="0x16b3:JUMPDEST 20 | 0x16b4:PUSH1 0x0 21 | 0x16b6:DUP1 22 | 0x16b7:PUSH1 0x0 23 | 0x16b9:DUP1 24 | 0x16ba:PUSH1 0x0 25 | 0x16bc:PUSH1 0x8 26 | 0x16be:SLOAD 27 | 0x16bf:EQ 28 | 0x16c0:ISZERO 29 | 0x16c1:PUSH2 0x16d8 30 | 0x16c4:JUMPI"] 31 | 5811 -> 5829 32 | 5811 -> 5848 33 | 5829[label="0x16c5:PUSH5 0x2540be400 34 | 0x16cb:PUSH5 0x174876e800 35 | 0x16d1:ADD 36 | 0x16d2:SWAP4 37 | 0x16d3:POP 38 | 0x16d4:PUSH2 0x170b 39 | 0x16d7:JUMP"] 40 | 5829 -> 5899 41 | 5848[label="0x16d8:JUMPDEST 42 | 0x16d9:PUSH2 0x16e9 43 | 0x16dc:PUSH8 0xde0b6b3a7640000 44 | 0x16e5:PUSH2 0x22a2 45 | 0x16e8:JUMP"] 46 | 5848 -> 8866 47 | 8866[label="0x22a2:JUMPDEST 48 | 0x22a3:PUSH1 0x0 49 | 0x22a5:DUP1 50 | 0x22a6:PUSH1 0x0 51 | 0x22a8:DUP1 52 | 0x22a9:PUSH8 0xde0b6b3a7640000 53 | 0x22b2:DUP6 54 | 0x22b3:ADD 55 | 0x22b4:SWAP3 56 | 0x22b5:POP 57 | 0x22b6:PUSH8 0xde0b6b3a7640000 58 | 0x22bf:PUSH1 0x8 59 | 0x22c1:SLOAD 60 | 0x22c2:ADD 61 | 0x22c3:SWAP2 62 | 0x22c4:POP 63 | 0x22c5:PUSH8 0xde0b6b3a7640000 64 | 0x22ce:PUSH2 0x2336 65 | 0x22d1:PUSH8 0xde0b6b3a7640000 66 | 0x22da:DUP6 67 | 0x22db:SUB 68 | 0x22dc:PUSH5 0x2540be400 69 | 0x22e2:PUSH8 0xde0b6b3a7640000 70 | 0x22eb:DUP7 71 | 0x22ec:DUP2 72 | 0x22ed:ISZERO 73 | 0x22ee:ISZERO 74 | 0x22ef:PUSH2 0x22f4 75 | 0x22f2:JUMPI"] 76 | 8866 -> 8947 77 | 8866 -> 8948 78 | 8947[label="0x22f3:INVALID"] 79 | 5899[label="0x170b:JUMPDEST 80 | 0x170c:POP 81 | 0x170d:POP 82 | 0x170e:POP 83 | 0x170f:SWAP1 84 | 0x1710:JUMP"] 85 | 5899 -> 1320 86 | 1320[label="0x528:JUMPDEST 87 | 0x529:PUSH1 0x40 88 | 0x52b:MLOAD 89 | 0x52c:DUP1 90 | 0x52d:DUP3 91 | 0x52e:DUP2 92 | 0x52f:MSTORE 93 | 0x530:PUSH1 0x20 94 | 0x532:ADD 95 | 0x533:SWAP2 96 | 0x534:POP 97 | 0x535:POP 98 | 0x536:PUSH1 0x40 99 | 0x538:MLOAD 100 | 0x539:DUP1 101 | 0x53a:SWAP2 102 | 0x53b:SUB 103 | 0x53c:SWAP1 104 | 0x53d:RETURN"] 105 | 8948[label="0x22f4:JUMPDEST 106 | 0x22f5:DIV 107 | 0x22f6:PUSH5 0x2540be400 108 | 0x22fc:MUL 109 | 0x22fd:PUSH5 0x174876e800 110 | 0x2303:ADD 111 | 0x2304:SUB 112 | 0x2305:MUL 113 | 0x2306:PUSH1 0x2 114 | 0x2308:PUSH8 0xde0b6b3a7640000 115 | 0x2311:DUP8 116 | 0x2312:PUSH1 0x2 117 | 0x2314:DUP10 118 | 0x2315:EXP 119 | 0x2316:SUB 120 | 0x2317:DUP2 121 | 0x2318:ISZERO 122 | 0x2319:ISZERO 123 | 0x231a:PUSH2 0x231f 124 | 0x231d:JUMPI"] 125 | 8948 -> 8990 126 | 8948 -> 8991 127 | 8990[label="0x231e:INVALID"] 128 | 8991[label="0x231f:JUMPDEST 129 | 0x2320:DIV 130 | 0x2321:PUSH5 0x2540be400 131 | 0x2327:MUL 132 | 0x2328:DUP2 133 | 0x2329:ISZERO 134 | 0x232a:ISZERO 135 | 0x232b:PUSH2 0x2330 136 | 0x232e:JUMPI"] 137 | 8991 -> 9007 138 | 8991 -> 9008 139 | 9007[label="0x232f:INVALID"] 140 | 9008[label="0x2330:JUMPDEST 141 | 0x2331:DIV 142 | 0x2332:PUSH2 0x21fc 143 | 0x2335:JUMP"] 144 | 9008 -> 8700 145 | 8700[label="0x21fc:JUMPDEST 146 | 0x21fd:PUSH1 0x0 147 | 0x21ff:DUP3 148 | 0x2200:DUP3 149 | 0x2201:GT 150 | 0x2202:ISZERO 151 | 0x2203:ISZERO 152 | 0x2204:ISZERO 153 | 0x2205:PUSH2 0x220a 154 | 0x2208:JUMPI"] 155 | 8700 -> 8713 156 | 8700 -> 8714 157 | 8713[label="0x2209:INVALID"] 158 | 8714[label="0x220a:JUMPDEST 159 | 0x220b:DUP2 160 | 0x220c:DUP4 161 | 0x220d:SUB 162 | 0x220e:SWAP1 163 | 0x220f:POP 164 | 0x2210:SWAP3 165 | 0x2211:SWAP2 166 | 0x2212:POP 167 | 0x2213:POP 168 | 0x2214:JUMP"] 169 | 8714 -> 9014 170 | 9014[label="0x2336:JUMPDEST 171 | 0x2337:DUP2 172 | 0x2338:ISZERO 173 | 0x2339:ISZERO 174 | 0x233a:PUSH2 0x233f 175 | 0x233d:JUMPI"] 176 | 9014 -> 9022 177 | 9014 -> 9023 178 | 9022[label="0x233e:INVALID"] 179 | 9023[label="0x233f:JUMPDEST 180 | 0x2340:DIV 181 | 0x2341:SWAP1 182 | 0x2342:POP 183 | 0x2343:DUP1 184 | 0x2344:SWAP4 185 | 0x2345:POP 186 | 0x2346:POP 187 | 0x2347:POP 188 | 0x2348:POP 189 | 0x2349:SWAP2 190 | 0x234a:SWAP1 191 | 0x234b:POP 192 | 0x234c:JUMP"] 193 | 9023 -> 5865 194 | 5865[label="0x16e9:JUMPDEST 195 | 0x16ea:SWAP3 196 | 0x16eb:POP 197 | 0x16ec:PUSH2 0x16f9 198 | 0x16ef:DUP4 199 | 0x16f0:PUSH1 0x5 200 | 0x16f2:PUSH1 0xff 201 | 0x16f4:AND 202 | 0x16f5:PUSH2 0x21e1 203 | 0x16f8:JUMP"] 204 | 5865 -> 8673 205 | 8673[label="0x21e1:JUMPDEST 206 | 0x21e2:PUSH1 0x0 207 | 0x21e4:DUP1 208 | 0x21e5:DUP3 209 | 0x21e6:DUP5 210 | 0x21e7:DUP2 211 | 0x21e8:ISZERO 212 | 0x21e9:ISZERO 213 | 0x21ea:PUSH2 0x21ef 214 | 0x21ed:JUMPI"] 215 | 8673 -> 8686 216 | 8673 -> 8687 217 | 8686[label="0x21ee:INVALID"] 218 | 8687[label="0x21ef:JUMPDEST 219 | 0x21f0:DIV 220 | 0x21f1:SWAP1 221 | 0x21f2:POP 222 | 0x21f3:DUP1 223 | 0x21f4:SWAP2 224 | 0x21f5:POP 225 | 0x21f6:POP 226 | 0x21f7:SWAP3 227 | 0x21f8:SWAP2 228 | 0x21f9:POP 229 | 0x21fa:POP 230 | 0x21fb:JUMP"] 231 | 8687 -> 5881 232 | 5881[label="0x16f9:JUMPDEST 233 | 0x16fa:SWAP2 234 | 0x16fb:POP 235 | 0x16fc:PUSH2 0x1705 236 | 0x16ff:DUP4 237 | 0x1700:DUP4 238 | 0x1701:PUSH2 0x21c3 239 | 0x1704:JUMP"] 240 | 5881 -> 8643 241 | 8643[label="0x21c3:JUMPDEST 242 | 0x21c4:PUSH1 0x0 243 | 0x21c6:DUP1 244 | 0x21c7:DUP3 245 | 0x21c8:DUP5 246 | 0x21c9:ADD 247 | 0x21ca:SWAP1 248 | 0x21cb:POP 249 | 0x21cc:DUP4 250 | 0x21cd:DUP2 251 | 0x21ce:LT 252 | 0x21cf:ISZERO 253 | 0x21d0:ISZERO 254 | 0x21d1:ISZERO 255 | 0x21d2:PUSH2 0x21d7 256 | 0x21d5:JUMPI"] 257 | 8643 -> 8662 258 | 8643 -> 8663 259 | 8662[label="0x21d6:INVALID"] 260 | 8663[label="0x21d7:JUMPDEST 261 | 0x21d8:DUP1 262 | 0x21d9:SWAP2 263 | 0x21da:POP 264 | 0x21db:POP 265 | 0x21dc:SWAP3 266 | 0x21dd:SWAP2 267 | 0x21de:POP 268 | 0x21df:POP 269 | 0x21e0:JUMP"] 270 | 8663 -> 5893 271 | 5893[label="0x1705:JUMPDEST 272 | 0x1706:SWAP1 273 | 0x1707:POP 274 | 0x1708:DUP1 275 | 0x1709:SWAP4 276 | 0x170a:POP"] 277 | 5893 -> 5899 278 | 279 | } -------------------------------------------------------------------------------- /tests/expected-fomo3d-output/fomo3d.evm_calculateEthereumReceived(uint256).dot: -------------------------------------------------------------------------------- 1 | digraph{ 2 | 714[label="0x2ca:JUMPDEST 3 | 0x2cb:CALLVALUE 4 | 0x2cc:DUP1 5 | 0x2cd:ISZERO 6 | 0x2ce:PUSH2 0x2d6 7 | 0x2d1:JUMPI"] 8 | 714 -> 722 9 | 714 -> 726 10 | 722[label="0x2d2:PUSH1 0x0 11 | 0x2d4:DUP1 12 | 0x2d5:REVERT"] 13 | 726[label="0x2d6:JUMPDEST 14 | 0x2d7:POP 15 | 0x2d8:PUSH2 0x2f5 16 | 0x2db:PUSH1 0x4 17 | 0x2dd:DUP1 18 | 0x2de:CALLDATASIZE 19 | 0x2df:SUB 20 | 0x2e0:DUP2 21 | 0x2e1:ADD 22 | 0x2e2:SWAP1 23 | 0x2e3:DUP1 24 | 0x2e4:DUP1 25 | 0x2e5:CALLDATALOAD 26 | 0x2e6:SWAP1 27 | 0x2e7:PUSH1 0x20 28 | 0x2e9:ADD 29 | 0x2ea:SWAP1 30 | 0x2eb:SWAP3 31 | 0x2ec:SWAP2 32 | 0x2ed:SWAP1 33 | 0x2ee:POP 34 | 0x2ef:POP 35 | 0x2f0:POP 36 | 0x2f1:PUSH2 0x12c2 37 | 0x2f4:JUMP"] 38 | 726 -> 4802 39 | 4802[label="0x12c2:JUMPDEST 40 | 0x12c3:PUSH1 0x0 41 | 0x12c5:DUP1 42 | 0x12c6:PUSH1 0x0 43 | 0x12c8:DUP1 44 | 0x12c9:PUSH1 0x8 45 | 0x12cb:SLOAD 46 | 0x12cc:DUP6 47 | 0x12cd:GT 48 | 0x12ce:ISZERO 49 | 0x12cf:ISZERO 50 | 0x12d0:ISZERO 51 | 0x12d1:PUSH2 0x12d9 52 | 0x12d4:JUMPI"] 53 | 4802 -> 4821 54 | 4802 -> 4825 55 | 4821[label="0x12d5:PUSH1 0x0 56 | 0x12d7:DUP1 57 | 0x12d8:REVERT"] 58 | 4825[label="0x12d9:JUMPDEST 59 | 0x12da:PUSH2 0x12e2 60 | 0x12dd:DUP6 61 | 0x12de:PUSH2 0x22a2 62 | 0x12e1:JUMP"] 63 | 4825 -> 8866 64 | 8866[label="0x22a2:JUMPDEST 65 | 0x22a3:PUSH1 0x0 66 | 0x22a5:DUP1 67 | 0x22a6:PUSH1 0x0 68 | 0x22a8:DUP1 69 | 0x22a9:PUSH8 0xde0b6b3a7640000 70 | 0x22b2:DUP6 71 | 0x22b3:ADD 72 | 0x22b4:SWAP3 73 | 0x22b5:POP 74 | 0x22b6:PUSH8 0xde0b6b3a7640000 75 | 0x22bf:PUSH1 0x8 76 | 0x22c1:SLOAD 77 | 0x22c2:ADD 78 | 0x22c3:SWAP2 79 | 0x22c4:POP 80 | 0x22c5:PUSH8 0xde0b6b3a7640000 81 | 0x22ce:PUSH2 0x2336 82 | 0x22d1:PUSH8 0xde0b6b3a7640000 83 | 0x22da:DUP6 84 | 0x22db:SUB 85 | 0x22dc:PUSH5 0x2540be400 86 | 0x22e2:PUSH8 0xde0b6b3a7640000 87 | 0x22eb:DUP7 88 | 0x22ec:DUP2 89 | 0x22ed:ISZERO 90 | 0x22ee:ISZERO 91 | 0x22ef:PUSH2 0x22f4 92 | 0x22f2:JUMPI"] 93 | 8866 -> 8947 94 | 8866 -> 8948 95 | 8947[label="0x22f3:INVALID"] 96 | 8948[label="0x22f4:JUMPDEST 97 | 0x22f5:DIV 98 | 0x22f6:PUSH5 0x2540be400 99 | 0x22fc:MUL 100 | 0x22fd:PUSH5 0x174876e800 101 | 0x2303:ADD 102 | 0x2304:SUB 103 | 0x2305:MUL 104 | 0x2306:PUSH1 0x2 105 | 0x2308:PUSH8 0xde0b6b3a7640000 106 | 0x2311:DUP8 107 | 0x2312:PUSH1 0x2 108 | 0x2314:DUP10 109 | 0x2315:EXP 110 | 0x2316:SUB 111 | 0x2317:DUP2 112 | 0x2318:ISZERO 113 | 0x2319:ISZERO 114 | 0x231a:PUSH2 0x231f 115 | 0x231d:JUMPI"] 116 | 8948 -> 8990 117 | 8948 -> 8991 118 | 8990[label="0x231e:INVALID"] 119 | 8991[label="0x231f:JUMPDEST 120 | 0x2320:DIV 121 | 0x2321:PUSH5 0x2540be400 122 | 0x2327:MUL 123 | 0x2328:DUP2 124 | 0x2329:ISZERO 125 | 0x232a:ISZERO 126 | 0x232b:PUSH2 0x2330 127 | 0x232e:JUMPI"] 128 | 8991 -> 9007 129 | 8991 -> 9008 130 | 9007[label="0x232f:INVALID"] 131 | 9008[label="0x2330:JUMPDEST 132 | 0x2331:DIV 133 | 0x2332:PUSH2 0x21fc 134 | 0x2335:JUMP"] 135 | 9008 -> 8700 136 | 8700[label="0x21fc:JUMPDEST 137 | 0x21fd:PUSH1 0x0 138 | 0x21ff:DUP3 139 | 0x2200:DUP3 140 | 0x2201:GT 141 | 0x2202:ISZERO 142 | 0x2203:ISZERO 143 | 0x2204:ISZERO 144 | 0x2205:PUSH2 0x220a 145 | 0x2208:JUMPI"] 146 | 8700 -> 8713 147 | 8700 -> 8714 148 | 8713[label="0x2209:INVALID"] 149 | 8714[label="0x220a:JUMPDEST 150 | 0x220b:DUP2 151 | 0x220c:DUP4 152 | 0x220d:SUB 153 | 0x220e:SWAP1 154 | 0x220f:POP 155 | 0x2210:SWAP3 156 | 0x2211:SWAP2 157 | 0x2212:POP 158 | 0x2213:POP 159 | 0x2214:JUMP"] 160 | 8714 -> 9014 161 | 8714 -> 4862 162 | 9014[label="0x2336:JUMPDEST 163 | 0x2337:DUP2 164 | 0x2338:ISZERO 165 | 0x2339:ISZERO 166 | 0x233a:PUSH2 0x233f 167 | 0x233d:JUMPI"] 168 | 9014 -> 9022 169 | 9014 -> 9023 170 | 9022[label="0x233e:INVALID"] 171 | 9023[label="0x233f:JUMPDEST 172 | 0x2340:DIV 173 | 0x2341:SWAP1 174 | 0x2342:POP 175 | 0x2343:DUP1 176 | 0x2344:SWAP4 177 | 0x2345:POP 178 | 0x2346:POP 179 | 0x2347:POP 180 | 0x2348:POP 181 | 0x2349:SWAP2 182 | 0x234a:SWAP1 183 | 0x234b:POP 184 | 0x234c:JUMP"] 185 | 9023 -> 4834 186 | 4834[label="0x12e2:JUMPDEST 187 | 0x12e3:SWAP3 188 | 0x12e4:POP 189 | 0x12e5:PUSH2 0x12f2 190 | 0x12e8:DUP4 191 | 0x12e9:PUSH1 0x5 192 | 0x12eb:PUSH1 0xff 193 | 0x12ed:AND 194 | 0x12ee:PUSH2 0x21e1 195 | 0x12f1:JUMP"] 196 | 4834 -> 8673 197 | 8673[label="0x21e1:JUMPDEST 198 | 0x21e2:PUSH1 0x0 199 | 0x21e4:DUP1 200 | 0x21e5:DUP3 201 | 0x21e6:DUP5 202 | 0x21e7:DUP2 203 | 0x21e8:ISZERO 204 | 0x21e9:ISZERO 205 | 0x21ea:PUSH2 0x21ef 206 | 0x21ed:JUMPI"] 207 | 8673 -> 8686 208 | 8673 -> 8687 209 | 8686[label="0x21ee:INVALID"] 210 | 8687[label="0x21ef:JUMPDEST 211 | 0x21f0:DIV 212 | 0x21f1:SWAP1 213 | 0x21f2:POP 214 | 0x21f3:DUP1 215 | 0x21f4:SWAP2 216 | 0x21f5:POP 217 | 0x21f6:POP 218 | 0x21f7:SWAP3 219 | 0x21f8:SWAP2 220 | 0x21f9:POP 221 | 0x21fa:POP 222 | 0x21fb:JUMP"] 223 | 8687 -> 4850 224 | 4850[label="0x12f2:JUMPDEST 225 | 0x12f3:SWAP2 226 | 0x12f4:POP 227 | 0x12f5:PUSH2 0x12fe 228 | 0x12f8:DUP4 229 | 0x12f9:DUP4 230 | 0x12fa:PUSH2 0x21fc 231 | 0x12fd:JUMP"] 232 | 4850 -> 8700 233 | 4862[label="0x12fe:JUMPDEST 234 | 0x12ff:SWAP1 235 | 0x1300:POP 236 | 0x1301:DUP1 237 | 0x1302:SWAP4 238 | 0x1303:POP 239 | 0x1304:POP 240 | 0x1305:POP 241 | 0x1306:POP 242 | 0x1307:SWAP2 243 | 0x1308:SWAP1 244 | 0x1309:POP 245 | 0x130a:JUMP"] 246 | 4862 -> 757 247 | 757[label="0x2f5:JUMPDEST 248 | 0x2f6:PUSH1 0x40 249 | 0x2f8:MLOAD 250 | 0x2f9:DUP1 251 | 0x2fa:DUP3 252 | 0x2fb:DUP2 253 | 0x2fc:MSTORE 254 | 0x2fd:PUSH1 0x20 255 | 0x2ff:ADD 256 | 0x300:SWAP2 257 | 0x301:POP 258 | 0x302:POP 259 | 0x303:PUSH1 0x40 260 | 0x305:MLOAD 261 | 0x306:DUP1 262 | 0x307:SWAP2 263 | 0x308:SUB 264 | 0x309:SWAP1 265 | 0x30a:RETURN"] 266 | 267 | } -------------------------------------------------------------------------------- /tests/expected-fomo3d-output/fomo3d.evm_calculateTokensReceived(uint256).dot: -------------------------------------------------------------------------------- 1 | digraph{ 2 | 606[label="0x25e:JUMPDEST 3 | 0x25f:CALLVALUE 4 | 0x260:DUP1 5 | 0x261:ISZERO 6 | 0x262:PUSH2 0x26a 7 | 0x265:JUMPI"] 8 | 606 -> 614 9 | 606 -> 618 10 | 614[label="0x266:PUSH1 0x0 11 | 0x268:DUP1 12 | 0x269:REVERT"] 13 | 618[label="0x26a:JUMPDEST 14 | 0x26b:POP 15 | 0x26c:PUSH2 0x289 16 | 0x26f:PUSH1 0x4 17 | 0x271:DUP1 18 | 0x272:CALLDATASIZE 19 | 0x273:SUB 20 | 0x274:DUP2 21 | 0x275:ADD 22 | 0x276:SWAP1 23 | 0x277:DUP1 24 | 0x278:DUP1 25 | 0x279:CALLDATALOAD 26 | 0x27a:SWAP1 27 | 0x27b:PUSH1 0x20 28 | 0x27d:ADD 29 | 0x27e:SWAP1 30 | 0x27f:SWAP3 31 | 0x280:SWAP2 32 | 0x281:SWAP1 33 | 0x282:POP 34 | 0x283:POP 35 | 0x284:POP 36 | 0x285:PUSH2 0x1280 37 | 0x288:JUMP"] 38 | 618 -> 4736 39 | 4736[label="0x1280:JUMPDEST 40 | 0x1281:PUSH1 0x0 41 | 0x1283:DUP1 42 | 0x1284:PUSH1 0x0 43 | 0x1286:DUP1 44 | 0x1287:PUSH2 0x1294 45 | 0x128a:DUP6 46 | 0x128b:PUSH1 0x5 47 | 0x128d:PUSH1 0xff 48 | 0x128f:AND 49 | 0x1290:PUSH2 0x21e1 50 | 0x1293:JUMP"] 51 | 4736 -> 8673 52 | 8673[label="0x21e1:JUMPDEST 53 | 0x21e2:PUSH1 0x0 54 | 0x21e4:DUP1 55 | 0x21e5:DUP3 56 | 0x21e6:DUP5 57 | 0x21e7:DUP2 58 | 0x21e8:ISZERO 59 | 0x21e9:ISZERO 60 | 0x21ea:PUSH2 0x21ef 61 | 0x21ed:JUMPI"] 62 | 8673 -> 8686 63 | 8673 -> 8687 64 | 8686[label="0x21ee:INVALID"] 65 | 8687[label="0x21ef:JUMPDEST 66 | 0x21f0:DIV 67 | 0x21f1:SWAP1 68 | 0x21f2:POP 69 | 0x21f3:DUP1 70 | 0x21f4:SWAP2 71 | 0x21f5:POP 72 | 0x21f6:POP 73 | 0x21f7:SWAP3 74 | 0x21f8:SWAP2 75 | 0x21f9:POP 76 | 0x21fa:POP 77 | 0x21fb:JUMP"] 78 | 8687 -> 4756 79 | 4756[label="0x1294:JUMPDEST 80 | 0x1295:SWAP3 81 | 0x1296:POP 82 | 0x1297:PUSH2 0x12a0 83 | 0x129a:DUP6 84 | 0x129b:DUP5 85 | 0x129c:PUSH2 0x21fc 86 | 0x129f:JUMP"] 87 | 4756 -> 8700 88 | 8700[label="0x21fc:JUMPDEST 89 | 0x21fd:PUSH1 0x0 90 | 0x21ff:DUP3 91 | 0x2200:DUP3 92 | 0x2201:GT 93 | 0x2202:ISZERO 94 | 0x2203:ISZERO 95 | 0x2204:ISZERO 96 | 0x2205:PUSH2 0x220a 97 | 0x2208:JUMPI"] 98 | 8700 -> 8713 99 | 8700 -> 8714 100 | 8713[label="0x2209:INVALID"] 101 | 8714[label="0x220a:JUMPDEST 102 | 0x220b:DUP2 103 | 0x220c:DUP4 104 | 0x220d:SUB 105 | 0x220e:SWAP1 106 | 0x220f:POP 107 | 0x2210:SWAP3 108 | 0x2211:SWAP2 109 | 0x2212:POP 110 | 0x2213:POP 111 | 0x2214:JUMP"] 112 | 8714 -> 4768 113 | 8714 -> 8843 114 | 4768[label="0x12a0:JUMPDEST 115 | 0x12a1:SWAP2 116 | 0x12a2:POP 117 | 0x12a3:PUSH2 0x12ab 118 | 0x12a6:DUP3 119 | 0x12a7:PUSH2 0x2215 120 | 0x12aa:JUMP"] 121 | 4768 -> 8725 122 | 8725[label="0x2215:JUMPDEST 123 | 0x2216:PUSH1 0x0 124 | 0x2218:DUP1 125 | 0x2219:PUSH1 0x0 126 | 0x221b:PUSH8 0xde0b6b3a7640000 127 | 0x2224:PUSH5 0x174876e800 128 | 0x222a:MUL 129 | 0x222b:SWAP2 130 | 0x222c:POP 131 | 0x222d:PUSH1 0x8 132 | 0x222f:SLOAD 133 | 0x2230:PUSH5 0x2540be400 134 | 0x2236:PUSH2 0x228b 135 | 0x2239:PUSH2 0x2285 136 | 0x223c:PUSH1 0x8 137 | 0x223e:SLOAD 138 | 0x223f:DUP7 139 | 0x2240:PUSH5 0x2540be400 140 | 0x2246:PUSH1 0x2 141 | 0x2248:MUL 142 | 0x2249:MUL 143 | 0x224a:MUL 144 | 0x224b:PUSH1 0x2 145 | 0x224d:PUSH1 0x8 146 | 0x224f:SLOAD 147 | 0x2250:EXP 148 | 0x2251:PUSH1 0x2 149 | 0x2253:PUSH5 0x2540be400 150 | 0x2259:EXP 151 | 0x225a:MUL 152 | 0x225b:PUSH8 0xde0b6b3a7640000 153 | 0x2264:DUP11 154 | 0x2265:MUL 155 | 0x2266:PUSH8 0xde0b6b3a7640000 156 | 0x226f:PUSH5 0x2540be400 157 | 0x2275:MUL 158 | 0x2276:PUSH1 0x2 159 | 0x2278:MUL 160 | 0x2279:MUL 161 | 0x227a:PUSH1 0x2 162 | 0x227c:DUP10 163 | 0x227d:EXP 164 | 0x227e:ADD 165 | 0x227f:ADD 166 | 0x2280:ADD 167 | 0x2281:PUSH2 0x234d 168 | 0x2284:JUMP"] 169 | 8725 -> 9037 170 | 9037[label="0x234d:JUMPDEST 171 | 0x234e:PUSH1 0x0 172 | 0x2350:DUP1 173 | 0x2351:PUSH1 0x2 174 | 0x2353:PUSH1 0x1 175 | 0x2355:DUP5 176 | 0x2356:ADD 177 | 0x2357:DUP2 178 | 0x2358:ISZERO 179 | 0x2359:ISZERO 180 | 0x235a:PUSH2 0x235f 181 | 0x235d:JUMPI"] 182 | 9037 -> 9054 183 | 9037 -> 9055 184 | 9054[label="0x235e:INVALID"] 185 | 9055[label="0x235f:JUMPDEST 186 | 0x2360:DIV 187 | 0x2361:SWAP1 188 | 0x2362:POP 189 | 0x2363:DUP3 190 | 0x2364:SWAP2 191 | 0x2365:POP"] 192 | 9055 -> 9062 193 | 9062[label="0x2366:JUMPDEST 194 | 0x2367:DUP2 195 | 0x2368:DUP2 196 | 0x2369:LT 197 | 0x236a:ISZERO 198 | 0x236b:PUSH2 0x2392 199 | 0x236e:JUMPI"] 200 | 9062 -> 9071 201 | 9062 -> 9106 202 | 9071[label="0x236f:DUP1 203 | 0x2370:SWAP2 204 | 0x2371:POP 205 | 0x2372:PUSH1 0x2 206 | 0x2374:DUP2 207 | 0x2375:DUP3 208 | 0x2376:DUP6 209 | 0x2377:DUP2 210 | 0x2378:ISZERO 211 | 0x2379:ISZERO 212 | 0x237a:PUSH2 0x237f 213 | 0x237d:JUMPI"] 214 | 9071 -> 9086 215 | 9071 -> 9087 216 | 9086[label="0x237e:INVALID"] 217 | 9106[label="0x2392:JUMPDEST 218 | 0x2393:POP 219 | 0x2394:SWAP2 220 | 0x2395:SWAP1 221 | 0x2396:POP 222 | 0x2397:JUMP"] 223 | 9106 -> 8837 224 | 9087[label="0x237f:JUMPDEST 225 | 0x2380:DIV 226 | 0x2381:ADD 227 | 0x2382:DUP2 228 | 0x2383:ISZERO 229 | 0x2384:ISZERO 230 | 0x2385:PUSH2 0x238a 231 | 0x2388:JUMPI"] 232 | 9087 -> 9097 233 | 9087 -> 9098 234 | 9097[label="0x2389:INVALID"] 235 | 8837[label="0x2285:JUMPDEST 236 | 0x2286:DUP6 237 | 0x2287:PUSH2 0x21fc 238 | 0x228a:JUMP"] 239 | 8837 -> 8700 240 | 9098[label="0x238a:JUMPDEST 241 | 0x238b:DIV 242 | 0x238c:SWAP1 243 | 0x238d:POP 244 | 0x238e:PUSH2 0x2366 245 | 0x2391:JUMP"] 246 | 9098 -> 9062 247 | 8843[label="0x228b:JUMPDEST 248 | 0x228c:DUP2 249 | 0x228d:ISZERO 250 | 0x228e:ISZERO 251 | 0x228f:PUSH2 0x2294 252 | 0x2292:JUMPI"] 253 | 8843 -> 8851 254 | 8843 -> 8852 255 | 8851[label="0x2293:INVALID"] 256 | 8852[label="0x2294:JUMPDEST 257 | 0x2295:DIV 258 | 0x2296:SUB 259 | 0x2297:SWAP1 260 | 0x2298:POP 261 | 0x2299:DUP1 262 | 0x229a:SWAP3 263 | 0x229b:POP 264 | 0x229c:POP 265 | 0x229d:POP 266 | 0x229e:SWAP2 267 | 0x229f:SWAP1 268 | 0x22a0:POP 269 | 0x22a1:JUMP"] 270 | 8852 -> 4779 271 | 4779[label="0x12ab:JUMPDEST 272 | 0x12ac:SWAP1 273 | 0x12ad:POP 274 | 0x12ae:DUP1 275 | 0x12af:SWAP4 276 | 0x12b0:POP 277 | 0x12b1:POP 278 | 0x12b2:POP 279 | 0x12b3:POP 280 | 0x12b4:SWAP2 281 | 0x12b5:SWAP1 282 | 0x12b6:POP 283 | 0x12b7:JUMP"] 284 | 4779 -> 649 285 | 649[label="0x289:JUMPDEST 286 | 0x28a:PUSH1 0x40 287 | 0x28c:MLOAD 288 | 0x28d:DUP1 289 | 0x28e:DUP3 290 | 0x28f:DUP2 291 | 0x290:MSTORE 292 | 0x291:PUSH1 0x20 293 | 0x293:ADD 294 | 0x294:SWAP2 295 | 0x295:POP 296 | 0x296:POP 297 | 0x297:PUSH1 0x40 298 | 0x299:MLOAD 299 | 0x29a:DUP1 300 | 0x29b:SWAP2 301 | 0x29c:SUB 302 | 0x29d:SWAP1 303 | 0x29e:RETURN"] 304 | 305 | } -------------------------------------------------------------------------------- /tests/expected-fomo3d-output/fomo3d.evm_decimals().dot: -------------------------------------------------------------------------------- 1 | digraph{ 2 | 826[label="0x33a:JUMPDEST 3 | 0x33b:CALLVALUE 4 | 0x33c:DUP1 5 | 0x33d:ISZERO 6 | 0x33e:PUSH2 0x346 7 | 0x341:JUMPI"] 8 | 826 -> 834 9 | 826 -> 838 10 | 834[label="0x342:PUSH1 0x0 11 | 0x344:DUP1 12 | 0x345:REVERT"] 13 | 838[label="0x346:JUMPDEST 14 | 0x347:POP 15 | 0x348:PUSH2 0x34f 16 | 0x34b:PUSH2 0x131e 17 | 0x34e:JUMP"] 18 | 838 -> 4894 19 | 4894[label="0x131e:JUMPDEST 20 | 0x131f:PUSH1 0x12 21 | 0x1321:DUP2 22 | 0x1322:JUMP"] 23 | 4894 -> 847 24 | 847[label="0x34f:JUMPDEST 25 | 0x350:PUSH1 0x40 26 | 0x352:MLOAD 27 | 0x353:DUP1 28 | 0x354:DUP3 29 | 0x355:PUSH1 0xff 30 | 0x357:AND 31 | 0x358:PUSH1 0xff 32 | 0x35a:AND 33 | 0x35b:DUP2 34 | 0x35c:MSTORE 35 | 0x35d:PUSH1 0x20 36 | 0x35f:ADD 37 | 0x360:SWAP2 38 | 0x361:POP 39 | 0x362:POP 40 | 0x363:PUSH1 0x40 41 | 0x365:MLOAD 42 | 0x366:DUP1 43 | 0x367:SWAP2 44 | 0x368:SUB 45 | 0x369:SWAP1 46 | 0x36a:RETURN"] 47 | 48 | } -------------------------------------------------------------------------------- /tests/expected-fomo3d-output/fomo3d.evm_disableInitialStage().dot: -------------------------------------------------------------------------------- 1 | digraph{ 2 | 1613[label="0x64d:JUMPDEST 3 | 0x64e:CALLVALUE 4 | 0x64f:DUP1 5 | 0x650:ISZERO 6 | 0x651:PUSH2 0x659 7 | 0x654:JUMPI"] 8 | 1613 -> 1621 9 | 1613 -> 1625 10 | 1621[label="0x655:PUSH1 0x0 11 | 0x657:DUP1 12 | 0x658:REVERT"] 13 | 1625[label="0x659:JUMPDEST 14 | 0x65a:POP 15 | 0x65b:PUSH2 0x662 16 | 0x65e:PUSH2 0x1887 17 | 0x661:JUMP"] 18 | 1625 -> 6279 19 | 6279[label="0x1887:JUMPDEST 20 | 0x1888:PUSH1 0x0 21 | 0x188a:CALLER 22 | 0x188b:SWAP1 23 | 0x188c:POP 24 | 0x188d:PUSH1 0xa 25 | 0x188f:PUSH1 0x0 26 | 0x1891:DUP3 27 | 0x1892:PUSH1 0x40 28 | 0x1894:MLOAD 29 | 0x1895:DUP1 30 | 0x1896:DUP3 31 | 0x1897:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 32 | 0x18ac:AND 33 | 0x18ad:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 34 | 0x18c2:AND 35 | 0x18c3:PUSH13 0x1000000000000000000000000 36 | 0x18d1:MUL 37 | 0x18d2:DUP2 38 | 0x18d3:MSTORE 39 | 0x18d4:PUSH1 0x14 40 | 0x18d6:ADD 41 | 0x18d7:SWAP2 42 | 0x18d8:POP 43 | 0x18d9:POP 44 | 0x18da:PUSH1 0x40 45 | 0x18dc:MLOAD 46 | 0x18dd:DUP1 47 | 0x18de:SWAP2 48 | 0x18df:SUB 49 | 0x18e0:SWAP1 50 | 0x18e1:SHA3 51 | 0x18e2:PUSH1 0x0 52 | 0x18e4:NOT 53 | 0x18e5:AND 54 | 0x18e6:PUSH1 0x0 55 | 0x18e8:NOT 56 | 0x18e9:AND 57 | 0x18ea:DUP2 58 | 0x18eb:MSTORE 59 | 0x18ec:PUSH1 0x20 60 | 0x18ee:ADD 61 | 0x18ef:SWAP1 62 | 0x18f0:DUP2 63 | 0x18f1:MSTORE 64 | 0x18f2:PUSH1 0x20 65 | 0x18f4:ADD 66 | 0x18f5:PUSH1 0x0 67 | 0x18f7:SHA3 68 | 0x18f8:PUSH1 0x0 69 | 0x18fa:SWAP1 70 | 0x18fb:SLOAD 71 | 0x18fc:SWAP1 72 | 0x18fd:PUSH2 0x100 73 | 0x1900:EXP 74 | 0x1901:SWAP1 75 | 0x1902:DIV 76 | 0x1903:PUSH1 0xff 77 | 0x1905:AND 78 | 0x1906:ISZERO 79 | 0x1907:ISZERO 80 | 0x1908:PUSH2 0x1910 81 | 0x190b:JUMPI"] 82 | 6279 -> 6412 83 | 6279 -> 6416 84 | 6412[label="0x190c:PUSH1 0x0 85 | 0x190e:DUP1 86 | 0x190f:REVERT"] 87 | 6416[label="0x1910:JUMPDEST 88 | 0x1911:PUSH1 0x0 89 | 0x1913:PUSH1 0xb 90 | 0x1915:PUSH1 0x0 91 | 0x1917:PUSH2 0x100 92 | 0x191a:EXP 93 | 0x191b:DUP2 94 | 0x191c:SLOAD 95 | 0x191d:DUP2 96 | 0x191e:PUSH1 0xff 97 | 0x1920:MUL 98 | 0x1921:NOT 99 | 0x1922:AND 100 | 0x1923:SWAP1 101 | 0x1924:DUP4 102 | 0x1925:ISZERO 103 | 0x1926:ISZERO 104 | 0x1927:MUL 105 | 0x1928:OR 106 | 0x1929:SWAP1 107 | 0x192a:SSTORE 108 | 0x192b:POP 109 | 0x192c:POP 110 | 0x192d:JUMP"] 111 | 6416 -> 1634 112 | 1634[label="0x662:JUMPDEST 113 | 0x663:STOP"] 114 | 115 | } -------------------------------------------------------------------------------- /tests/expected-fomo3d-output/fomo3d.evm_dividendsOf(address).dot: -------------------------------------------------------------------------------- 1 | digraph{ 2 | 375[label="0x177:JUMPDEST 3 | 0x178:CALLVALUE 4 | 0x179:DUP1 5 | 0x17a:ISZERO 6 | 0x17b:PUSH2 0x183 7 | 0x17e:JUMPI"] 8 | 375 -> 383 9 | 375 -> 387 10 | 383[label="0x17f:PUSH1 0x0 11 | 0x181:DUP1 12 | 0x182:REVERT"] 13 | 387[label="0x183:JUMPDEST 14 | 0x184:POP 15 | 0x185:PUSH2 0x1b8 16 | 0x188:PUSH1 0x4 17 | 0x18a:DUP1 18 | 0x18b:CALLDATASIZE 19 | 0x18c:SUB 20 | 0x18d:DUP2 21 | 0x18e:ADD 22 | 0x18f:SWAP1 23 | 0x190:DUP1 24 | 0x191:DUP1 25 | 0x192:CALLDATALOAD 26 | 0x193:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 27 | 0x1a8:AND 28 | 0x1a9:SWAP1 29 | 0x1aa:PUSH1 0x20 30 | 0x1ac:ADD 31 | 0x1ad:SWAP1 32 | 0x1ae:SWAP3 33 | 0x1af:SWAP2 34 | 0x1b0:SWAP1 35 | 0x1b1:POP 36 | 0x1b2:POP 37 | 0x1b3:POP 38 | 0x1b4:PUSH2 0x1140 39 | 0x1b7:JUMP"] 40 | 387 -> 4416 41 | 4416[label="0x1140:JUMPDEST 42 | 0x1141:PUSH1 0x0 43 | 0x1143:PUSH9 0x10000000000000000 44 | 0x114d:PUSH1 0x6 45 | 0x114f:PUSH1 0x0 46 | 0x1151:DUP5 47 | 0x1152:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 48 | 0x1167:AND 49 | 0x1168:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 50 | 0x117d:AND 51 | 0x117e:DUP2 52 | 0x117f:MSTORE 53 | 0x1180:PUSH1 0x20 54 | 0x1182:ADD 55 | 0x1183:SWAP1 56 | 0x1184:DUP2 57 | 0x1185:MSTORE 58 | 0x1186:PUSH1 0x20 59 | 0x1188:ADD 60 | 0x1189:PUSH1 0x0 61 | 0x118b:SHA3 62 | 0x118c:SLOAD 63 | 0x118d:PUSH1 0x4 64 | 0x118f:PUSH1 0x0 65 | 0x1191:DUP6 66 | 0x1192:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 67 | 0x11a7:AND 68 | 0x11a8:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 69 | 0x11bd:AND 70 | 0x11be:DUP2 71 | 0x11bf:MSTORE 72 | 0x11c0:PUSH1 0x20 73 | 0x11c2:ADD 74 | 0x11c3:SWAP1 75 | 0x11c4:DUP2 76 | 0x11c5:MSTORE 77 | 0x11c6:PUSH1 0x20 78 | 0x11c8:ADD 79 | 0x11c9:PUSH1 0x0 80 | 0x11cb:SHA3 81 | 0x11cc:SLOAD 82 | 0x11cd:PUSH1 0x9 83 | 0x11cf:SLOAD 84 | 0x11d0:MUL 85 | 0x11d1:SUB 86 | 0x11d2:DUP2 87 | 0x11d3:ISZERO 88 | 0x11d4:ISZERO 89 | 0x11d5:PUSH2 0x11da 90 | 0x11d8:JUMPI"] 91 | 4416 -> 4569 92 | 4416 -> 4570 93 | 4569[label="0x11d9:INVALID"] 94 | 4570[label="0x11da:JUMPDEST 95 | 0x11db:DIV 96 | 0x11dc:SWAP1 97 | 0x11dd:POP 98 | 0x11de:SWAP2 99 | 0x11df:SWAP1 100 | 0x11e0:POP 101 | 0x11e1:JUMP"] 102 | 4570 -> 440 103 | 440[label="0x1b8:JUMPDEST 104 | 0x1b9:PUSH1 0x40 105 | 0x1bb:MLOAD 106 | 0x1bc:DUP1 107 | 0x1bd:DUP3 108 | 0x1be:DUP2 109 | 0x1bf:MSTORE 110 | 0x1c0:PUSH1 0x20 111 | 0x1c2:ADD 112 | 0x1c3:SWAP2 113 | 0x1c4:POP 114 | 0x1c5:POP 115 | 0x1c6:PUSH1 0x40 116 | 0x1c8:MLOAD 117 | 0x1c9:DUP1 118 | 0x1ca:SWAP2 119 | 0x1cb:SUB 120 | 0x1cc:SWAP1 121 | 0x1cd:RETURN"] 122 | 123 | } -------------------------------------------------------------------------------- /tests/expected-fomo3d-output/fomo3d.evm_exit().dot: -------------------------------------------------------------------------------- 1 | digraph{ 2 | 1992[label="0x7c8:JUMPDEST 3 | 0x7c9:CALLVALUE 4 | 0x7ca:DUP1 5 | 0x7cb:ISZERO 6 | 0x7cc:PUSH2 0x7d4 7 | 0x7cf:JUMPI"] 8 | 1992 -> 2000 9 | 1992 -> 2004 10 | 2000[label="0x7d0:PUSH1 0x0 11 | 0x7d2:DUP1 12 | 0x7d3:REVERT"] 13 | 2004[label="0x7d4:JUMPDEST 14 | 0x7d5:POP 15 | 0x7d6:PUSH2 0x7dd 16 | 0x7d9:PUSH2 0x1fd6 17 | 0x7dc:JUMP"] 18 | 2004 -> 8150 19 | 8150[label="0x1fd6:JUMPDEST 20 | 0x1fd7:PUSH1 0x0 21 | 0x1fd9:DUP1 22 | 0x1fda:CALLER 23 | 0x1fdb:SWAP2 24 | 0x1fdc:POP 25 | 0x1fdd:PUSH1 0x4 26 | 0x1fdf:PUSH1 0x0 27 | 0x1fe1:DUP4 28 | 0x1fe2:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 29 | 0x1ff7:AND 30 | 0x1ff8:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 31 | 0x200d:AND 32 | 0x200e:DUP2 33 | 0x200f:MSTORE 34 | 0x2010:PUSH1 0x20 35 | 0x2012:ADD 36 | 0x2013:SWAP1 37 | 0x2014:DUP2 38 | 0x2015:MSTORE 39 | 0x2016:PUSH1 0x20 40 | 0x2018:ADD 41 | 0x2019:PUSH1 0x0 42 | 0x201b:SHA3 43 | 0x201c:SLOAD 44 | 0x201d:SWAP1 45 | 0x201e:POP 46 | 0x201f:PUSH1 0x0 47 | 0x2021:DUP2 48 | 0x2022:GT 49 | 0x2023:ISZERO 50 | 0x2024:PUSH2 0x2031 51 | 0x2027:JUMPI"] 52 | 8150 -> 8232 53 | 8150 -> 8241 54 | 8232[label="0x2028:PUSH2 0x2030 55 | 0x202b:DUP2 56 | 0x202c:PUSH2 0x1da8 57 | 0x202f:JUMP"] 58 | 8232 -> 7592 59 | 7592[label="0x1da8:JUMPDEST 60 | 0x1da9:PUSH1 0x0 61 | 0x1dab:DUP1 62 | 0x1dac:PUSH1 0x0 63 | 0x1dae:DUP1 64 | 0x1daf:PUSH1 0x0 65 | 0x1db1:DUP1 66 | 0x1db2:PUSH1 0x0 67 | 0x1db4:PUSH2 0x1dbb 68 | 0x1db7:PUSH2 0x17d4 69 | 0x1dba:JUMP"] 70 | 7592 -> 6100 71 | 6100[label="0x17d4:JUMPDEST 72 | 0x17d5:PUSH1 0x0 73 | 0x17d7:DUP1 74 | 0x17d8:CALLER 75 | 0x17d9:SWAP1 76 | 0x17da:POP 77 | 0x17db:PUSH2 0x17e3 78 | 0x17de:DUP2 79 | 0x17df:PUSH2 0x15d6 80 | 0x17e2:JUMP"] 81 | 6100 -> 5590 82 | 5590[label="0x15d6:JUMPDEST 83 | 0x15d7:PUSH1 0x0 84 | 0x15d9:PUSH1 0x4 85 | 0x15db:PUSH1 0x0 86 | 0x15dd:DUP4 87 | 0x15de:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 88 | 0x15f3:AND 89 | 0x15f4:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 90 | 0x1609:AND 91 | 0x160a:DUP2 92 | 0x160b:MSTORE 93 | 0x160c:PUSH1 0x20 94 | 0x160e:ADD 95 | 0x160f:SWAP1 96 | 0x1610:DUP2 97 | 0x1611:MSTORE 98 | 0x1612:PUSH1 0x20 99 | 0x1614:ADD 100 | 0x1615:PUSH1 0x0 101 | 0x1617:SHA3 102 | 0x1618:SLOAD 103 | 0x1619:SWAP1 104 | 0x161a:POP 105 | 0x161b:SWAP2 106 | 0x161c:SWAP1 107 | 0x161d:POP 108 | 0x161e:JUMP"] 109 | 5590 -> 6115 110 | 8241[label="0x2031:JUMPDEST 111 | 0x2032:PUSH2 0x2039 112 | 0x2035:PUSH2 0x1343 113 | 0x2038:JUMP"] 114 | 8241 -> 4931 115 | 6115[label="0x17e3:JUMPDEST 116 | 0x17e4:SWAP2 117 | 0x17e5:POP 118 | 0x17e6:POP 119 | 0x17e7:SWAP1 120 | 0x17e8:JUMP"] 121 | 6115 -> 7611 122 | 7611[label="0x1dbb:JUMPDEST 123 | 0x1dbc:GT 124 | 0x1dbd:ISZERO 125 | 0x1dbe:ISZERO 126 | 0x1dbf:PUSH2 0x1dc7 127 | 0x1dc2:JUMPI"] 128 | 7611 -> 7619 129 | 7611 -> 7623 130 | 7619[label="0x1dc3:PUSH1 0x0 131 | 0x1dc5:DUP1 132 | 0x1dc6:REVERT"] 133 | 4931[label="0x1343:JUMPDEST 134 | 0x1344:PUSH1 0x0 135 | 0x1346:DUP1 136 | 0x1347:PUSH1 0x0 137 | 0x1349:PUSH2 0x1352 138 | 0x134c:PUSH1 0x1 139 | 0x134e:PUSH2 0x154b 140 | 0x1351:JUMP"] 141 | 4931 -> 5451 142 | 7623[label="0x1dc7:JUMPDEST 143 | 0x1dc8:CALLER 144 | 0x1dc9:SWAP6 145 | 0x1dca:POP 146 | 0x1dcb:PUSH1 0x4 147 | 0x1dcd:PUSH1 0x0 148 | 0x1dcf:DUP8 149 | 0x1dd0:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 150 | 0x1de5:AND 151 | 0x1de6:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 152 | 0x1dfb:AND 153 | 0x1dfc:DUP2 154 | 0x1dfd:MSTORE 155 | 0x1dfe:PUSH1 0x20 156 | 0x1e00:ADD 157 | 0x1e01:SWAP1 158 | 0x1e02:DUP2 159 | 0x1e03:MSTORE 160 | 0x1e04:PUSH1 0x20 161 | 0x1e06:ADD 162 | 0x1e07:PUSH1 0x0 163 | 0x1e09:SHA3 164 | 0x1e0a:SLOAD 165 | 0x1e0b:DUP8 166 | 0x1e0c:GT 167 | 0x1e0d:ISZERO 168 | 0x1e0e:ISZERO 169 | 0x1e0f:ISZERO 170 | 0x1e10:PUSH2 0x1e18 171 | 0x1e13:JUMPI"] 172 | 7623 -> 7700 173 | 7623 -> 7704 174 | 7700[label="0x1e14:PUSH1 0x0 175 | 0x1e16:DUP1 176 | 0x1e17:REVERT"] 177 | 5451[label="0x154b:JUMPDEST 178 | 0x154c:PUSH1 0x0 179 | 0x154e:DUP1 180 | 0x154f:CALLER 181 | 0x1550:SWAP1 182 | 0x1551:POP 183 | 0x1552:DUP3 184 | 0x1553:PUSH2 0x1564 185 | 0x1556:JUMPI"] 186 | 5451 -> 5463 187 | 5451 -> 5476 188 | 5463[label="0x1557:PUSH2 0x155f 189 | 0x155a:DUP2 190 | 0x155b:PUSH2 0x1140 191 | 0x155e:JUMP"] 192 | 5463 -> 4416 193 | 5476[label="0x1564:JUMPDEST 194 | 0x1565:PUSH1 0x5 195 | 0x1567:PUSH1 0x0 196 | 0x1569:DUP3 197 | 0x156a:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 198 | 0x157f:AND 199 | 0x1580:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 200 | 0x1595:AND 201 | 0x1596:DUP2 202 | 0x1597:MSTORE 203 | 0x1598:PUSH1 0x20 204 | 0x159a:ADD 205 | 0x159b:SWAP1 206 | 0x159c:DUP2 207 | 0x159d:MSTORE 208 | 0x159e:PUSH1 0x20 209 | 0x15a0:ADD 210 | 0x15a1:PUSH1 0x0 211 | 0x15a3:SHA3 212 | 0x15a4:SLOAD 213 | 0x15a5:PUSH2 0x15ad 214 | 0x15a8:DUP3 215 | 0x15a9:PUSH2 0x1140 216 | 0x15ac:JUMP"] 217 | 5476 -> 4416 218 | 4416[label="0x1140:JUMPDEST 219 | 0x1141:PUSH1 0x0 220 | 0x1143:PUSH9 0x10000000000000000 221 | 0x114d:PUSH1 0x6 222 | 0x114f:PUSH1 0x0 223 | 0x1151:DUP5 224 | 0x1152:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 225 | 0x1167:AND 226 | 0x1168:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 227 | 0x117d:AND 228 | 0x117e:DUP2 229 | 0x117f:MSTORE 230 | 0x1180:PUSH1 0x20 231 | 0x1182:ADD 232 | 0x1183:SWAP1 233 | 0x1184:DUP2 234 | 0x1185:MSTORE 235 | 0x1186:PUSH1 0x20 236 | 0x1188:ADD 237 | 0x1189:PUSH1 0x0 238 | 0x118b:SHA3 239 | 0x118c:SLOAD 240 | 0x118d:PUSH1 0x4 241 | 0x118f:PUSH1 0x0 242 | 0x1191:DUP6 243 | 0x1192:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 244 | 0x11a7:AND 245 | 0x11a8:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 246 | 0x11bd:AND 247 | 0x11be:DUP2 248 | 0x11bf:MSTORE 249 | 0x11c0:PUSH1 0x20 250 | 0x11c2:ADD 251 | 0x11c3:SWAP1 252 | 0x11c4:DUP2 253 | 0x11c5:MSTORE 254 | 0x11c6:PUSH1 0x20 255 | 0x11c8:ADD 256 | 0x11c9:PUSH1 0x0 257 | 0x11cb:SHA3 258 | 0x11cc:SLOAD 259 | 0x11cd:PUSH1 0x9 260 | 0x11cf:SLOAD 261 | 0x11d0:MUL 262 | 0x11d1:SUB 263 | 0x11d2:DUP2 264 | 0x11d3:ISZERO 265 | 0x11d4:ISZERO 266 | 0x11d5:PUSH2 0x11da 267 | 0x11d8:JUMPI"] 268 | 4416 -> 4569 269 | 4416 -> 4570 270 | 4569[label="0x11d9:INVALID"] 271 | 7704[label="0x1e18:JUMPDEST 272 | 0x1e19:DUP7 273 | 0x1e1a:SWAP5 274 | 0x1e1b:POP 275 | 0x1e1c:PUSH2 0x1e24 276 | 0x1e1f:DUP6 277 | 0x1e20:PUSH2 0x22a2 278 | 0x1e23:JUMP"] 279 | 7704 -> 8866 280 | 8866[label="0x22a2:JUMPDEST 281 | 0x22a3:PUSH1 0x0 282 | 0x22a5:DUP1 283 | 0x22a6:PUSH1 0x0 284 | 0x22a8:DUP1 285 | 0x22a9:PUSH8 0xde0b6b3a7640000 286 | 0x22b2:DUP6 287 | 0x22b3:ADD 288 | 0x22b4:SWAP3 289 | 0x22b5:POP 290 | 0x22b6:PUSH8 0xde0b6b3a7640000 291 | 0x22bf:PUSH1 0x8 292 | 0x22c1:SLOAD 293 | 0x22c2:ADD 294 | 0x22c3:SWAP2 295 | 0x22c4:POP 296 | 0x22c5:PUSH8 0xde0b6b3a7640000 297 | 0x22ce:PUSH2 0x2336 298 | 0x22d1:PUSH8 0xde0b6b3a7640000 299 | 0x22da:DUP6 300 | 0x22db:SUB 301 | 0x22dc:PUSH5 0x2540be400 302 | 0x22e2:PUSH8 0xde0b6b3a7640000 303 | 0x22eb:DUP7 304 | 0x22ec:DUP2 305 | 0x22ed:ISZERO 306 | 0x22ee:ISZERO 307 | 0x22ef:PUSH2 0x22f4 308 | 0x22f2:JUMPI"] 309 | 8866 -> 8947 310 | 8866 -> 8948 311 | 8947[label="0x22f3:INVALID"] 312 | 4570[label="0x11da:JUMPDEST 313 | 0x11db:DIV 314 | 0x11dc:SWAP1 315 | 0x11dd:POP 316 | 0x11de:SWAP2 317 | 0x11df:SWAP1 318 | 0x11e0:POP 319 | 0x11e1:JUMP"] 320 | 4570 -> 5549 321 | 4570 -> 5471 322 | 8948[label="0x22f4:JUMPDEST 323 | 0x22f5:DIV 324 | 0x22f6:PUSH5 0x2540be400 325 | 0x22fc:MUL 326 | 0x22fd:PUSH5 0x174876e800 327 | 0x2303:ADD 328 | 0x2304:SUB 329 | 0x2305:MUL 330 | 0x2306:PUSH1 0x2 331 | 0x2308:PUSH8 0xde0b6b3a7640000 332 | 0x2311:DUP8 333 | 0x2312:PUSH1 0x2 334 | 0x2314:DUP10 335 | 0x2315:EXP 336 | 0x2316:SUB 337 | 0x2317:DUP2 338 | 0x2318:ISZERO 339 | 0x2319:ISZERO 340 | 0x231a:PUSH2 0x231f 341 | 0x231d:JUMPI"] 342 | 8948 -> 8990 343 | 8948 -> 8991 344 | 8990[label="0x231e:INVALID"] 345 | 5549[label="0x15ad:JUMPDEST 346 | 0x15ae:ADD"] 347 | 5549 -> 5551 348 | 5551[label="0x15af:JUMPDEST 349 | 0x15b0:SWAP2 350 | 0x15b1:POP 351 | 0x15b2:POP 352 | 0x15b3:SWAP2 353 | 0x15b4:SWAP1 354 | 0x15b5:POP 355 | 0x15b6:JUMP"] 356 | 5551 -> 4946 357 | 5551 -> 8249 358 | 5551 -> 4971 359 | 5551 -> 2013 360 | 5551 -> 8240 361 | 5471[label="0x155f:JUMPDEST 362 | 0x1560:PUSH2 0x15af 363 | 0x1563:JUMP"] 364 | 5471 -> 5551 365 | 4946[label="0x1352:JUMPDEST 366 | 0x1353:GT 367 | 0x1354:ISZERO 368 | 0x1355:ISZERO 369 | 0x1356:PUSH2 0x135e 370 | 0x1359:JUMPI"] 371 | 4946 -> 4954 372 | 4946 -> 4958 373 | 4954[label="0x135a:PUSH1 0x0 374 | 0x135c:DUP1 375 | 0x135d:REVERT"] 376 | 8991[label="0x231f:JUMPDEST 377 | 0x2320:DIV 378 | 0x2321:PUSH5 0x2540be400 379 | 0x2327:MUL 380 | 0x2328:DUP2 381 | 0x2329:ISZERO 382 | 0x232a:ISZERO 383 | 0x232b:PUSH2 0x2330 384 | 0x232e:JUMPI"] 385 | 8991 -> 9007 386 | 8991 -> 9008 387 | 9007[label="0x232f:INVALID"] 388 | 4958[label="0x135e:JUMPDEST 389 | 0x135f:CALLER 390 | 0x1360:SWAP2 391 | 0x1361:POP 392 | 0x1362:PUSH2 0x136b 393 | 0x1365:PUSH1 0x0 394 | 0x1367:PUSH2 0x154b 395 | 0x136a:JUMP"] 396 | 4958 -> 5451 397 | 9008[label="0x2330:JUMPDEST 398 | 0x2331:DIV 399 | 0x2332:PUSH2 0x21fc 400 | 0x2335:JUMP"] 401 | 9008 -> 8700 402 | 8700[label="0x21fc:JUMPDEST 403 | 0x21fd:PUSH1 0x0 404 | 0x21ff:DUP3 405 | 0x2200:DUP3 406 | 0x2201:GT 407 | 0x2202:ISZERO 408 | 0x2203:ISZERO 409 | 0x2204:ISZERO 410 | 0x2205:PUSH2 0x220a 411 | 0x2208:JUMPI"] 412 | 8700 -> 8713 413 | 8700 -> 8714 414 | 8713[label="0x2209:INVALID"] 415 | 4971[label="0x136b:JUMPDEST 416 | 0x136c:SWAP1 417 | 0x136d:POP 418 | 0x136e:PUSH9 0x10000000000000000 419 | 0x1378:DUP2 420 | 0x1379:MUL 421 | 0x137a:PUSH1 0x6 422 | 0x137c:PUSH1 0x0 423 | 0x137e:DUP5 424 | 0x137f:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 425 | 0x1394:AND 426 | 0x1395:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 427 | 0x13aa:AND 428 | 0x13ab:DUP2 429 | 0x13ac:MSTORE 430 | 0x13ad:PUSH1 0x20 431 | 0x13af:ADD 432 | 0x13b0:SWAP1 433 | 0x13b1:DUP2 434 | 0x13b2:MSTORE 435 | 0x13b3:PUSH1 0x20 436 | 0x13b5:ADD 437 | 0x13b6:PUSH1 0x0 438 | 0x13b8:SHA3 439 | 0x13b9:PUSH1 0x0 440 | 0x13bb:DUP3 441 | 0x13bc:DUP3 442 | 0x13bd:SLOAD 443 | 0x13be:ADD 444 | 0x13bf:SWAP3 445 | 0x13c0:POP 446 | 0x13c1:POP 447 | 0x13c2:DUP2 448 | 0x13c3:SWAP1 449 | 0x13c4:SSTORE 450 | 0x13c5:POP 451 | 0x13c6:PUSH1 0x5 452 | 0x13c8:PUSH1 0x0 453 | 0x13ca:DUP4 454 | 0x13cb:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 455 | 0x13e0:AND 456 | 0x13e1:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 457 | 0x13f6:AND 458 | 0x13f7:DUP2 459 | 0x13f8:MSTORE 460 | 0x13f9:PUSH1 0x20 461 | 0x13fb:ADD 462 | 0x13fc:SWAP1 463 | 0x13fd:DUP2 464 | 0x13fe:MSTORE 465 | 0x13ff:PUSH1 0x20 466 | 0x1401:ADD 467 | 0x1402:PUSH1 0x0 468 | 0x1404:SHA3 469 | 0x1405:SLOAD 470 | 0x1406:DUP2 471 | 0x1407:ADD 472 | 0x1408:SWAP1 473 | 0x1409:POP 474 | 0x140a:PUSH1 0x0 475 | 0x140c:PUSH1 0x5 476 | 0x140e:PUSH1 0x0 477 | 0x1410:DUP5 478 | 0x1411:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 479 | 0x1426:AND 480 | 0x1427:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 481 | 0x143c:AND 482 | 0x143d:DUP2 483 | 0x143e:MSTORE 484 | 0x143f:PUSH1 0x20 485 | 0x1441:ADD 486 | 0x1442:SWAP1 487 | 0x1443:DUP2 488 | 0x1444:MSTORE 489 | 0x1445:PUSH1 0x20 490 | 0x1447:ADD 491 | 0x1448:PUSH1 0x0 492 | 0x144a:SHA3 493 | 0x144b:DUP2 494 | 0x144c:SWAP1 495 | 0x144d:SSTORE 496 | 0x144e:POP 497 | 0x144f:DUP2 498 | 0x1450:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 499 | 0x1465:AND 500 | 0x1466:PUSH2 0x8fc 501 | 0x1469:DUP3 502 | 0x146a:SWAP1 503 | 0x146b:DUP2 504 | 0x146c:ISZERO 505 | 0x146d:MUL 506 | 0x146e:SWAP1 507 | 0x146f:PUSH1 0x40 508 | 0x1471:MLOAD 509 | 0x1472:PUSH1 0x0 510 | 0x1474:PUSH1 0x40 511 | 0x1476:MLOAD 512 | 0x1477:DUP1 513 | 0x1478:DUP4 514 | 0x1479:SUB 515 | 0x147a:DUP2 516 | 0x147b:DUP6 517 | 0x147c:DUP9 518 | 0x147d:DUP9 519 | 0x147e:CALL 520 | 0x147f:SWAP4 521 | 0x1480:POP 522 | 0x1481:POP 523 | 0x1482:POP 524 | 0x1483:POP 525 | 0x1484:ISZERO 526 | 0x1485:DUP1 527 | 0x1486:ISZERO 528 | 0x1487:PUSH2 0x1494 529 | 0x148a:JUMPI"] 530 | 4971 -> 5259 531 | 4971 -> 5268 532 | 5259[label="0x148b:RETURNDATASIZE 533 | 0x148c:PUSH1 0x0 534 | 0x148e:DUP1 535 | 0x148f:RETURNDATACOPY 536 | 0x1490:RETURNDATASIZE 537 | 0x1491:PUSH1 0x0 538 | 0x1493:REVERT"] 539 | 8249[label="0x2039:JUMPDEST 540 | 0x203a:POP 541 | 0x203b:POP 542 | 0x203c:JUMP"] 543 | 8249 -> 8249 544 | 8249 -> 2013 545 | 8249 -> 8240 546 | 8249 -> 4946 547 | 8249 -> 4971 548 | 2013[label="0x7dd:JUMPDEST 549 | 0x7de:STOP"] 550 | 5268[label="0x1494:JUMPDEST 551 | 0x1495:POP 552 | 0x1496:DUP2 553 | 0x1497:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 554 | 0x14ac:AND 555 | 0x14ad:PUSH32 0xccad973dcd043c7d680389db4378bd6b9775db7124092e9e0422c9e46d7985dc 556 | 0x14ce:DUP3 557 | 0x14cf:PUSH1 0x40 558 | 0x14d1:MLOAD 559 | 0x14d2:DUP1 560 | 0x14d3:DUP3 561 | 0x14d4:DUP2 562 | 0x14d5:MSTORE 563 | 0x14d6:PUSH1 0x20 564 | 0x14d8:ADD 565 | 0x14d9:SWAP2 566 | 0x14da:POP 567 | 0x14db:POP 568 | 0x14dc:PUSH1 0x40 569 | 0x14de:MLOAD 570 | 0x14df:DUP1 571 | 0x14e0:SWAP2 572 | 0x14e1:SUB 573 | 0x14e2:SWAP1 574 | 0x14e3:LOG2 575 | 0x14e4:POP 576 | 0x14e5:POP 577 | 0x14e6:JUMP"] 578 | 5268 -> 8249 579 | 5268 -> 2013 580 | 5268 -> 8240 581 | 5268 -> 4946 582 | 5268 -> 4971 583 | 8714[label="0x220a:JUMPDEST 584 | 0x220b:DUP2 585 | 0x220c:DUP4 586 | 0x220d:SUB 587 | 0x220e:SWAP1 588 | 0x220f:POP 589 | 0x2210:SWAP3 590 | 0x2211:SWAP2 591 | 0x2212:POP 592 | 0x2213:POP 593 | 0x2214:JUMP"] 594 | 8714 -> 9014 595 | 8714 -> 7744 596 | 8714 -> 7758 597 | 8714 -> 7837 598 | 9014[label="0x2336:JUMPDEST 599 | 0x2337:DUP2 600 | 0x2338:ISZERO 601 | 0x2339:ISZERO 602 | 0x233a:PUSH2 0x233f 603 | 0x233d:JUMPI"] 604 | 9014 -> 9022 605 | 9014 -> 9023 606 | 9022[label="0x233e:INVALID"] 607 | 9023[label="0x233f:JUMPDEST 608 | 0x2340:DIV 609 | 0x2341:SWAP1 610 | 0x2342:POP 611 | 0x2343:DUP1 612 | 0x2344:SWAP4 613 | 0x2345:POP 614 | 0x2346:POP 615 | 0x2347:POP 616 | 0x2348:POP 617 | 0x2349:SWAP2 618 | 0x234a:SWAP1 619 | 0x234b:POP 620 | 0x234c:JUMP"] 621 | 9023 -> 7716 622 | 7716[label="0x1e24:JUMPDEST 623 | 0x1e25:SWAP4 624 | 0x1e26:POP 625 | 0x1e27:PUSH2 0x1e34 626 | 0x1e2a:DUP5 627 | 0x1e2b:PUSH1 0x5 628 | 0x1e2d:PUSH1 0xff 629 | 0x1e2f:AND 630 | 0x1e30:PUSH2 0x21e1 631 | 0x1e33:JUMP"] 632 | 7716 -> 8673 633 | 8673[label="0x21e1:JUMPDEST 634 | 0x21e2:PUSH1 0x0 635 | 0x21e4:DUP1 636 | 0x21e5:DUP3 637 | 0x21e6:DUP5 638 | 0x21e7:DUP2 639 | 0x21e8:ISZERO 640 | 0x21e9:ISZERO 641 | 0x21ea:PUSH2 0x21ef 642 | 0x21ed:JUMPI"] 643 | 8673 -> 8686 644 | 8673 -> 8687 645 | 8686[label="0x21ee:INVALID"] 646 | 8687[label="0x21ef:JUMPDEST 647 | 0x21f0:DIV 648 | 0x21f1:SWAP1 649 | 0x21f2:POP 650 | 0x21f3:DUP1 651 | 0x21f4:SWAP2 652 | 0x21f5:POP 653 | 0x21f6:POP 654 | 0x21f7:SWAP3 655 | 0x21f8:SWAP2 656 | 0x21f9:POP 657 | 0x21fa:POP 658 | 0x21fb:JUMP"] 659 | 8687 -> 7732 660 | 7732[label="0x1e34:JUMPDEST 661 | 0x1e35:SWAP3 662 | 0x1e36:POP 663 | 0x1e37:PUSH2 0x1e40 664 | 0x1e3a:DUP5 665 | 0x1e3b:DUP5 666 | 0x1e3c:PUSH2 0x21fc 667 | 0x1e3f:JUMP"] 668 | 7732 -> 8700 669 | 7744[label="0x1e40:JUMPDEST 670 | 0x1e41:SWAP2 671 | 0x1e42:POP 672 | 0x1e43:PUSH2 0x1e4e 673 | 0x1e46:PUSH1 0x8 674 | 0x1e48:SLOAD 675 | 0x1e49:DUP7 676 | 0x1e4a:PUSH2 0x21fc 677 | 0x1e4d:JUMP"] 678 | 7744 -> 8700 679 | 7758[label="0x1e4e:JUMPDEST 680 | 0x1e4f:PUSH1 0x8 681 | 0x1e51:DUP2 682 | 0x1e52:SWAP1 683 | 0x1e53:SSTORE 684 | 0x1e54:POP 685 | 0x1e55:PUSH2 0x1e9d 686 | 0x1e58:PUSH1 0x4 687 | 0x1e5a:PUSH1 0x0 688 | 0x1e5c:DUP9 689 | 0x1e5d:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 690 | 0x1e72:AND 691 | 0x1e73:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 692 | 0x1e88:AND 693 | 0x1e89:DUP2 694 | 0x1e8a:MSTORE 695 | 0x1e8b:PUSH1 0x20 696 | 0x1e8d:ADD 697 | 0x1e8e:SWAP1 698 | 0x1e8f:DUP2 699 | 0x1e90:MSTORE 700 | 0x1e91:PUSH1 0x20 701 | 0x1e93:ADD 702 | 0x1e94:PUSH1 0x0 703 | 0x1e96:SHA3 704 | 0x1e97:SLOAD 705 | 0x1e98:DUP7 706 | 0x1e99:PUSH2 0x21fc 707 | 0x1e9c:JUMP"] 708 | 7758 -> 8700 709 | 7837[label="0x1e9d:JUMPDEST 710 | 0x1e9e:PUSH1 0x4 711 | 0x1ea0:PUSH1 0x0 712 | 0x1ea2:DUP9 713 | 0x1ea3:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 714 | 0x1eb8:AND 715 | 0x1eb9:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 716 | 0x1ece:AND 717 | 0x1ecf:DUP2 718 | 0x1ed0:MSTORE 719 | 0x1ed1:PUSH1 0x20 720 | 0x1ed3:ADD 721 | 0x1ed4:SWAP1 722 | 0x1ed5:DUP2 723 | 0x1ed6:MSTORE 724 | 0x1ed7:PUSH1 0x20 725 | 0x1ed9:ADD 726 | 0x1eda:PUSH1 0x0 727 | 0x1edc:SHA3 728 | 0x1edd:DUP2 729 | 0x1ede:SWAP1 730 | 0x1edf:SSTORE 731 | 0x1ee0:POP 732 | 0x1ee1:PUSH9 0x10000000000000000 733 | 0x1eeb:DUP3 734 | 0x1eec:MUL 735 | 0x1eed:DUP6 736 | 0x1eee:PUSH1 0x9 737 | 0x1ef0:SLOAD 738 | 0x1ef1:MUL 739 | 0x1ef2:ADD 740 | 0x1ef3:SWAP1 741 | 0x1ef4:POP 742 | 0x1ef5:DUP1 743 | 0x1ef6:PUSH1 0x6 744 | 0x1ef8:PUSH1 0x0 745 | 0x1efa:DUP9 746 | 0x1efb:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 747 | 0x1f10:AND 748 | 0x1f11:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 749 | 0x1f26:AND 750 | 0x1f27:DUP2 751 | 0x1f28:MSTORE 752 | 0x1f29:PUSH1 0x20 753 | 0x1f2b:ADD 754 | 0x1f2c:SWAP1 755 | 0x1f2d:DUP2 756 | 0x1f2e:MSTORE 757 | 0x1f2f:PUSH1 0x20 758 | 0x1f31:ADD 759 | 0x1f32:PUSH1 0x0 760 | 0x1f34:SHA3 761 | 0x1f35:PUSH1 0x0 762 | 0x1f37:DUP3 763 | 0x1f38:DUP3 764 | 0x1f39:SLOAD 765 | 0x1f3a:SUB 766 | 0x1f3b:SWAP3 767 | 0x1f3c:POP 768 | 0x1f3d:POP 769 | 0x1f3e:DUP2 770 | 0x1f3f:SWAP1 771 | 0x1f40:SSTORE 772 | 0x1f41:POP 773 | 0x1f42:PUSH1 0x0 774 | 0x1f44:PUSH1 0x8 775 | 0x1f46:SLOAD 776 | 0x1f47:GT 777 | 0x1f48:ISZERO 778 | 0x1f49:PUSH2 0x1f77 779 | 0x1f4c:JUMPI"] 780 | 7837 -> 8013 781 | 7837 -> 8055 782 | 8013[label="0x1f4d:PUSH2 0x1f70 783 | 0x1f50:PUSH1 0x9 784 | 0x1f52:SLOAD 785 | 0x1f53:PUSH1 0x8 786 | 0x1f55:SLOAD 787 | 0x1f56:PUSH9 0x10000000000000000 788 | 0x1f60:DUP7 789 | 0x1f61:MUL 790 | 0x1f62:DUP2 791 | 0x1f63:ISZERO 792 | 0x1f64:ISZERO 793 | 0x1f65:PUSH2 0x1f6a 794 | 0x1f68:JUMPI"] 795 | 8013 -> 8041 796 | 8013 -> 8042 797 | 8041[label="0x1f69:INVALID"] 798 | 8055[label="0x1f77:JUMPDEST 799 | 0x1f78:DUP6 800 | 0x1f79:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 801 | 0x1f8e:AND 802 | 0x1f8f:PUSH32 0xc4823739c5787d2ca17e404aa47d5569ae71dfb49cbf21b3f6152ed238a31139 803 | 0x1fb0:DUP7 804 | 0x1fb1:DUP5 805 | 0x1fb2:PUSH1 0x40 806 | 0x1fb4:MLOAD 807 | 0x1fb5:DUP1 808 | 0x1fb6:DUP4 809 | 0x1fb7:DUP2 810 | 0x1fb8:MSTORE 811 | 0x1fb9:PUSH1 0x20 812 | 0x1fbb:ADD 813 | 0x1fbc:DUP3 814 | 0x1fbd:DUP2 815 | 0x1fbe:MSTORE 816 | 0x1fbf:PUSH1 0x20 817 | 0x1fc1:ADD 818 | 0x1fc2:SWAP3 819 | 0x1fc3:POP 820 | 0x1fc4:POP 821 | 0x1fc5:POP 822 | 0x1fc6:PUSH1 0x40 823 | 0x1fc8:MLOAD 824 | 0x1fc9:DUP1 825 | 0x1fca:SWAP2 826 | 0x1fcb:SUB 827 | 0x1fcc:SWAP1 828 | 0x1fcd:LOG2 829 | 0x1fce:POP 830 | 0x1fcf:POP 831 | 0x1fd0:POP 832 | 0x1fd1:POP 833 | 0x1fd2:POP 834 | 0x1fd3:POP 835 | 0x1fd4:POP 836 | 0x1fd5:JUMP"] 837 | 8055 -> 8240 838 | 8240[label="0x2030:JUMPDEST"] 839 | 8240 -> 8241 840 | 8042[label="0x1f6a:JUMPDEST 841 | 0x1f6b:DIV 842 | 0x1f6c:PUSH2 0x21c3 843 | 0x1f6f:JUMP"] 844 | 8042 -> 8643 845 | 8643[label="0x21c3:JUMPDEST 846 | 0x21c4:PUSH1 0x0 847 | 0x21c6:DUP1 848 | 0x21c7:DUP3 849 | 0x21c8:DUP5 850 | 0x21c9:ADD 851 | 0x21ca:SWAP1 852 | 0x21cb:POP 853 | 0x21cc:DUP4 854 | 0x21cd:DUP2 855 | 0x21ce:LT 856 | 0x21cf:ISZERO 857 | 0x21d0:ISZERO 858 | 0x21d1:ISZERO 859 | 0x21d2:PUSH2 0x21d7 860 | 0x21d5:JUMPI"] 861 | 8643 -> 8662 862 | 8643 -> 8663 863 | 8662[label="0x21d6:INVALID"] 864 | 8663[label="0x21d7:JUMPDEST 865 | 0x21d8:DUP1 866 | 0x21d9:SWAP2 867 | 0x21da:POP 868 | 0x21db:POP 869 | 0x21dc:SWAP3 870 | 0x21dd:SWAP2 871 | 0x21de:POP 872 | 0x21df:POP 873 | 0x21e0:JUMP"] 874 | 8663 -> 8048 875 | 8048[label="0x1f70:JUMPDEST 876 | 0x1f71:PUSH1 0x9 877 | 0x1f73:DUP2 878 | 0x1f74:SWAP1 879 | 0x1f75:SSTORE 880 | 0x1f76:POP"] 881 | 8048 -> 8055 882 | 883 | } -------------------------------------------------------------------------------- /tests/expected-fomo3d-output/fomo3d.evm_myDividends(bool).dot: -------------------------------------------------------------------------------- 1 | digraph{ 2 | 1057[label="0x421:JUMPDEST 3 | 0x422:CALLVALUE 4 | 0x423:DUP1 5 | 0x424:ISZERO 6 | 0x425:PUSH2 0x42d 7 | 0x428:JUMPI"] 8 | 1057 -> 1065 9 | 1057 -> 1069 10 | 1065[label="0x429:PUSH1 0x0 11 | 0x42b:DUP1 12 | 0x42c:REVERT"] 13 | 1069[label="0x42d:JUMPDEST 14 | 0x42e:POP 15 | 0x42f:PUSH2 0x44e 16 | 0x432:PUSH1 0x4 17 | 0x434:DUP1 18 | 0x435:CALLDATASIZE 19 | 0x436:SUB 20 | 0x437:DUP2 21 | 0x438:ADD 22 | 0x439:SWAP1 23 | 0x43a:DUP1 24 | 0x43b:DUP1 25 | 0x43c:CALLDATALOAD 26 | 0x43d:ISZERO 27 | 0x43e:ISZERO 28 | 0x43f:SWAP1 29 | 0x440:PUSH1 0x20 30 | 0x442:ADD 31 | 0x443:SWAP1 32 | 0x444:SWAP3 33 | 0x445:SWAP2 34 | 0x446:SWAP1 35 | 0x447:POP 36 | 0x448:POP 37 | 0x449:POP 38 | 0x44a:PUSH2 0x154b 39 | 0x44d:JUMP"] 40 | 1069 -> 5451 41 | 5451[label="0x154b:JUMPDEST 42 | 0x154c:PUSH1 0x0 43 | 0x154e:DUP1 44 | 0x154f:CALLER 45 | 0x1550:SWAP1 46 | 0x1551:POP 47 | 0x1552:DUP3 48 | 0x1553:PUSH2 0x1564 49 | 0x1556:JUMPI"] 50 | 5451 -> 5463 51 | 5451 -> 5476 52 | 5463[label="0x1557:PUSH2 0x155f 53 | 0x155a:DUP2 54 | 0x155b:PUSH2 0x1140 55 | 0x155e:JUMP"] 56 | 5463 -> 4416 57 | 5476[label="0x1564:JUMPDEST 58 | 0x1565:PUSH1 0x5 59 | 0x1567:PUSH1 0x0 60 | 0x1569:DUP3 61 | 0x156a:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 62 | 0x157f:AND 63 | 0x1580:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 64 | 0x1595:AND 65 | 0x1596:DUP2 66 | 0x1597:MSTORE 67 | 0x1598:PUSH1 0x20 68 | 0x159a:ADD 69 | 0x159b:SWAP1 70 | 0x159c:DUP2 71 | 0x159d:MSTORE 72 | 0x159e:PUSH1 0x20 73 | 0x15a0:ADD 74 | 0x15a1:PUSH1 0x0 75 | 0x15a3:SHA3 76 | 0x15a4:SLOAD 77 | 0x15a5:PUSH2 0x15ad 78 | 0x15a8:DUP3 79 | 0x15a9:PUSH2 0x1140 80 | 0x15ac:JUMP"] 81 | 5476 -> 4416 82 | 4416[label="0x1140:JUMPDEST 83 | 0x1141:PUSH1 0x0 84 | 0x1143:PUSH9 0x10000000000000000 85 | 0x114d:PUSH1 0x6 86 | 0x114f:PUSH1 0x0 87 | 0x1151:DUP5 88 | 0x1152:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 89 | 0x1167:AND 90 | 0x1168:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 91 | 0x117d:AND 92 | 0x117e:DUP2 93 | 0x117f:MSTORE 94 | 0x1180:PUSH1 0x20 95 | 0x1182:ADD 96 | 0x1183:SWAP1 97 | 0x1184:DUP2 98 | 0x1185:MSTORE 99 | 0x1186:PUSH1 0x20 100 | 0x1188:ADD 101 | 0x1189:PUSH1 0x0 102 | 0x118b:SHA3 103 | 0x118c:SLOAD 104 | 0x118d:PUSH1 0x4 105 | 0x118f:PUSH1 0x0 106 | 0x1191:DUP6 107 | 0x1192:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 108 | 0x11a7:AND 109 | 0x11a8:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 110 | 0x11bd:AND 111 | 0x11be:DUP2 112 | 0x11bf:MSTORE 113 | 0x11c0:PUSH1 0x20 114 | 0x11c2:ADD 115 | 0x11c3:SWAP1 116 | 0x11c4:DUP2 117 | 0x11c5:MSTORE 118 | 0x11c6:PUSH1 0x20 119 | 0x11c8:ADD 120 | 0x11c9:PUSH1 0x0 121 | 0x11cb:SHA3 122 | 0x11cc:SLOAD 123 | 0x11cd:PUSH1 0x9 124 | 0x11cf:SLOAD 125 | 0x11d0:MUL 126 | 0x11d1:SUB 127 | 0x11d2:DUP2 128 | 0x11d3:ISZERO 129 | 0x11d4:ISZERO 130 | 0x11d5:PUSH2 0x11da 131 | 0x11d8:JUMPI"] 132 | 4416 -> 4569 133 | 4416 -> 4570 134 | 4569[label="0x11d9:INVALID"] 135 | 4570[label="0x11da:JUMPDEST 136 | 0x11db:DIV 137 | 0x11dc:SWAP1 138 | 0x11dd:POP 139 | 0x11de:SWAP2 140 | 0x11df:SWAP1 141 | 0x11e0:POP 142 | 0x11e1:JUMP"] 143 | 4570 -> 5549 144 | 4570 -> 5471 145 | 5549[label="0x15ad:JUMPDEST 146 | 0x15ae:ADD"] 147 | 5549 -> 5551 148 | 5551[label="0x15af:JUMPDEST 149 | 0x15b0:SWAP2 150 | 0x15b1:POP 151 | 0x15b2:POP 152 | 0x15b3:SWAP2 153 | 0x15b4:SWAP1 154 | 0x15b5:POP 155 | 0x15b6:JUMP"] 156 | 5551 -> 1102 157 | 5471[label="0x155f:JUMPDEST 158 | 0x1560:PUSH2 0x15af 159 | 0x1563:JUMP"] 160 | 5471 -> 5551 161 | 1102[label="0x44e:JUMPDEST 162 | 0x44f:PUSH1 0x40 163 | 0x451:MLOAD 164 | 0x452:DUP1 165 | 0x453:DUP3 166 | 0x454:DUP2 167 | 0x455:MSTORE 168 | 0x456:PUSH1 0x20 169 | 0x458:ADD 170 | 0x459:SWAP2 171 | 0x45a:POP 172 | 0x45b:POP 173 | 0x45c:PUSH1 0x40 174 | 0x45e:MLOAD 175 | 0x45f:DUP1 176 | 0x460:SWAP2 177 | 0x461:SUB 178 | 0x462:SWAP1 179 | 0x463:RETURN"] 180 | 181 | } -------------------------------------------------------------------------------- /tests/expected-fomo3d-output/fomo3d.evm_myTokens().dot: -------------------------------------------------------------------------------- 1 | digraph{ 2 | 1426[label="0x592:JUMPDEST 3 | 0x593:CALLVALUE 4 | 0x594:DUP1 5 | 0x595:ISZERO 6 | 0x596:PUSH2 0x59e 7 | 0x599:JUMPI"] 8 | 1426 -> 1434 9 | 1426 -> 1438 10 | 1434[label="0x59a:PUSH1 0x0 11 | 0x59c:DUP1 12 | 0x59d:REVERT"] 13 | 1438[label="0x59e:JUMPDEST 14 | 0x59f:POP 15 | 0x5a0:PUSH2 0x5a7 16 | 0x5a3:PUSH2 0x17d4 17 | 0x5a6:JUMP"] 18 | 1438 -> 6100 19 | 6100[label="0x17d4:JUMPDEST 20 | 0x17d5:PUSH1 0x0 21 | 0x17d7:DUP1 22 | 0x17d8:CALLER 23 | 0x17d9:SWAP1 24 | 0x17da:POP 25 | 0x17db:PUSH2 0x17e3 26 | 0x17de:DUP2 27 | 0x17df:PUSH2 0x15d6 28 | 0x17e2:JUMP"] 29 | 6100 -> 5590 30 | 5590[label="0x15d6:JUMPDEST 31 | 0x15d7:PUSH1 0x0 32 | 0x15d9:PUSH1 0x4 33 | 0x15db:PUSH1 0x0 34 | 0x15dd:DUP4 35 | 0x15de:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 36 | 0x15f3:AND 37 | 0x15f4:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 38 | 0x1609:AND 39 | 0x160a:DUP2 40 | 0x160b:MSTORE 41 | 0x160c:PUSH1 0x20 42 | 0x160e:ADD 43 | 0x160f:SWAP1 44 | 0x1610:DUP2 45 | 0x1611:MSTORE 46 | 0x1612:PUSH1 0x20 47 | 0x1614:ADD 48 | 0x1615:PUSH1 0x0 49 | 0x1617:SHA3 50 | 0x1618:SLOAD 51 | 0x1619:SWAP1 52 | 0x161a:POP 53 | 0x161b:SWAP2 54 | 0x161c:SWAP1 55 | 0x161d:POP 56 | 0x161e:JUMP"] 57 | 5590 -> 6115 58 | 6115[label="0x17e3:JUMPDEST 59 | 0x17e4:SWAP2 60 | 0x17e5:POP 61 | 0x17e6:POP 62 | 0x17e7:SWAP1 63 | 0x17e8:JUMP"] 64 | 6115 -> 1447 65 | 1447[label="0x5a7:JUMPDEST 66 | 0x5a8:PUSH1 0x40 67 | 0x5aa:MLOAD 68 | 0x5ab:DUP1 69 | 0x5ac:DUP3 70 | 0x5ad:DUP2 71 | 0x5ae:MSTORE 72 | 0x5af:PUSH1 0x20 73 | 0x5b1:ADD 74 | 0x5b2:SWAP2 75 | 0x5b3:POP 76 | 0x5b4:POP 77 | 0x5b5:PUSH1 0x40 78 | 0x5b7:MLOAD 79 | 0x5b8:DUP1 80 | 0x5b9:SWAP2 81 | 0x5ba:SUB 82 | 0x5bb:SWAP1 83 | 0x5bc:RETURN"] 84 | 85 | } -------------------------------------------------------------------------------- /tests/expected-fomo3d-output/fomo3d.evm_name().dot: -------------------------------------------------------------------------------- 1 | digraph{ 2 | 462[label="0x1ce:JUMPDEST 3 | 0x1cf:CALLVALUE 4 | 0x1d0:DUP1 5 | 0x1d1:ISZERO 6 | 0x1d2:PUSH2 0x1da 7 | 0x1d5:JUMPI"] 8 | 462 -> 470 9 | 462 -> 474 10 | 470[label="0x1d6:PUSH1 0x0 11 | 0x1d8:DUP1 12 | 0x1d9:REVERT"] 13 | 474[label="0x1da:JUMPDEST 14 | 0x1db:POP 15 | 0x1dc:PUSH2 0x1e3 16 | 0x1df:PUSH2 0x11e2 17 | 0x1e2:JUMP"] 18 | 474 -> 4578 19 | 4578[label="0x11e2:JUMPDEST 20 | 0x11e3:PUSH1 0x0 21 | 0x11e5:DUP1 22 | 0x11e6:SLOAD 23 | 0x11e7:PUSH1 0x1 24 | 0x11e9:DUP2 25 | 0x11ea:PUSH1 0x1 26 | 0x11ec:AND 27 | 0x11ed:ISZERO 28 | 0x11ee:PUSH2 0x100 29 | 0x11f1:MUL 30 | 0x11f2:SUB 31 | 0x11f3:AND 32 | 0x11f4:PUSH1 0x2 33 | 0x11f6:SWAP1 34 | 0x11f7:DIV 35 | 0x11f8:DUP1 36 | 0x11f9:PUSH1 0x1f 37 | 0x11fb:ADD 38 | 0x11fc:PUSH1 0x20 39 | 0x11fe:DUP1 40 | 0x11ff:SWAP2 41 | 0x1200:DIV 42 | 0x1201:MUL 43 | 0x1202:PUSH1 0x20 44 | 0x1204:ADD 45 | 0x1205:PUSH1 0x40 46 | 0x1207:MLOAD 47 | 0x1208:SWAP1 48 | 0x1209:DUP2 49 | 0x120a:ADD 50 | 0x120b:PUSH1 0x40 51 | 0x120d:MSTORE 52 | 0x120e:DUP1 53 | 0x120f:SWAP3 54 | 0x1210:SWAP2 55 | 0x1211:SWAP1 56 | 0x1212:DUP2 57 | 0x1213:DUP2 58 | 0x1214:MSTORE 59 | 0x1215:PUSH1 0x20 60 | 0x1217:ADD 61 | 0x1218:DUP3 62 | 0x1219:DUP1 63 | 0x121a:SLOAD 64 | 0x121b:PUSH1 0x1 65 | 0x121d:DUP2 66 | 0x121e:PUSH1 0x1 67 | 0x1220:AND 68 | 0x1221:ISZERO 69 | 0x1222:PUSH2 0x100 70 | 0x1225:MUL 71 | 0x1226:SUB 72 | 0x1227:AND 73 | 0x1228:PUSH1 0x2 74 | 0x122a:SWAP1 75 | 0x122b:DIV 76 | 0x122c:DUP1 77 | 0x122d:ISZERO 78 | 0x122e:PUSH2 0x1278 79 | 0x1231:JUMPI"] 80 | 4578 -> 4658 81 | 4578 -> 4728 82 | 4658[label="0x1232:DUP1 83 | 0x1233:PUSH1 0x1f 84 | 0x1235:LT 85 | 0x1236:PUSH2 0x124d 86 | 0x1239:JUMPI"] 87 | 4658 -> 4666 88 | 4658 -> 4685 89 | 4666[label="0x123a:PUSH2 0x100 90 | 0x123d:DUP1 91 | 0x123e:DUP4 92 | 0x123f:SLOAD 93 | 0x1240:DIV 94 | 0x1241:MUL 95 | 0x1242:DUP4 96 | 0x1243:MSTORE 97 | 0x1244:SWAP2 98 | 0x1245:PUSH1 0x20 99 | 0x1247:ADD 100 | 0x1248:SWAP2 101 | 0x1249:PUSH2 0x1278 102 | 0x124c:JUMP"] 103 | 4666 -> 4728 104 | 4685[label="0x124d:JUMPDEST 105 | 0x124e:DUP3 106 | 0x124f:ADD 107 | 0x1250:SWAP2 108 | 0x1251:SWAP1 109 | 0x1252:PUSH1 0x0 110 | 0x1254:MSTORE 111 | 0x1255:PUSH1 0x20 112 | 0x1257:PUSH1 0x0 113 | 0x1259:SHA3 114 | 0x125a:SWAP1"] 115 | 4685 -> 4699 116 | 4699[label="0x125b:JUMPDEST 117 | 0x125c:DUP2 118 | 0x125d:SLOAD 119 | 0x125e:DUP2 120 | 0x125f:MSTORE 121 | 0x1260:SWAP1 122 | 0x1261:PUSH1 0x1 123 | 0x1263:ADD 124 | 0x1264:SWAP1 125 | 0x1265:PUSH1 0x20 126 | 0x1267:ADD 127 | 0x1268:DUP1 128 | 0x1269:DUP4 129 | 0x126a:GT 130 | 0x126b:PUSH2 0x125b 131 | 0x126e:JUMPI"] 132 | 4699 -> 4719 133 | 4699 -> 4699 134 | 4719[label="0x126f:DUP3 135 | 0x1270:SWAP1 136 | 0x1271:SUB 137 | 0x1272:PUSH1 0x1f 138 | 0x1274:AND 139 | 0x1275:DUP3 140 | 0x1276:ADD 141 | 0x1277:SWAP2"] 142 | 4719 -> 4728 143 | 4728[label="0x1278:JUMPDEST 144 | 0x1279:POP 145 | 0x127a:POP 146 | 0x127b:POP 147 | 0x127c:POP 148 | 0x127d:POP 149 | 0x127e:DUP2 150 | 0x127f:JUMP"] 151 | 4728 -> 483 152 | 483[label="0x1e3:JUMPDEST 153 | 0x1e4:PUSH1 0x40 154 | 0x1e6:MLOAD 155 | 0x1e7:DUP1 156 | 0x1e8:DUP1 157 | 0x1e9:PUSH1 0x20 158 | 0x1eb:ADD 159 | 0x1ec:DUP3 160 | 0x1ed:DUP2 161 | 0x1ee:SUB 162 | 0x1ef:DUP3 163 | 0x1f0:MSTORE 164 | 0x1f1:DUP4 165 | 0x1f2:DUP2 166 | 0x1f3:DUP2 167 | 0x1f4:MLOAD 168 | 0x1f5:DUP2 169 | 0x1f6:MSTORE 170 | 0x1f7:PUSH1 0x20 171 | 0x1f9:ADD 172 | 0x1fa:SWAP2 173 | 0x1fb:POP 174 | 0x1fc:DUP1 175 | 0x1fd:MLOAD 176 | 0x1fe:SWAP1 177 | 0x1ff:PUSH1 0x20 178 | 0x201:ADD 179 | 0x202:SWAP1 180 | 0x203:DUP1 181 | 0x204:DUP4 182 | 0x205:DUP4 183 | 0x206:PUSH1 0x0"] 184 | 483 -> 520 185 | 520[label="0x208:JUMPDEST 186 | 0x209:DUP4 187 | 0x20a:DUP2 188 | 0x20b:LT 189 | 0x20c:ISZERO 190 | 0x20d:PUSH2 0x223 191 | 0x210:JUMPI"] 192 | 520 -> 529 193 | 520 -> 547 194 | 529[label="0x211:DUP1 195 | 0x212:DUP3 196 | 0x213:ADD 197 | 0x214:MLOAD 198 | 0x215:DUP2 199 | 0x216:DUP5 200 | 0x217:ADD 201 | 0x218:MSTORE 202 | 0x219:PUSH1 0x20 203 | 0x21b:DUP2 204 | 0x21c:ADD 205 | 0x21d:SWAP1 206 | 0x21e:POP 207 | 0x21f:PUSH2 0x208 208 | 0x222:JUMP"] 209 | 529 -> 520 210 | 547[label="0x223:JUMPDEST 211 | 0x224:POP 212 | 0x225:POP 213 | 0x226:POP 214 | 0x227:POP 215 | 0x228:SWAP1 216 | 0x229:POP 217 | 0x22a:SWAP1 218 | 0x22b:DUP2 219 | 0x22c:ADD 220 | 0x22d:SWAP1 221 | 0x22e:PUSH1 0x1f 222 | 0x230:AND 223 | 0x231:DUP1 224 | 0x232:ISZERO 225 | 0x233:PUSH2 0x250 226 | 0x236:JUMPI"] 227 | 547 -> 567 228 | 547 -> 592 229 | 567[label="0x237:DUP1 230 | 0x238:DUP3 231 | 0x239:SUB 232 | 0x23a:DUP1 233 | 0x23b:MLOAD 234 | 0x23c:PUSH1 0x1 235 | 0x23e:DUP4 236 | 0x23f:PUSH1 0x20 237 | 0x241:SUB 238 | 0x242:PUSH2 0x100 239 | 0x245:EXP 240 | 0x246:SUB 241 | 0x247:NOT 242 | 0x248:AND 243 | 0x249:DUP2 244 | 0x24a:MSTORE 245 | 0x24b:PUSH1 0x20 246 | 0x24d:ADD 247 | 0x24e:SWAP2 248 | 0x24f:POP"] 249 | 567 -> 592 250 | 592[label="0x250:JUMPDEST 251 | 0x251:POP 252 | 0x252:SWAP3 253 | 0x253:POP 254 | 0x254:POP 255 | 0x255:POP 256 | 0x256:PUSH1 0x40 257 | 0x258:MLOAD 258 | 0x259:DUP1 259 | 0x25a:SWAP2 260 | 0x25b:SUB 261 | 0x25c:SWAP1 262 | 0x25d:RETURN"] 263 | 264 | } -------------------------------------------------------------------------------- /tests/expected-fomo3d-output/fomo3d.evm_onlyAmbassadors().dot: -------------------------------------------------------------------------------- 1 | digraph{ 2 | 779[label="0x30b:JUMPDEST 3 | 0x30c:CALLVALUE 4 | 0x30d:DUP1 5 | 0x30e:ISZERO 6 | 0x30f:PUSH2 0x317 7 | 0x312:JUMPI"] 8 | 779 -> 787 9 | 779 -> 791 10 | 787[label="0x313:PUSH1 0x0 11 | 0x315:DUP1 12 | 0x316:REVERT"] 13 | 791[label="0x317:JUMPDEST 14 | 0x318:POP 15 | 0x319:PUSH2 0x320 16 | 0x31c:PUSH2 0x130b 17 | 0x31f:JUMP"] 18 | 791 -> 4875 19 | 4875[label="0x130b:JUMPDEST 20 | 0x130c:PUSH1 0xb 21 | 0x130e:PUSH1 0x0 22 | 0x1310:SWAP1 23 | 0x1311:SLOAD 24 | 0x1312:SWAP1 25 | 0x1313:PUSH2 0x100 26 | 0x1316:EXP 27 | 0x1317:SWAP1 28 | 0x1318:DIV 29 | 0x1319:PUSH1 0xff 30 | 0x131b:AND 31 | 0x131c:DUP2 32 | 0x131d:JUMP"] 33 | 4875 -> 800 34 | 800[label="0x320:JUMPDEST 35 | 0x321:PUSH1 0x40 36 | 0x323:MLOAD 37 | 0x324:DUP1 38 | 0x325:DUP3 39 | 0x326:ISZERO 40 | 0x327:ISZERO 41 | 0x328:ISZERO 42 | 0x329:ISZERO 43 | 0x32a:DUP2 44 | 0x32b:MSTORE 45 | 0x32c:PUSH1 0x20 46 | 0x32e:ADD 47 | 0x32f:SWAP2 48 | 0x330:POP 49 | 0x331:POP 50 | 0x332:PUSH1 0x40 51 | 0x334:MLOAD 52 | 0x335:DUP1 53 | 0x336:SWAP2 54 | 0x337:SUB 55 | 0x338:SWAP1 56 | 0x339:RETURN"] 57 | 58 | } -------------------------------------------------------------------------------- /tests/expected-fomo3d-output/fomo3d.evm_sell(uint256).dot: -------------------------------------------------------------------------------- 1 | digraph{ 2 | 1947[label="0x79b:JUMPDEST 3 | 0x79c:CALLVALUE 4 | 0x79d:DUP1 5 | 0x79e:ISZERO 6 | 0x79f:PUSH2 0x7a7 7 | 0x7a2:JUMPI"] 8 | 1947 -> 1955 9 | 1947 -> 1959 10 | 1955[label="0x7a3:PUSH1 0x0 11 | 0x7a5:DUP1 12 | 0x7a6:REVERT"] 13 | 1959[label="0x7a7:JUMPDEST 14 | 0x7a8:POP 15 | 0x7a9:PUSH2 0x7c6 16 | 0x7ac:PUSH1 0x4 17 | 0x7ae:DUP1 18 | 0x7af:CALLDATASIZE 19 | 0x7b0:SUB 20 | 0x7b1:DUP2 21 | 0x7b2:ADD 22 | 0x7b3:SWAP1 23 | 0x7b4:DUP1 24 | 0x7b5:DUP1 25 | 0x7b6:CALLDATALOAD 26 | 0x7b7:SWAP1 27 | 0x7b8:PUSH1 0x20 28 | 0x7ba:ADD 29 | 0x7bb:SWAP1 30 | 0x7bc:SWAP3 31 | 0x7bd:SWAP2 32 | 0x7be:SWAP1 33 | 0x7bf:POP 34 | 0x7c0:POP 35 | 0x7c1:POP 36 | 0x7c2:PUSH2 0x1da8 37 | 0x7c5:JUMP"] 38 | 1959 -> 7592 39 | 7592[label="0x1da8:JUMPDEST 40 | 0x1da9:PUSH1 0x0 41 | 0x1dab:DUP1 42 | 0x1dac:PUSH1 0x0 43 | 0x1dae:DUP1 44 | 0x1daf:PUSH1 0x0 45 | 0x1db1:DUP1 46 | 0x1db2:PUSH1 0x0 47 | 0x1db4:PUSH2 0x1dbb 48 | 0x1db7:PUSH2 0x17d4 49 | 0x1dba:JUMP"] 50 | 7592 -> 6100 51 | 6100[label="0x17d4:JUMPDEST 52 | 0x17d5:PUSH1 0x0 53 | 0x17d7:DUP1 54 | 0x17d8:CALLER 55 | 0x17d9:SWAP1 56 | 0x17da:POP 57 | 0x17db:PUSH2 0x17e3 58 | 0x17de:DUP2 59 | 0x17df:PUSH2 0x15d6 60 | 0x17e2:JUMP"] 61 | 6100 -> 5590 62 | 5590[label="0x15d6:JUMPDEST 63 | 0x15d7:PUSH1 0x0 64 | 0x15d9:PUSH1 0x4 65 | 0x15db:PUSH1 0x0 66 | 0x15dd:DUP4 67 | 0x15de:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 68 | 0x15f3:AND 69 | 0x15f4:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 70 | 0x1609:AND 71 | 0x160a:DUP2 72 | 0x160b:MSTORE 73 | 0x160c:PUSH1 0x20 74 | 0x160e:ADD 75 | 0x160f:SWAP1 76 | 0x1610:DUP2 77 | 0x1611:MSTORE 78 | 0x1612:PUSH1 0x20 79 | 0x1614:ADD 80 | 0x1615:PUSH1 0x0 81 | 0x1617:SHA3 82 | 0x1618:SLOAD 83 | 0x1619:SWAP1 84 | 0x161a:POP 85 | 0x161b:SWAP2 86 | 0x161c:SWAP1 87 | 0x161d:POP 88 | 0x161e:JUMP"] 89 | 5590 -> 6115 90 | 6115[label="0x17e3:JUMPDEST 91 | 0x17e4:SWAP2 92 | 0x17e5:POP 93 | 0x17e6:POP 94 | 0x17e7:SWAP1 95 | 0x17e8:JUMP"] 96 | 6115 -> 7611 97 | 7611[label="0x1dbb:JUMPDEST 98 | 0x1dbc:GT 99 | 0x1dbd:ISZERO 100 | 0x1dbe:ISZERO 101 | 0x1dbf:PUSH2 0x1dc7 102 | 0x1dc2:JUMPI"] 103 | 7611 -> 7619 104 | 7611 -> 7623 105 | 7619[label="0x1dc3:PUSH1 0x0 106 | 0x1dc5:DUP1 107 | 0x1dc6:REVERT"] 108 | 7623[label="0x1dc7:JUMPDEST 109 | 0x1dc8:CALLER 110 | 0x1dc9:SWAP6 111 | 0x1dca:POP 112 | 0x1dcb:PUSH1 0x4 113 | 0x1dcd:PUSH1 0x0 114 | 0x1dcf:DUP8 115 | 0x1dd0:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 116 | 0x1de5:AND 117 | 0x1de6:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 118 | 0x1dfb:AND 119 | 0x1dfc:DUP2 120 | 0x1dfd:MSTORE 121 | 0x1dfe:PUSH1 0x20 122 | 0x1e00:ADD 123 | 0x1e01:SWAP1 124 | 0x1e02:DUP2 125 | 0x1e03:MSTORE 126 | 0x1e04:PUSH1 0x20 127 | 0x1e06:ADD 128 | 0x1e07:PUSH1 0x0 129 | 0x1e09:SHA3 130 | 0x1e0a:SLOAD 131 | 0x1e0b:DUP8 132 | 0x1e0c:GT 133 | 0x1e0d:ISZERO 134 | 0x1e0e:ISZERO 135 | 0x1e0f:ISZERO 136 | 0x1e10:PUSH2 0x1e18 137 | 0x1e13:JUMPI"] 138 | 7623 -> 7700 139 | 7623 -> 7704 140 | 7700[label="0x1e14:PUSH1 0x0 141 | 0x1e16:DUP1 142 | 0x1e17:REVERT"] 143 | 7704[label="0x1e18:JUMPDEST 144 | 0x1e19:DUP7 145 | 0x1e1a:SWAP5 146 | 0x1e1b:POP 147 | 0x1e1c:PUSH2 0x1e24 148 | 0x1e1f:DUP6 149 | 0x1e20:PUSH2 0x22a2 150 | 0x1e23:JUMP"] 151 | 7704 -> 8866 152 | 8866[label="0x22a2:JUMPDEST 153 | 0x22a3:PUSH1 0x0 154 | 0x22a5:DUP1 155 | 0x22a6:PUSH1 0x0 156 | 0x22a8:DUP1 157 | 0x22a9:PUSH8 0xde0b6b3a7640000 158 | 0x22b2:DUP6 159 | 0x22b3:ADD 160 | 0x22b4:SWAP3 161 | 0x22b5:POP 162 | 0x22b6:PUSH8 0xde0b6b3a7640000 163 | 0x22bf:PUSH1 0x8 164 | 0x22c1:SLOAD 165 | 0x22c2:ADD 166 | 0x22c3:SWAP2 167 | 0x22c4:POP 168 | 0x22c5:PUSH8 0xde0b6b3a7640000 169 | 0x22ce:PUSH2 0x2336 170 | 0x22d1:PUSH8 0xde0b6b3a7640000 171 | 0x22da:DUP6 172 | 0x22db:SUB 173 | 0x22dc:PUSH5 0x2540be400 174 | 0x22e2:PUSH8 0xde0b6b3a7640000 175 | 0x22eb:DUP7 176 | 0x22ec:DUP2 177 | 0x22ed:ISZERO 178 | 0x22ee:ISZERO 179 | 0x22ef:PUSH2 0x22f4 180 | 0x22f2:JUMPI"] 181 | 8866 -> 8947 182 | 8866 -> 8948 183 | 8947[label="0x22f3:INVALID"] 184 | 8948[label="0x22f4:JUMPDEST 185 | 0x22f5:DIV 186 | 0x22f6:PUSH5 0x2540be400 187 | 0x22fc:MUL 188 | 0x22fd:PUSH5 0x174876e800 189 | 0x2303:ADD 190 | 0x2304:SUB 191 | 0x2305:MUL 192 | 0x2306:PUSH1 0x2 193 | 0x2308:PUSH8 0xde0b6b3a7640000 194 | 0x2311:DUP8 195 | 0x2312:PUSH1 0x2 196 | 0x2314:DUP10 197 | 0x2315:EXP 198 | 0x2316:SUB 199 | 0x2317:DUP2 200 | 0x2318:ISZERO 201 | 0x2319:ISZERO 202 | 0x231a:PUSH2 0x231f 203 | 0x231d:JUMPI"] 204 | 8948 -> 8990 205 | 8948 -> 8991 206 | 8990[label="0x231e:INVALID"] 207 | 8991[label="0x231f:JUMPDEST 208 | 0x2320:DIV 209 | 0x2321:PUSH5 0x2540be400 210 | 0x2327:MUL 211 | 0x2328:DUP2 212 | 0x2329:ISZERO 213 | 0x232a:ISZERO 214 | 0x232b:PUSH2 0x2330 215 | 0x232e:JUMPI"] 216 | 8991 -> 9007 217 | 8991 -> 9008 218 | 9007[label="0x232f:INVALID"] 219 | 9008[label="0x2330:JUMPDEST 220 | 0x2331:DIV 221 | 0x2332:PUSH2 0x21fc 222 | 0x2335:JUMP"] 223 | 9008 -> 8700 224 | 8700[label="0x21fc:JUMPDEST 225 | 0x21fd:PUSH1 0x0 226 | 0x21ff:DUP3 227 | 0x2200:DUP3 228 | 0x2201:GT 229 | 0x2202:ISZERO 230 | 0x2203:ISZERO 231 | 0x2204:ISZERO 232 | 0x2205:PUSH2 0x220a 233 | 0x2208:JUMPI"] 234 | 8700 -> 8713 235 | 8700 -> 8714 236 | 8713[label="0x2209:INVALID"] 237 | 8714[label="0x220a:JUMPDEST 238 | 0x220b:DUP2 239 | 0x220c:DUP4 240 | 0x220d:SUB 241 | 0x220e:SWAP1 242 | 0x220f:POP 243 | 0x2210:SWAP3 244 | 0x2211:SWAP2 245 | 0x2212:POP 246 | 0x2213:POP 247 | 0x2214:JUMP"] 248 | 8714 -> 9014 249 | 8714 -> 7744 250 | 8714 -> 7758 251 | 8714 -> 7837 252 | 9014[label="0x2336:JUMPDEST 253 | 0x2337:DUP2 254 | 0x2338:ISZERO 255 | 0x2339:ISZERO 256 | 0x233a:PUSH2 0x233f 257 | 0x233d:JUMPI"] 258 | 9014 -> 9022 259 | 9014 -> 9023 260 | 9022[label="0x233e:INVALID"] 261 | 9023[label="0x233f:JUMPDEST 262 | 0x2340:DIV 263 | 0x2341:SWAP1 264 | 0x2342:POP 265 | 0x2343:DUP1 266 | 0x2344:SWAP4 267 | 0x2345:POP 268 | 0x2346:POP 269 | 0x2347:POP 270 | 0x2348:POP 271 | 0x2349:SWAP2 272 | 0x234a:SWAP1 273 | 0x234b:POP 274 | 0x234c:JUMP"] 275 | 9023 -> 7716 276 | 7716[label="0x1e24:JUMPDEST 277 | 0x1e25:SWAP4 278 | 0x1e26:POP 279 | 0x1e27:PUSH2 0x1e34 280 | 0x1e2a:DUP5 281 | 0x1e2b:PUSH1 0x5 282 | 0x1e2d:PUSH1 0xff 283 | 0x1e2f:AND 284 | 0x1e30:PUSH2 0x21e1 285 | 0x1e33:JUMP"] 286 | 7716 -> 8673 287 | 8673[label="0x21e1:JUMPDEST 288 | 0x21e2:PUSH1 0x0 289 | 0x21e4:DUP1 290 | 0x21e5:DUP3 291 | 0x21e6:DUP5 292 | 0x21e7:DUP2 293 | 0x21e8:ISZERO 294 | 0x21e9:ISZERO 295 | 0x21ea:PUSH2 0x21ef 296 | 0x21ed:JUMPI"] 297 | 8673 -> 8686 298 | 8673 -> 8687 299 | 8686[label="0x21ee:INVALID"] 300 | 8687[label="0x21ef:JUMPDEST 301 | 0x21f0:DIV 302 | 0x21f1:SWAP1 303 | 0x21f2:POP 304 | 0x21f3:DUP1 305 | 0x21f4:SWAP2 306 | 0x21f5:POP 307 | 0x21f6:POP 308 | 0x21f7:SWAP3 309 | 0x21f8:SWAP2 310 | 0x21f9:POP 311 | 0x21fa:POP 312 | 0x21fb:JUMP"] 313 | 8687 -> 7732 314 | 7732[label="0x1e34:JUMPDEST 315 | 0x1e35:SWAP3 316 | 0x1e36:POP 317 | 0x1e37:PUSH2 0x1e40 318 | 0x1e3a:DUP5 319 | 0x1e3b:DUP5 320 | 0x1e3c:PUSH2 0x21fc 321 | 0x1e3f:JUMP"] 322 | 7732 -> 8700 323 | 7744[label="0x1e40:JUMPDEST 324 | 0x1e41:SWAP2 325 | 0x1e42:POP 326 | 0x1e43:PUSH2 0x1e4e 327 | 0x1e46:PUSH1 0x8 328 | 0x1e48:SLOAD 329 | 0x1e49:DUP7 330 | 0x1e4a:PUSH2 0x21fc 331 | 0x1e4d:JUMP"] 332 | 7744 -> 8700 333 | 7758[label="0x1e4e:JUMPDEST 334 | 0x1e4f:PUSH1 0x8 335 | 0x1e51:DUP2 336 | 0x1e52:SWAP1 337 | 0x1e53:SSTORE 338 | 0x1e54:POP 339 | 0x1e55:PUSH2 0x1e9d 340 | 0x1e58:PUSH1 0x4 341 | 0x1e5a:PUSH1 0x0 342 | 0x1e5c:DUP9 343 | 0x1e5d:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 344 | 0x1e72:AND 345 | 0x1e73:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 346 | 0x1e88:AND 347 | 0x1e89:DUP2 348 | 0x1e8a:MSTORE 349 | 0x1e8b:PUSH1 0x20 350 | 0x1e8d:ADD 351 | 0x1e8e:SWAP1 352 | 0x1e8f:DUP2 353 | 0x1e90:MSTORE 354 | 0x1e91:PUSH1 0x20 355 | 0x1e93:ADD 356 | 0x1e94:PUSH1 0x0 357 | 0x1e96:SHA3 358 | 0x1e97:SLOAD 359 | 0x1e98:DUP7 360 | 0x1e99:PUSH2 0x21fc 361 | 0x1e9c:JUMP"] 362 | 7758 -> 8700 363 | 7837[label="0x1e9d:JUMPDEST 364 | 0x1e9e:PUSH1 0x4 365 | 0x1ea0:PUSH1 0x0 366 | 0x1ea2:DUP9 367 | 0x1ea3:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 368 | 0x1eb8:AND 369 | 0x1eb9:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 370 | 0x1ece:AND 371 | 0x1ecf:DUP2 372 | 0x1ed0:MSTORE 373 | 0x1ed1:PUSH1 0x20 374 | 0x1ed3:ADD 375 | 0x1ed4:SWAP1 376 | 0x1ed5:DUP2 377 | 0x1ed6:MSTORE 378 | 0x1ed7:PUSH1 0x20 379 | 0x1ed9:ADD 380 | 0x1eda:PUSH1 0x0 381 | 0x1edc:SHA3 382 | 0x1edd:DUP2 383 | 0x1ede:SWAP1 384 | 0x1edf:SSTORE 385 | 0x1ee0:POP 386 | 0x1ee1:PUSH9 0x10000000000000000 387 | 0x1eeb:DUP3 388 | 0x1eec:MUL 389 | 0x1eed:DUP6 390 | 0x1eee:PUSH1 0x9 391 | 0x1ef0:SLOAD 392 | 0x1ef1:MUL 393 | 0x1ef2:ADD 394 | 0x1ef3:SWAP1 395 | 0x1ef4:POP 396 | 0x1ef5:DUP1 397 | 0x1ef6:PUSH1 0x6 398 | 0x1ef8:PUSH1 0x0 399 | 0x1efa:DUP9 400 | 0x1efb:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 401 | 0x1f10:AND 402 | 0x1f11:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 403 | 0x1f26:AND 404 | 0x1f27:DUP2 405 | 0x1f28:MSTORE 406 | 0x1f29:PUSH1 0x20 407 | 0x1f2b:ADD 408 | 0x1f2c:SWAP1 409 | 0x1f2d:DUP2 410 | 0x1f2e:MSTORE 411 | 0x1f2f:PUSH1 0x20 412 | 0x1f31:ADD 413 | 0x1f32:PUSH1 0x0 414 | 0x1f34:SHA3 415 | 0x1f35:PUSH1 0x0 416 | 0x1f37:DUP3 417 | 0x1f38:DUP3 418 | 0x1f39:SLOAD 419 | 0x1f3a:SUB 420 | 0x1f3b:SWAP3 421 | 0x1f3c:POP 422 | 0x1f3d:POP 423 | 0x1f3e:DUP2 424 | 0x1f3f:SWAP1 425 | 0x1f40:SSTORE 426 | 0x1f41:POP 427 | 0x1f42:PUSH1 0x0 428 | 0x1f44:PUSH1 0x8 429 | 0x1f46:SLOAD 430 | 0x1f47:GT 431 | 0x1f48:ISZERO 432 | 0x1f49:PUSH2 0x1f77 433 | 0x1f4c:JUMPI"] 434 | 7837 -> 8013 435 | 7837 -> 8055 436 | 8013[label="0x1f4d:PUSH2 0x1f70 437 | 0x1f50:PUSH1 0x9 438 | 0x1f52:SLOAD 439 | 0x1f53:PUSH1 0x8 440 | 0x1f55:SLOAD 441 | 0x1f56:PUSH9 0x10000000000000000 442 | 0x1f60:DUP7 443 | 0x1f61:MUL 444 | 0x1f62:DUP2 445 | 0x1f63:ISZERO 446 | 0x1f64:ISZERO 447 | 0x1f65:PUSH2 0x1f6a 448 | 0x1f68:JUMPI"] 449 | 8013 -> 8041 450 | 8013 -> 8042 451 | 8041[label="0x1f69:INVALID"] 452 | 8055[label="0x1f77:JUMPDEST 453 | 0x1f78:DUP6 454 | 0x1f79:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 455 | 0x1f8e:AND 456 | 0x1f8f:PUSH32 0xc4823739c5787d2ca17e404aa47d5569ae71dfb49cbf21b3f6152ed238a31139 457 | 0x1fb0:DUP7 458 | 0x1fb1:DUP5 459 | 0x1fb2:PUSH1 0x40 460 | 0x1fb4:MLOAD 461 | 0x1fb5:DUP1 462 | 0x1fb6:DUP4 463 | 0x1fb7:DUP2 464 | 0x1fb8:MSTORE 465 | 0x1fb9:PUSH1 0x20 466 | 0x1fbb:ADD 467 | 0x1fbc:DUP3 468 | 0x1fbd:DUP2 469 | 0x1fbe:MSTORE 470 | 0x1fbf:PUSH1 0x20 471 | 0x1fc1:ADD 472 | 0x1fc2:SWAP3 473 | 0x1fc3:POP 474 | 0x1fc4:POP 475 | 0x1fc5:POP 476 | 0x1fc6:PUSH1 0x40 477 | 0x1fc8:MLOAD 478 | 0x1fc9:DUP1 479 | 0x1fca:SWAP2 480 | 0x1fcb:SUB 481 | 0x1fcc:SWAP1 482 | 0x1fcd:LOG2 483 | 0x1fce:POP 484 | 0x1fcf:POP 485 | 0x1fd0:POP 486 | 0x1fd1:POP 487 | 0x1fd2:POP 488 | 0x1fd3:POP 489 | 0x1fd4:POP 490 | 0x1fd5:JUMP"] 491 | 8055 -> 1990 492 | 1990[label="0x7c6:JUMPDEST 493 | 0x7c7:STOP"] 494 | 8042[label="0x1f6a:JUMPDEST 495 | 0x1f6b:DIV 496 | 0x1f6c:PUSH2 0x21c3 497 | 0x1f6f:JUMP"] 498 | 8042 -> 8643 499 | 8643[label="0x21c3:JUMPDEST 500 | 0x21c4:PUSH1 0x0 501 | 0x21c6:DUP1 502 | 0x21c7:DUP3 503 | 0x21c8:DUP5 504 | 0x21c9:ADD 505 | 0x21ca:SWAP1 506 | 0x21cb:POP 507 | 0x21cc:DUP4 508 | 0x21cd:DUP2 509 | 0x21ce:LT 510 | 0x21cf:ISZERO 511 | 0x21d0:ISZERO 512 | 0x21d1:ISZERO 513 | 0x21d2:PUSH2 0x21d7 514 | 0x21d5:JUMPI"] 515 | 8643 -> 8662 516 | 8643 -> 8663 517 | 8662[label="0x21d6:INVALID"] 518 | 8663[label="0x21d7:JUMPDEST 519 | 0x21d8:DUP1 520 | 0x21d9:SWAP2 521 | 0x21da:POP 522 | 0x21db:POP 523 | 0x21dc:SWAP3 524 | 0x21dd:SWAP2 525 | 0x21de:POP 526 | 0x21df:POP 527 | 0x21e0:JUMP"] 528 | 8663 -> 8048 529 | 8048[label="0x1f70:JUMPDEST 530 | 0x1f71:PUSH1 0x9 531 | 0x1f73:DUP2 532 | 0x1f74:SWAP1 533 | 0x1f75:SSTORE 534 | 0x1f76:POP"] 535 | 8048 -> 8055 536 | 537 | } -------------------------------------------------------------------------------- /tests/expected-fomo3d-output/fomo3d.evm_sellPrice().dot: -------------------------------------------------------------------------------- 1 | digraph{ 2 | 971[label="0x3cb:JUMPDEST 3 | 0x3cc:CALLVALUE 4 | 0x3cd:DUP1 5 | 0x3ce:ISZERO 6 | 0x3cf:PUSH2 0x3d7 7 | 0x3d2:JUMPI"] 8 | 971 -> 979 9 | 971 -> 983 10 | 979[label="0x3d3:PUSH1 0x0 11 | 0x3d5:DUP1 12 | 0x3d6:REVERT"] 13 | 983[label="0x3d7:JUMPDEST 14 | 0x3d8:POP 15 | 0x3d9:PUSH2 0x3e0 16 | 0x3dc:PUSH2 0x14e7 17 | 0x3df:JUMP"] 18 | 983 -> 5351 19 | 5351[label="0x14e7:JUMPDEST 20 | 0x14e8:PUSH1 0x0 21 | 0x14ea:DUP1 22 | 0x14eb:PUSH1 0x0 23 | 0x14ed:DUP1 24 | 0x14ee:PUSH1 0x0 25 | 0x14f0:PUSH1 0x8 26 | 0x14f2:SLOAD 27 | 0x14f3:EQ 28 | 0x14f4:ISZERO 29 | 0x14f5:PUSH2 0x150c 30 | 0x14f8:JUMPI"] 31 | 5351 -> 5369 32 | 5351 -> 5388 33 | 5369[label="0x14f9:PUSH5 0x2540be400 34 | 0x14ff:PUSH5 0x174876e800 35 | 0x1505:SUB 36 | 0x1506:SWAP4 37 | 0x1507:POP 38 | 0x1508:PUSH2 0x153f 39 | 0x150b:JUMP"] 40 | 5369 -> 5439 41 | 5439[label="0x153f:JUMPDEST 42 | 0x1540:POP 43 | 0x1541:POP 44 | 0x1542:POP 45 | 0x1543:SWAP1 46 | 0x1544:JUMP"] 47 | 5439 -> 992 48 | 992[label="0x3e0:JUMPDEST 49 | 0x3e1:PUSH1 0x40 50 | 0x3e3:MLOAD 51 | 0x3e4:DUP1 52 | 0x3e5:DUP3 53 | 0x3e6:DUP2 54 | 0x3e7:MSTORE 55 | 0x3e8:PUSH1 0x20 56 | 0x3ea:ADD 57 | 0x3eb:SWAP2 58 | 0x3ec:POP 59 | 0x3ed:POP 60 | 0x3ee:PUSH1 0x40 61 | 0x3f0:MLOAD 62 | 0x3f1:DUP1 63 | 0x3f2:SWAP2 64 | 0x3f3:SUB 65 | 0x3f4:SWAP1 66 | 0x3f5:RETURN"] 67 | 5388[label="0x150c:JUMPDEST 68 | 0x150d:PUSH2 0x151d 69 | 0x1510:PUSH8 0xde0b6b3a7640000 70 | 0x1519:PUSH2 0x22a2 71 | 0x151c:JUMP"] 72 | 5388 -> 8866 73 | 8866[label="0x22a2:JUMPDEST 74 | 0x22a3:PUSH1 0x0 75 | 0x22a5:DUP1 76 | 0x22a6:PUSH1 0x0 77 | 0x22a8:DUP1 78 | 0x22a9:PUSH8 0xde0b6b3a7640000 79 | 0x22b2:DUP6 80 | 0x22b3:ADD 81 | 0x22b4:SWAP3 82 | 0x22b5:POP 83 | 0x22b6:PUSH8 0xde0b6b3a7640000 84 | 0x22bf:PUSH1 0x8 85 | 0x22c1:SLOAD 86 | 0x22c2:ADD 87 | 0x22c3:SWAP2 88 | 0x22c4:POP 89 | 0x22c5:PUSH8 0xde0b6b3a7640000 90 | 0x22ce:PUSH2 0x2336 91 | 0x22d1:PUSH8 0xde0b6b3a7640000 92 | 0x22da:DUP6 93 | 0x22db:SUB 94 | 0x22dc:PUSH5 0x2540be400 95 | 0x22e2:PUSH8 0xde0b6b3a7640000 96 | 0x22eb:DUP7 97 | 0x22ec:DUP2 98 | 0x22ed:ISZERO 99 | 0x22ee:ISZERO 100 | 0x22ef:PUSH2 0x22f4 101 | 0x22f2:JUMPI"] 102 | 8866 -> 8947 103 | 8866 -> 8948 104 | 8947[label="0x22f3:INVALID"] 105 | 8948[label="0x22f4:JUMPDEST 106 | 0x22f5:DIV 107 | 0x22f6:PUSH5 0x2540be400 108 | 0x22fc:MUL 109 | 0x22fd:PUSH5 0x174876e800 110 | 0x2303:ADD 111 | 0x2304:SUB 112 | 0x2305:MUL 113 | 0x2306:PUSH1 0x2 114 | 0x2308:PUSH8 0xde0b6b3a7640000 115 | 0x2311:DUP8 116 | 0x2312:PUSH1 0x2 117 | 0x2314:DUP10 118 | 0x2315:EXP 119 | 0x2316:SUB 120 | 0x2317:DUP2 121 | 0x2318:ISZERO 122 | 0x2319:ISZERO 123 | 0x231a:PUSH2 0x231f 124 | 0x231d:JUMPI"] 125 | 8948 -> 8990 126 | 8948 -> 8991 127 | 8990[label="0x231e:INVALID"] 128 | 8991[label="0x231f:JUMPDEST 129 | 0x2320:DIV 130 | 0x2321:PUSH5 0x2540be400 131 | 0x2327:MUL 132 | 0x2328:DUP2 133 | 0x2329:ISZERO 134 | 0x232a:ISZERO 135 | 0x232b:PUSH2 0x2330 136 | 0x232e:JUMPI"] 137 | 8991 -> 9007 138 | 8991 -> 9008 139 | 9007[label="0x232f:INVALID"] 140 | 9008[label="0x2330:JUMPDEST 141 | 0x2331:DIV 142 | 0x2332:PUSH2 0x21fc 143 | 0x2335:JUMP"] 144 | 9008 -> 8700 145 | 8700[label="0x21fc:JUMPDEST 146 | 0x21fd:PUSH1 0x0 147 | 0x21ff:DUP3 148 | 0x2200:DUP3 149 | 0x2201:GT 150 | 0x2202:ISZERO 151 | 0x2203:ISZERO 152 | 0x2204:ISZERO 153 | 0x2205:PUSH2 0x220a 154 | 0x2208:JUMPI"] 155 | 8700 -> 8713 156 | 8700 -> 8714 157 | 8713[label="0x2209:INVALID"] 158 | 8714[label="0x220a:JUMPDEST 159 | 0x220b:DUP2 160 | 0x220c:DUP4 161 | 0x220d:SUB 162 | 0x220e:SWAP1 163 | 0x220f:POP 164 | 0x2210:SWAP3 165 | 0x2211:SWAP2 166 | 0x2212:POP 167 | 0x2213:POP 168 | 0x2214:JUMP"] 169 | 8714 -> 9014 170 | 8714 -> 5433 171 | 9014[label="0x2336:JUMPDEST 172 | 0x2337:DUP2 173 | 0x2338:ISZERO 174 | 0x2339:ISZERO 175 | 0x233a:PUSH2 0x233f 176 | 0x233d:JUMPI"] 177 | 9014 -> 9022 178 | 9014 -> 9023 179 | 9022[label="0x233e:INVALID"] 180 | 9023[label="0x233f:JUMPDEST 181 | 0x2340:DIV 182 | 0x2341:SWAP1 183 | 0x2342:POP 184 | 0x2343:DUP1 185 | 0x2344:SWAP4 186 | 0x2345:POP 187 | 0x2346:POP 188 | 0x2347:POP 189 | 0x2348:POP 190 | 0x2349:SWAP2 191 | 0x234a:SWAP1 192 | 0x234b:POP 193 | 0x234c:JUMP"] 194 | 9023 -> 5405 195 | 5405[label="0x151d:JUMPDEST 196 | 0x151e:SWAP3 197 | 0x151f:POP 198 | 0x1520:PUSH2 0x152d 199 | 0x1523:DUP4 200 | 0x1524:PUSH1 0x5 201 | 0x1526:PUSH1 0xff 202 | 0x1528:AND 203 | 0x1529:PUSH2 0x21e1 204 | 0x152c:JUMP"] 205 | 5405 -> 8673 206 | 8673[label="0x21e1:JUMPDEST 207 | 0x21e2:PUSH1 0x0 208 | 0x21e4:DUP1 209 | 0x21e5:DUP3 210 | 0x21e6:DUP5 211 | 0x21e7:DUP2 212 | 0x21e8:ISZERO 213 | 0x21e9:ISZERO 214 | 0x21ea:PUSH2 0x21ef 215 | 0x21ed:JUMPI"] 216 | 8673 -> 8686 217 | 8673 -> 8687 218 | 8686[label="0x21ee:INVALID"] 219 | 8687[label="0x21ef:JUMPDEST 220 | 0x21f0:DIV 221 | 0x21f1:SWAP1 222 | 0x21f2:POP 223 | 0x21f3:DUP1 224 | 0x21f4:SWAP2 225 | 0x21f5:POP 226 | 0x21f6:POP 227 | 0x21f7:SWAP3 228 | 0x21f8:SWAP2 229 | 0x21f9:POP 230 | 0x21fa:POP 231 | 0x21fb:JUMP"] 232 | 8687 -> 5421 233 | 5421[label="0x152d:JUMPDEST 234 | 0x152e:SWAP2 235 | 0x152f:POP 236 | 0x1530:PUSH2 0x1539 237 | 0x1533:DUP4 238 | 0x1534:DUP4 239 | 0x1535:PUSH2 0x21fc 240 | 0x1538:JUMP"] 241 | 5421 -> 8700 242 | 5433[label="0x1539:JUMPDEST 243 | 0x153a:SWAP1 244 | 0x153b:POP 245 | 0x153c:DUP1 246 | 0x153d:SWAP4 247 | 0x153e:POP"] 248 | 5433 -> 5439 249 | 250 | } -------------------------------------------------------------------------------- /tests/expected-fomo3d-output/fomo3d.evm_setAdministrator(bytes32,bool).dot: -------------------------------------------------------------------------------- 1 | digraph{ 2 | 1342[label="0x53e:JUMPDEST 3 | 0x53f:CALLVALUE 4 | 0x540:DUP1 5 | 0x541:ISZERO 6 | 0x542:PUSH2 0x54a 7 | 0x545:JUMPI"] 8 | 1342 -> 1350 9 | 1342 -> 1354 10 | 1350[label="0x546:PUSH1 0x0 11 | 0x548:DUP1 12 | 0x549:REVERT"] 13 | 1354[label="0x54a:JUMPDEST 14 | 0x54b:POP 15 | 0x54c:PUSH2 0x579 16 | 0x54f:PUSH1 0x4 17 | 0x551:DUP1 18 | 0x552:CALLDATASIZE 19 | 0x553:SUB 20 | 0x554:DUP2 21 | 0x555:ADD 22 | 0x556:SWAP1 23 | 0x557:DUP1 24 | 0x558:DUP1 25 | 0x559:CALLDATALOAD 26 | 0x55a:PUSH1 0x0 27 | 0x55c:NOT 28 | 0x55d:AND 29 | 0x55e:SWAP1 30 | 0x55f:PUSH1 0x20 31 | 0x561:ADD 32 | 0x562:SWAP1 33 | 0x563:SWAP3 34 | 0x564:SWAP2 35 | 0x565:SWAP1 36 | 0x566:DUP1 37 | 0x567:CALLDATALOAD 38 | 0x568:ISZERO 39 | 0x569:ISZERO 40 | 0x56a:SWAP1 41 | 0x56b:PUSH1 0x20 42 | 0x56d:ADD 43 | 0x56e:SWAP1 44 | 0x56f:SWAP3 45 | 0x570:SWAP2 46 | 0x571:SWAP1 47 | 0x572:POP 48 | 0x573:POP 49 | 0x574:POP 50 | 0x575:PUSH2 0x1711 51 | 0x578:JUMP"] 52 | 1354 -> 5905 53 | 5905[label="0x1711:JUMPDEST 54 | 0x1712:PUSH1 0x0 55 | 0x1714:CALLER 56 | 0x1715:SWAP1 57 | 0x1716:POP 58 | 0x1717:PUSH1 0xa 59 | 0x1719:PUSH1 0x0 60 | 0x171b:DUP3 61 | 0x171c:PUSH1 0x40 62 | 0x171e:MLOAD 63 | 0x171f:DUP1 64 | 0x1720:DUP3 65 | 0x1721:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 66 | 0x1736:AND 67 | 0x1737:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 68 | 0x174c:AND 69 | 0x174d:PUSH13 0x1000000000000000000000000 70 | 0x175b:MUL 71 | 0x175c:DUP2 72 | 0x175d:MSTORE 73 | 0x175e:PUSH1 0x14 74 | 0x1760:ADD 75 | 0x1761:SWAP2 76 | 0x1762:POP 77 | 0x1763:POP 78 | 0x1764:PUSH1 0x40 79 | 0x1766:MLOAD 80 | 0x1767:DUP1 81 | 0x1768:SWAP2 82 | 0x1769:SUB 83 | 0x176a:SWAP1 84 | 0x176b:SHA3 85 | 0x176c:PUSH1 0x0 86 | 0x176e:NOT 87 | 0x176f:AND 88 | 0x1770:PUSH1 0x0 89 | 0x1772:NOT 90 | 0x1773:AND 91 | 0x1774:DUP2 92 | 0x1775:MSTORE 93 | 0x1776:PUSH1 0x20 94 | 0x1778:ADD 95 | 0x1779:SWAP1 96 | 0x177a:DUP2 97 | 0x177b:MSTORE 98 | 0x177c:PUSH1 0x20 99 | 0x177e:ADD 100 | 0x177f:PUSH1 0x0 101 | 0x1781:SHA3 102 | 0x1782:PUSH1 0x0 103 | 0x1784:SWAP1 104 | 0x1785:SLOAD 105 | 0x1786:SWAP1 106 | 0x1787:PUSH2 0x100 107 | 0x178a:EXP 108 | 0x178b:SWAP1 109 | 0x178c:DIV 110 | 0x178d:PUSH1 0xff 111 | 0x178f:AND 112 | 0x1790:ISZERO 113 | 0x1791:ISZERO 114 | 0x1792:PUSH2 0x179a 115 | 0x1795:JUMPI"] 116 | 5905 -> 6038 117 | 5905 -> 6042 118 | 6038[label="0x1796:PUSH1 0x0 119 | 0x1798:DUP1 120 | 0x1799:REVERT"] 121 | 6042[label="0x179a:JUMPDEST 122 | 0x179b:DUP2 123 | 0x179c:PUSH1 0xa 124 | 0x179e:PUSH1 0x0 125 | 0x17a0:DUP6 126 | 0x17a1:PUSH1 0x0 127 | 0x17a3:NOT 128 | 0x17a4:AND 129 | 0x17a5:PUSH1 0x0 130 | 0x17a7:NOT 131 | 0x17a8:AND 132 | 0x17a9:DUP2 133 | 0x17aa:MSTORE 134 | 0x17ab:PUSH1 0x20 135 | 0x17ad:ADD 136 | 0x17ae:SWAP1 137 | 0x17af:DUP2 138 | 0x17b0:MSTORE 139 | 0x17b1:PUSH1 0x20 140 | 0x17b3:ADD 141 | 0x17b4:PUSH1 0x0 142 | 0x17b6:SHA3 143 | 0x17b7:PUSH1 0x0 144 | 0x17b9:PUSH2 0x100 145 | 0x17bc:EXP 146 | 0x17bd:DUP2 147 | 0x17be:SLOAD 148 | 0x17bf:DUP2 149 | 0x17c0:PUSH1 0xff 150 | 0x17c2:MUL 151 | 0x17c3:NOT 152 | 0x17c4:AND 153 | 0x17c5:SWAP1 154 | 0x17c6:DUP4 155 | 0x17c7:ISZERO 156 | 0x17c8:ISZERO 157 | 0x17c9:MUL 158 | 0x17ca:OR 159 | 0x17cb:SWAP1 160 | 0x17cc:SSTORE 161 | 0x17cd:POP 162 | 0x17ce:POP 163 | 0x17cf:POP 164 | 0x17d0:POP 165 | 0x17d1:JUMP"] 166 | 6042 -> 1401 167 | 1401[label="0x579:JUMPDEST 168 | 0x57a:STOP"] 169 | 170 | } -------------------------------------------------------------------------------- /tests/expected-fomo3d-output/fomo3d.evm_setName(string).dot: -------------------------------------------------------------------------------- 1 | digraph{ 2 | 1842[label="0x732:JUMPDEST 3 | 0x733:CALLVALUE 4 | 0x734:DUP1 5 | 0x735:ISZERO 6 | 0x736:PUSH2 0x73e 7 | 0x739:JUMPI"] 8 | 1842 -> 1850 9 | 1842 -> 1854 10 | 1850[label="0x73a:PUSH1 0x0 11 | 0x73c:DUP1 12 | 0x73d:REVERT"] 13 | 1854[label="0x73e:JUMPDEST 14 | 0x73f:POP 15 | 0x740:PUSH2 0x799 16 | 0x743:PUSH1 0x4 17 | 0x745:DUP1 18 | 0x746:CALLDATASIZE 19 | 0x747:SUB 20 | 0x748:DUP2 21 | 0x749:ADD 22 | 0x74a:SWAP1 23 | 0x74b:DUP1 24 | 0x74c:DUP1 25 | 0x74d:CALLDATALOAD 26 | 0x74e:SWAP1 27 | 0x74f:PUSH1 0x20 28 | 0x751:ADD 29 | 0x752:SWAP1 30 | 0x753:DUP3 31 | 0x754:ADD 32 | 0x755:DUP1 33 | 0x756:CALLDATALOAD 34 | 0x757:SWAP1 35 | 0x758:PUSH1 0x20 36 | 0x75a:ADD 37 | 0x75b:SWAP1 38 | 0x75c:DUP1 39 | 0x75d:DUP1 40 | 0x75e:PUSH1 0x1f 41 | 0x760:ADD 42 | 0x761:PUSH1 0x20 43 | 0x763:DUP1 44 | 0x764:SWAP2 45 | 0x765:DIV 46 | 0x766:MUL 47 | 0x767:PUSH1 0x20 48 | 0x769:ADD 49 | 0x76a:PUSH1 0x40 50 | 0x76c:MLOAD 51 | 0x76d:SWAP1 52 | 0x76e:DUP2 53 | 0x76f:ADD 54 | 0x770:PUSH1 0x40 55 | 0x772:MSTORE 56 | 0x773:DUP1 57 | 0x774:SWAP4 58 | 0x775:SWAP3 59 | 0x776:SWAP2 60 | 0x777:SWAP1 61 | 0x778:DUP2 62 | 0x779:DUP2 63 | 0x77a:MSTORE 64 | 0x77b:PUSH1 0x20 65 | 0x77d:ADD 66 | 0x77e:DUP4 67 | 0x77f:DUP4 68 | 0x780:DUP1 69 | 0x781:DUP3 70 | 0x782:DUP5 71 | 0x783:CALLDATACOPY 72 | 0x784:DUP3 73 | 0x785:ADD 74 | 0x786:SWAP2 75 | 0x787:POP 76 | 0x788:POP 77 | 0x789:POP 78 | 0x78a:POP 79 | 0x78b:POP 80 | 0x78c:POP 81 | 0x78d:SWAP2 82 | 0x78e:SWAP3 83 | 0x78f:SWAP2 84 | 0x790:SWAP3 85 | 0x791:SWAP1 86 | 0x792:POP 87 | 0x793:POP 88 | 0x794:POP 89 | 0x795:PUSH2 0x1d04 90 | 0x798:JUMP"] 91 | 1854 -> 7428 92 | 7428[label="0x1d04:JUMPDEST 93 | 0x1d05:PUSH1 0x0 94 | 0x1d07:CALLER 95 | 0x1d08:SWAP1 96 | 0x1d09:POP 97 | 0x1d0a:PUSH1 0xa 98 | 0x1d0c:PUSH1 0x0 99 | 0x1d0e:DUP3 100 | 0x1d0f:PUSH1 0x40 101 | 0x1d11:MLOAD 102 | 0x1d12:DUP1 103 | 0x1d13:DUP3 104 | 0x1d14:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 105 | 0x1d29:AND 106 | 0x1d2a:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 107 | 0x1d3f:AND 108 | 0x1d40:PUSH13 0x1000000000000000000000000 109 | 0x1d4e:MUL 110 | 0x1d4f:DUP2 111 | 0x1d50:MSTORE 112 | 0x1d51:PUSH1 0x14 113 | 0x1d53:ADD 114 | 0x1d54:SWAP2 115 | 0x1d55:POP 116 | 0x1d56:POP 117 | 0x1d57:PUSH1 0x40 118 | 0x1d59:MLOAD 119 | 0x1d5a:DUP1 120 | 0x1d5b:SWAP2 121 | 0x1d5c:SUB 122 | 0x1d5d:SWAP1 123 | 0x1d5e:SHA3 124 | 0x1d5f:PUSH1 0x0 125 | 0x1d61:NOT 126 | 0x1d62:AND 127 | 0x1d63:PUSH1 0x0 128 | 0x1d65:NOT 129 | 0x1d66:AND 130 | 0x1d67:DUP2 131 | 0x1d68:MSTORE 132 | 0x1d69:PUSH1 0x20 133 | 0x1d6b:ADD 134 | 0x1d6c:SWAP1 135 | 0x1d6d:DUP2 136 | 0x1d6e:MSTORE 137 | 0x1d6f:PUSH1 0x20 138 | 0x1d71:ADD 139 | 0x1d72:PUSH1 0x0 140 | 0x1d74:SHA3 141 | 0x1d75:PUSH1 0x0 142 | 0x1d77:SWAP1 143 | 0x1d78:SLOAD 144 | 0x1d79:SWAP1 145 | 0x1d7a:PUSH2 0x100 146 | 0x1d7d:EXP 147 | 0x1d7e:SWAP1 148 | 0x1d7f:DIV 149 | 0x1d80:PUSH1 0xff 150 | 0x1d82:AND 151 | 0x1d83:ISZERO 152 | 0x1d84:ISZERO 153 | 0x1d85:PUSH2 0x1d8d 154 | 0x1d88:JUMPI"] 155 | 7428 -> 7561 156 | 7428 -> 7565 157 | 7561[label="0x1d89:PUSH1 0x0 158 | 0x1d8b:DUP1 159 | 0x1d8c:REVERT"] 160 | 7565[label="0x1d8d:JUMPDEST 161 | 0x1d8e:DUP2 162 | 0x1d8f:PUSH1 0x0 163 | 0x1d91:SWAP1 164 | 0x1d92:DUP1 165 | 0x1d93:MLOAD 166 | 0x1d94:SWAP1 167 | 0x1d95:PUSH1 0x20 168 | 0x1d97:ADD 169 | 0x1d98:SWAP1 170 | 0x1d99:PUSH2 0x1da3 171 | 0x1d9c:SWAP3 172 | 0x1d9d:SWAP2 173 | 0x1d9e:SWAP1 174 | 0x1d9f:PUSH2 0x2398 175 | 0x1da2:JUMP"] 176 | 7565 -> 9112 177 | 9112[label="0x2398:JUMPDEST 178 | 0x2399:DUP3 179 | 0x239a:DUP1 180 | 0x239b:SLOAD 181 | 0x239c:PUSH1 0x1 182 | 0x239e:DUP2 183 | 0x239f:PUSH1 0x1 184 | 0x23a1:AND 185 | 0x23a2:ISZERO 186 | 0x23a3:PUSH2 0x100 187 | 0x23a6:MUL 188 | 0x23a7:SUB 189 | 0x23a8:AND 190 | 0x23a9:PUSH1 0x2 191 | 0x23ab:SWAP1 192 | 0x23ac:DIV 193 | 0x23ad:SWAP1 194 | 0x23ae:PUSH1 0x0 195 | 0x23b0:MSTORE 196 | 0x23b1:PUSH1 0x20 197 | 0x23b3:PUSH1 0x0 198 | 0x23b5:SHA3 199 | 0x23b6:SWAP1 200 | 0x23b7:PUSH1 0x1f 201 | 0x23b9:ADD 202 | 0x23ba:PUSH1 0x20 203 | 0x23bc:SWAP1 204 | 0x23bd:DIV 205 | 0x23be:DUP2 206 | 0x23bf:ADD 207 | 0x23c0:SWAP3 208 | 0x23c1:DUP3 209 | 0x23c2:PUSH1 0x1f 210 | 0x23c4:LT 211 | 0x23c5:PUSH2 0x23d9 212 | 0x23c8:JUMPI"] 213 | 9112 -> 9161 214 | 9112 -> 9177 215 | 9161[label="0x23c9:DUP1 216 | 0x23ca:MLOAD 217 | 0x23cb:PUSH1 0xff 218 | 0x23cd:NOT 219 | 0x23ce:AND 220 | 0x23cf:DUP4 221 | 0x23d0:DUP1 222 | 0x23d1:ADD 223 | 0x23d2:OR 224 | 0x23d3:DUP6 225 | 0x23d4:SSTORE 226 | 0x23d5:PUSH2 0x2407 227 | 0x23d8:JUMP"] 228 | 9161 -> 9223 229 | 9177[label="0x23d9:JUMPDEST 230 | 0x23da:DUP3 231 | 0x23db:DUP1 232 | 0x23dc:ADD 233 | 0x23dd:PUSH1 0x1 234 | 0x23df:ADD 235 | 0x23e0:DUP6 236 | 0x23e1:SSTORE 237 | 0x23e2:DUP3 238 | 0x23e3:ISZERO 239 | 0x23e4:PUSH2 0x2407 240 | 0x23e7:JUMPI"] 241 | 9177 -> 9192 242 | 9177 -> 9223 243 | 9192[label="0x23e8:SWAP2 244 | 0x23e9:DUP3 245 | 0x23ea:ADD"] 246 | 9192 -> 9195 247 | 9195[label="0x23eb:JUMPDEST 248 | 0x23ec:DUP3 249 | 0x23ed:DUP2 250 | 0x23ee:GT 251 | 0x23ef:ISZERO 252 | 0x23f0:PUSH2 0x2406 253 | 0x23f3:JUMPI"] 254 | 9195 -> 9204 255 | 9195 -> 9222 256 | 9204[label="0x23f4:DUP3 257 | 0x23f5:MLOAD 258 | 0x23f6:DUP3 259 | 0x23f7:SSTORE 260 | 0x23f8:SWAP2 261 | 0x23f9:PUSH1 0x20 262 | 0x23fb:ADD 263 | 0x23fc:SWAP2 264 | 0x23fd:SWAP1 265 | 0x23fe:PUSH1 0x1 266 | 0x2400:ADD 267 | 0x2401:SWAP1 268 | 0x2402:PUSH2 0x23eb 269 | 0x2405:JUMP"] 270 | 9204 -> 9195 271 | 9223[label="0x2407:JUMPDEST 272 | 0x2408:POP 273 | 0x2409:SWAP1 274 | 0x240a:POP 275 | 0x240b:PUSH2 0x2414 276 | 0x240e:SWAP2 277 | 0x240f:SWAP1 278 | 0x2410:PUSH2 0x2418 279 | 0x2413:JUMP"] 280 | 9223 -> 9240 281 | 9222[label="0x2406:JUMPDEST"] 282 | 9222 -> 9223 283 | 9240[label="0x2418:JUMPDEST 284 | 0x2419:PUSH2 0x243a 285 | 0x241c:SWAP2 286 | 0x241d:SWAP1"] 287 | 9240 -> 9246 288 | 9246[label="0x241e:JUMPDEST 289 | 0x241f:DUP1 290 | 0x2420:DUP3 291 | 0x2421:GT 292 | 0x2422:ISZERO 293 | 0x2423:PUSH2 0x2436 294 | 0x2426:JUMPI"] 295 | 9246 -> 9255 296 | 9246 -> 9270 297 | 9255[label="0x2427:PUSH1 0x0 298 | 0x2429:DUP2 299 | 0x242a:PUSH1 0x0 300 | 0x242c:SWAP1 301 | 0x242d:SSTORE 302 | 0x242e:POP 303 | 0x242f:PUSH1 0x1 304 | 0x2431:ADD 305 | 0x2432:PUSH2 0x241e 306 | 0x2435:JUMP"] 307 | 9255 -> 9246 308 | 9270[label="0x2436:JUMPDEST 309 | 0x2437:POP 310 | 0x2438:SWAP1 311 | 0x2439:JUMP"] 312 | 9270 -> 9274 313 | 9274[label="0x243a:JUMPDEST 314 | 0x243b:SWAP1 315 | 0x243c:JUMP"] 316 | 9274 -> 9236 317 | 9236[label="0x2414:JUMPDEST 318 | 0x2415:POP 319 | 0x2416:SWAP1 320 | 0x2417:JUMP"] 321 | 9236 -> 7587 322 | 7587[label="0x1da3:JUMPDEST 323 | 0x1da4:POP 324 | 0x1da5:POP 325 | 0x1da6:POP 326 | 0x1da7:JUMP"] 327 | 7587 -> 1945 328 | 1945[label="0x799:JUMPDEST 329 | 0x79a:STOP"] 330 | 331 | } -------------------------------------------------------------------------------- /tests/expected-fomo3d-output/fomo3d.evm_setStakingRequirement(uint256).dot: -------------------------------------------------------------------------------- 1 | digraph{ 2 | 1254[label="0x4e6:JUMPDEST 3 | 0x4e7:CALLVALUE 4 | 0x4e8:DUP1 5 | 0x4e9:ISZERO 6 | 0x4ea:PUSH2 0x4f2 7 | 0x4ed:JUMPI"] 8 | 1254 -> 1262 9 | 1254 -> 1266 10 | 1262[label="0x4ee:PUSH1 0x0 11 | 0x4f0:DUP1 12 | 0x4f1:REVERT"] 13 | 1266[label="0x4f2:JUMPDEST 14 | 0x4f3:POP 15 | 0x4f4:PUSH2 0x511 16 | 0x4f7:PUSH1 0x4 17 | 0x4f9:DUP1 18 | 0x4fa:CALLDATASIZE 19 | 0x4fb:SUB 20 | 0x4fc:DUP2 21 | 0x4fd:ADD 22 | 0x4fe:SWAP1 23 | 0x4ff:DUP1 24 | 0x500:DUP1 25 | 0x501:CALLDATALOAD 26 | 0x502:SWAP1 27 | 0x503:PUSH1 0x20 28 | 0x505:ADD 29 | 0x506:SWAP1 30 | 0x507:SWAP3 31 | 0x508:SWAP2 32 | 0x509:SWAP1 33 | 0x50a:POP 34 | 0x50b:POP 35 | 0x50c:POP 36 | 0x50d:PUSH2 0x161f 37 | 0x510:JUMP"] 38 | 1266 -> 5663 39 | 5663[label="0x161f:JUMPDEST 40 | 0x1620:PUSH1 0x0 41 | 0x1622:CALLER 42 | 0x1623:SWAP1 43 | 0x1624:POP 44 | 0x1625:PUSH1 0xa 45 | 0x1627:PUSH1 0x0 46 | 0x1629:DUP3 47 | 0x162a:PUSH1 0x40 48 | 0x162c:MLOAD 49 | 0x162d:DUP1 50 | 0x162e:DUP3 51 | 0x162f:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 52 | 0x1644:AND 53 | 0x1645:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 54 | 0x165a:AND 55 | 0x165b:PUSH13 0x1000000000000000000000000 56 | 0x1669:MUL 57 | 0x166a:DUP2 58 | 0x166b:MSTORE 59 | 0x166c:PUSH1 0x14 60 | 0x166e:ADD 61 | 0x166f:SWAP2 62 | 0x1670:POP 63 | 0x1671:POP 64 | 0x1672:PUSH1 0x40 65 | 0x1674:MLOAD 66 | 0x1675:DUP1 67 | 0x1676:SWAP2 68 | 0x1677:SUB 69 | 0x1678:SWAP1 70 | 0x1679:SHA3 71 | 0x167a:PUSH1 0x0 72 | 0x167c:NOT 73 | 0x167d:AND 74 | 0x167e:PUSH1 0x0 75 | 0x1680:NOT 76 | 0x1681:AND 77 | 0x1682:DUP2 78 | 0x1683:MSTORE 79 | 0x1684:PUSH1 0x20 80 | 0x1686:ADD 81 | 0x1687:SWAP1 82 | 0x1688:DUP2 83 | 0x1689:MSTORE 84 | 0x168a:PUSH1 0x20 85 | 0x168c:ADD 86 | 0x168d:PUSH1 0x0 87 | 0x168f:SHA3 88 | 0x1690:PUSH1 0x0 89 | 0x1692:SWAP1 90 | 0x1693:SLOAD 91 | 0x1694:SWAP1 92 | 0x1695:PUSH2 0x100 93 | 0x1698:EXP 94 | 0x1699:SWAP1 95 | 0x169a:DIV 96 | 0x169b:PUSH1 0xff 97 | 0x169d:AND 98 | 0x169e:ISZERO 99 | 0x169f:ISZERO 100 | 0x16a0:PUSH2 0x16a8 101 | 0x16a3:JUMPI"] 102 | 5663 -> 5796 103 | 5663 -> 5800 104 | 5796[label="0x16a4:PUSH1 0x0 105 | 0x16a6:DUP1 106 | 0x16a7:REVERT"] 107 | 5800[label="0x16a8:JUMPDEST 108 | 0x16a9:DUP2 109 | 0x16aa:PUSH1 0x2 110 | 0x16ac:DUP2 111 | 0x16ad:SWAP1 112 | 0x16ae:SSTORE 113 | 0x16af:POP 114 | 0x16b0:POP 115 | 0x16b1:POP 116 | 0x16b2:JUMP"] 117 | 5800 -> 1297 118 | 1297[label="0x511:JUMPDEST 119 | 0x512:STOP"] 120 | 121 | } -------------------------------------------------------------------------------- /tests/expected-fomo3d-output/fomo3d.evm_setSymbol(string).dot: -------------------------------------------------------------------------------- 1 | digraph{ 2 | 1737[label="0x6c9:JUMPDEST 3 | 0x6ca:CALLVALUE 4 | 0x6cb:DUP1 5 | 0x6cc:ISZERO 6 | 0x6cd:PUSH2 0x6d5 7 | 0x6d0:JUMPI"] 8 | 1737 -> 1745 9 | 1737 -> 1749 10 | 1745[label="0x6d1:PUSH1 0x0 11 | 0x6d3:DUP1 12 | 0x6d4:REVERT"] 13 | 1749[label="0x6d5:JUMPDEST 14 | 0x6d6:POP 15 | 0x6d7:PUSH2 0x730 16 | 0x6da:PUSH1 0x4 17 | 0x6dc:DUP1 18 | 0x6dd:CALLDATASIZE 19 | 0x6de:SUB 20 | 0x6df:DUP2 21 | 0x6e0:ADD 22 | 0x6e1:SWAP1 23 | 0x6e2:DUP1 24 | 0x6e3:DUP1 25 | 0x6e4:CALLDATALOAD 26 | 0x6e5:SWAP1 27 | 0x6e6:PUSH1 0x20 28 | 0x6e8:ADD 29 | 0x6e9:SWAP1 30 | 0x6ea:DUP3 31 | 0x6eb:ADD 32 | 0x6ec:DUP1 33 | 0x6ed:CALLDATALOAD 34 | 0x6ee:SWAP1 35 | 0x6ef:PUSH1 0x20 36 | 0x6f1:ADD 37 | 0x6f2:SWAP1 38 | 0x6f3:DUP1 39 | 0x6f4:DUP1 40 | 0x6f5:PUSH1 0x1f 41 | 0x6f7:ADD 42 | 0x6f8:PUSH1 0x20 43 | 0x6fa:DUP1 44 | 0x6fb:SWAP2 45 | 0x6fc:DIV 46 | 0x6fd:MUL 47 | 0x6fe:PUSH1 0x20 48 | 0x700:ADD 49 | 0x701:PUSH1 0x40 50 | 0x703:MLOAD 51 | 0x704:SWAP1 52 | 0x705:DUP2 53 | 0x706:ADD 54 | 0x707:PUSH1 0x40 55 | 0x709:MSTORE 56 | 0x70a:DUP1 57 | 0x70b:SWAP4 58 | 0x70c:SWAP3 59 | 0x70d:SWAP2 60 | 0x70e:SWAP1 61 | 0x70f:DUP2 62 | 0x710:DUP2 63 | 0x711:MSTORE 64 | 0x712:PUSH1 0x20 65 | 0x714:ADD 66 | 0x715:DUP4 67 | 0x716:DUP4 68 | 0x717:DUP1 69 | 0x718:DUP3 70 | 0x719:DUP5 71 | 0x71a:CALLDATACOPY 72 | 0x71b:DUP3 73 | 0x71c:ADD 74 | 0x71d:SWAP2 75 | 0x71e:POP 76 | 0x71f:POP 77 | 0x720:POP 78 | 0x721:POP 79 | 0x722:POP 80 | 0x723:POP 81 | 0x724:SWAP2 82 | 0x725:SWAP3 83 | 0x726:SWAP2 84 | 0x727:SWAP3 85 | 0x728:SWAP1 86 | 0x729:POP 87 | 0x72a:POP 88 | 0x72b:POP 89 | 0x72c:PUSH2 0x1c60 90 | 0x72f:JUMP"] 91 | 1749 -> 7264 92 | 7264[label="0x1c60:JUMPDEST 93 | 0x1c61:PUSH1 0x0 94 | 0x1c63:CALLER 95 | 0x1c64:SWAP1 96 | 0x1c65:POP 97 | 0x1c66:PUSH1 0xa 98 | 0x1c68:PUSH1 0x0 99 | 0x1c6a:DUP3 100 | 0x1c6b:PUSH1 0x40 101 | 0x1c6d:MLOAD 102 | 0x1c6e:DUP1 103 | 0x1c6f:DUP3 104 | 0x1c70:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 105 | 0x1c85:AND 106 | 0x1c86:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 107 | 0x1c9b:AND 108 | 0x1c9c:PUSH13 0x1000000000000000000000000 109 | 0x1caa:MUL 110 | 0x1cab:DUP2 111 | 0x1cac:MSTORE 112 | 0x1cad:PUSH1 0x14 113 | 0x1caf:ADD 114 | 0x1cb0:SWAP2 115 | 0x1cb1:POP 116 | 0x1cb2:POP 117 | 0x1cb3:PUSH1 0x40 118 | 0x1cb5:MLOAD 119 | 0x1cb6:DUP1 120 | 0x1cb7:SWAP2 121 | 0x1cb8:SUB 122 | 0x1cb9:SWAP1 123 | 0x1cba:SHA3 124 | 0x1cbb:PUSH1 0x0 125 | 0x1cbd:NOT 126 | 0x1cbe:AND 127 | 0x1cbf:PUSH1 0x0 128 | 0x1cc1:NOT 129 | 0x1cc2:AND 130 | 0x1cc3:DUP2 131 | 0x1cc4:MSTORE 132 | 0x1cc5:PUSH1 0x20 133 | 0x1cc7:ADD 134 | 0x1cc8:SWAP1 135 | 0x1cc9:DUP2 136 | 0x1cca:MSTORE 137 | 0x1ccb:PUSH1 0x20 138 | 0x1ccd:ADD 139 | 0x1cce:PUSH1 0x0 140 | 0x1cd0:SHA3 141 | 0x1cd1:PUSH1 0x0 142 | 0x1cd3:SWAP1 143 | 0x1cd4:SLOAD 144 | 0x1cd5:SWAP1 145 | 0x1cd6:PUSH2 0x100 146 | 0x1cd9:EXP 147 | 0x1cda:SWAP1 148 | 0x1cdb:DIV 149 | 0x1cdc:PUSH1 0xff 150 | 0x1cde:AND 151 | 0x1cdf:ISZERO 152 | 0x1ce0:ISZERO 153 | 0x1ce1:PUSH2 0x1ce9 154 | 0x1ce4:JUMPI"] 155 | 7264 -> 7397 156 | 7264 -> 7401 157 | 7397[label="0x1ce5:PUSH1 0x0 158 | 0x1ce7:DUP1 159 | 0x1ce8:REVERT"] 160 | 7401[label="0x1ce9:JUMPDEST 161 | 0x1cea:DUP2 162 | 0x1ceb:PUSH1 0x1 163 | 0x1ced:SWAP1 164 | 0x1cee:DUP1 165 | 0x1cef:MLOAD 166 | 0x1cf0:SWAP1 167 | 0x1cf1:PUSH1 0x20 168 | 0x1cf3:ADD 169 | 0x1cf4:SWAP1 170 | 0x1cf5:PUSH2 0x1cff 171 | 0x1cf8:SWAP3 172 | 0x1cf9:SWAP2 173 | 0x1cfa:SWAP1 174 | 0x1cfb:PUSH2 0x2398 175 | 0x1cfe:JUMP"] 176 | 7401 -> 9112 177 | 9112[label="0x2398:JUMPDEST 178 | 0x2399:DUP3 179 | 0x239a:DUP1 180 | 0x239b:SLOAD 181 | 0x239c:PUSH1 0x1 182 | 0x239e:DUP2 183 | 0x239f:PUSH1 0x1 184 | 0x23a1:AND 185 | 0x23a2:ISZERO 186 | 0x23a3:PUSH2 0x100 187 | 0x23a6:MUL 188 | 0x23a7:SUB 189 | 0x23a8:AND 190 | 0x23a9:PUSH1 0x2 191 | 0x23ab:SWAP1 192 | 0x23ac:DIV 193 | 0x23ad:SWAP1 194 | 0x23ae:PUSH1 0x0 195 | 0x23b0:MSTORE 196 | 0x23b1:PUSH1 0x20 197 | 0x23b3:PUSH1 0x0 198 | 0x23b5:SHA3 199 | 0x23b6:SWAP1 200 | 0x23b7:PUSH1 0x1f 201 | 0x23b9:ADD 202 | 0x23ba:PUSH1 0x20 203 | 0x23bc:SWAP1 204 | 0x23bd:DIV 205 | 0x23be:DUP2 206 | 0x23bf:ADD 207 | 0x23c0:SWAP3 208 | 0x23c1:DUP3 209 | 0x23c2:PUSH1 0x1f 210 | 0x23c4:LT 211 | 0x23c5:PUSH2 0x23d9 212 | 0x23c8:JUMPI"] 213 | 9112 -> 9161 214 | 9112 -> 9177 215 | 9161[label="0x23c9:DUP1 216 | 0x23ca:MLOAD 217 | 0x23cb:PUSH1 0xff 218 | 0x23cd:NOT 219 | 0x23ce:AND 220 | 0x23cf:DUP4 221 | 0x23d0:DUP1 222 | 0x23d1:ADD 223 | 0x23d2:OR 224 | 0x23d3:DUP6 225 | 0x23d4:SSTORE 226 | 0x23d5:PUSH2 0x2407 227 | 0x23d8:JUMP"] 228 | 9161 -> 9223 229 | 9177[label="0x23d9:JUMPDEST 230 | 0x23da:DUP3 231 | 0x23db:DUP1 232 | 0x23dc:ADD 233 | 0x23dd:PUSH1 0x1 234 | 0x23df:ADD 235 | 0x23e0:DUP6 236 | 0x23e1:SSTORE 237 | 0x23e2:DUP3 238 | 0x23e3:ISZERO 239 | 0x23e4:PUSH2 0x2407 240 | 0x23e7:JUMPI"] 241 | 9177 -> 9192 242 | 9177 -> 9223 243 | 9192[label="0x23e8:SWAP2 244 | 0x23e9:DUP3 245 | 0x23ea:ADD"] 246 | 9192 -> 9195 247 | 9195[label="0x23eb:JUMPDEST 248 | 0x23ec:DUP3 249 | 0x23ed:DUP2 250 | 0x23ee:GT 251 | 0x23ef:ISZERO 252 | 0x23f0:PUSH2 0x2406 253 | 0x23f3:JUMPI"] 254 | 9195 -> 9204 255 | 9195 -> 9222 256 | 9204[label="0x23f4:DUP3 257 | 0x23f5:MLOAD 258 | 0x23f6:DUP3 259 | 0x23f7:SSTORE 260 | 0x23f8:SWAP2 261 | 0x23f9:PUSH1 0x20 262 | 0x23fb:ADD 263 | 0x23fc:SWAP2 264 | 0x23fd:SWAP1 265 | 0x23fe:PUSH1 0x1 266 | 0x2400:ADD 267 | 0x2401:SWAP1 268 | 0x2402:PUSH2 0x23eb 269 | 0x2405:JUMP"] 270 | 9204 -> 9195 271 | 9223[label="0x2407:JUMPDEST 272 | 0x2408:POP 273 | 0x2409:SWAP1 274 | 0x240a:POP 275 | 0x240b:PUSH2 0x2414 276 | 0x240e:SWAP2 277 | 0x240f:SWAP1 278 | 0x2410:PUSH2 0x2418 279 | 0x2413:JUMP"] 280 | 9223 -> 9240 281 | 9222[label="0x2406:JUMPDEST"] 282 | 9222 -> 9223 283 | 9240[label="0x2418:JUMPDEST 284 | 0x2419:PUSH2 0x243a 285 | 0x241c:SWAP2 286 | 0x241d:SWAP1"] 287 | 9240 -> 9246 288 | 9246[label="0x241e:JUMPDEST 289 | 0x241f:DUP1 290 | 0x2420:DUP3 291 | 0x2421:GT 292 | 0x2422:ISZERO 293 | 0x2423:PUSH2 0x2436 294 | 0x2426:JUMPI"] 295 | 9246 -> 9255 296 | 9246 -> 9270 297 | 9255[label="0x2427:PUSH1 0x0 298 | 0x2429:DUP2 299 | 0x242a:PUSH1 0x0 300 | 0x242c:SWAP1 301 | 0x242d:SSTORE 302 | 0x242e:POP 303 | 0x242f:PUSH1 0x1 304 | 0x2431:ADD 305 | 0x2432:PUSH2 0x241e 306 | 0x2435:JUMP"] 307 | 9255 -> 9246 308 | 9270[label="0x2436:JUMPDEST 309 | 0x2437:POP 310 | 0x2438:SWAP1 311 | 0x2439:JUMP"] 312 | 9270 -> 9274 313 | 9274[label="0x243a:JUMPDEST 314 | 0x243b:SWAP1 315 | 0x243c:JUMP"] 316 | 9274 -> 9236 317 | 9236[label="0x2414:JUMPDEST 318 | 0x2415:POP 319 | 0x2416:SWAP1 320 | 0x2417:JUMP"] 321 | 9236 -> 7423 322 | 7423[label="0x1cff:JUMPDEST 323 | 0x1d00:POP 324 | 0x1d01:POP 325 | 0x1d02:POP 326 | 0x1d03:JUMP"] 327 | 7423 -> 1840 328 | 1840[label="0x730:JUMPDEST 329 | 0x731:STOP"] 330 | 331 | } -------------------------------------------------------------------------------- /tests/expected-fomo3d-output/fomo3d.evm_stakingRequirement().dot: -------------------------------------------------------------------------------- 1 | digraph{ 2 | 1014[label="0x3f6:JUMPDEST 3 | 0x3f7:CALLVALUE 4 | 0x3f8:DUP1 5 | 0x3f9:ISZERO 6 | 0x3fa:PUSH2 0x402 7 | 0x3fd:JUMPI"] 8 | 1014 -> 1022 9 | 1014 -> 1026 10 | 1022[label="0x3fe:PUSH1 0x0 11 | 0x400:DUP1 12 | 0x401:REVERT"] 13 | 1026[label="0x402:JUMPDEST 14 | 0x403:POP 15 | 0x404:PUSH2 0x40b 16 | 0x407:PUSH2 0x1545 17 | 0x40a:JUMP"] 18 | 1026 -> 5445 19 | 5445[label="0x1545:JUMPDEST 20 | 0x1546:PUSH1 0x2 21 | 0x1548:SLOAD 22 | 0x1549:DUP2 23 | 0x154a:JUMP"] 24 | 5445 -> 1035 25 | 1035[label="0x40b:JUMPDEST 26 | 0x40c:PUSH1 0x40 27 | 0x40e:MLOAD 28 | 0x40f:DUP1 29 | 0x410:DUP3 30 | 0x411:DUP2 31 | 0x412:MSTORE 32 | 0x413:PUSH1 0x20 33 | 0x415:ADD 34 | 0x416:SWAP2 35 | 0x417:POP 36 | 0x418:POP 37 | 0x419:PUSH1 0x40 38 | 0x41b:MLOAD 39 | 0x41c:DUP1 40 | 0x41d:SWAP2 41 | 0x41e:SUB 42 | 0x41f:SWAP1 43 | 0x420:RETURN"] 44 | 45 | } -------------------------------------------------------------------------------- /tests/expected-fomo3d-output/fomo3d.evm_symbol().dot: -------------------------------------------------------------------------------- 1 | digraph{ 2 | 1469[label="0x5bd:JUMPDEST 3 | 0x5be:CALLVALUE 4 | 0x5bf:DUP1 5 | 0x5c0:ISZERO 6 | 0x5c1:PUSH2 0x5c9 7 | 0x5c4:JUMPI"] 8 | 1469 -> 1477 9 | 1469 -> 1481 10 | 1477[label="0x5c5:PUSH1 0x0 11 | 0x5c7:DUP1 12 | 0x5c8:REVERT"] 13 | 1481[label="0x5c9:JUMPDEST 14 | 0x5ca:POP 15 | 0x5cb:PUSH2 0x5d2 16 | 0x5ce:PUSH2 0x17e9 17 | 0x5d1:JUMP"] 18 | 1481 -> 6121 19 | 6121[label="0x17e9:JUMPDEST 20 | 0x17ea:PUSH1 0x1 21 | 0x17ec:DUP1 22 | 0x17ed:SLOAD 23 | 0x17ee:PUSH1 0x1 24 | 0x17f0:DUP2 25 | 0x17f1:PUSH1 0x1 26 | 0x17f3:AND 27 | 0x17f4:ISZERO 28 | 0x17f5:PUSH2 0x100 29 | 0x17f8:MUL 30 | 0x17f9:SUB 31 | 0x17fa:AND 32 | 0x17fb:PUSH1 0x2 33 | 0x17fd:SWAP1 34 | 0x17fe:DIV 35 | 0x17ff:DUP1 36 | 0x1800:PUSH1 0x1f 37 | 0x1802:ADD 38 | 0x1803:PUSH1 0x20 39 | 0x1805:DUP1 40 | 0x1806:SWAP2 41 | 0x1807:DIV 42 | 0x1808:MUL 43 | 0x1809:PUSH1 0x20 44 | 0x180b:ADD 45 | 0x180c:PUSH1 0x40 46 | 0x180e:MLOAD 47 | 0x180f:SWAP1 48 | 0x1810:DUP2 49 | 0x1811:ADD 50 | 0x1812:PUSH1 0x40 51 | 0x1814:MSTORE 52 | 0x1815:DUP1 53 | 0x1816:SWAP3 54 | 0x1817:SWAP2 55 | 0x1818:SWAP1 56 | 0x1819:DUP2 57 | 0x181a:DUP2 58 | 0x181b:MSTORE 59 | 0x181c:PUSH1 0x20 60 | 0x181e:ADD 61 | 0x181f:DUP3 62 | 0x1820:DUP1 63 | 0x1821:SLOAD 64 | 0x1822:PUSH1 0x1 65 | 0x1824:DUP2 66 | 0x1825:PUSH1 0x1 67 | 0x1827:AND 68 | 0x1828:ISZERO 69 | 0x1829:PUSH2 0x100 70 | 0x182c:MUL 71 | 0x182d:SUB 72 | 0x182e:AND 73 | 0x182f:PUSH1 0x2 74 | 0x1831:SWAP1 75 | 0x1832:DIV 76 | 0x1833:DUP1 77 | 0x1834:ISZERO 78 | 0x1835:PUSH2 0x187f 79 | 0x1838:JUMPI"] 80 | 6121 -> 6201 81 | 6121 -> 6271 82 | 6201[label="0x1839:DUP1 83 | 0x183a:PUSH1 0x1f 84 | 0x183c:LT 85 | 0x183d:PUSH2 0x1854 86 | 0x1840:JUMPI"] 87 | 6201 -> 6209 88 | 6201 -> 6228 89 | 6209[label="0x1841:PUSH2 0x100 90 | 0x1844:DUP1 91 | 0x1845:DUP4 92 | 0x1846:SLOAD 93 | 0x1847:DIV 94 | 0x1848:MUL 95 | 0x1849:DUP4 96 | 0x184a:MSTORE 97 | 0x184b:SWAP2 98 | 0x184c:PUSH1 0x20 99 | 0x184e:ADD 100 | 0x184f:SWAP2 101 | 0x1850:PUSH2 0x187f 102 | 0x1853:JUMP"] 103 | 6209 -> 6271 104 | 6271[label="0x187f:JUMPDEST 105 | 0x1880:POP 106 | 0x1881:POP 107 | 0x1882:POP 108 | 0x1883:POP 109 | 0x1884:POP 110 | 0x1885:DUP2 111 | 0x1886:JUMP"] 112 | 6271 -> 1490 113 | 6228[label="0x1854:JUMPDEST 114 | 0x1855:DUP3 115 | 0x1856:ADD 116 | 0x1857:SWAP2 117 | 0x1858:SWAP1 118 | 0x1859:PUSH1 0x0 119 | 0x185b:MSTORE 120 | 0x185c:PUSH1 0x20 121 | 0x185e:PUSH1 0x0 122 | 0x1860:SHA3 123 | 0x1861:SWAP1"] 124 | 6228 -> 6242 125 | 6242[label="0x1862:JUMPDEST 126 | 0x1863:DUP2 127 | 0x1864:SLOAD 128 | 0x1865:DUP2 129 | 0x1866:MSTORE 130 | 0x1867:SWAP1 131 | 0x1868:PUSH1 0x1 132 | 0x186a:ADD 133 | 0x186b:SWAP1 134 | 0x186c:PUSH1 0x20 135 | 0x186e:ADD 136 | 0x186f:DUP1 137 | 0x1870:DUP4 138 | 0x1871:GT 139 | 0x1872:PUSH2 0x1862 140 | 0x1875:JUMPI"] 141 | 6242 -> 6262 142 | 6242 -> 6242 143 | 6262[label="0x1876:DUP3 144 | 0x1877:SWAP1 145 | 0x1878:SUB 146 | 0x1879:PUSH1 0x1f 147 | 0x187b:AND 148 | 0x187c:DUP3 149 | 0x187d:ADD 150 | 0x187e:SWAP2"] 151 | 6262 -> 6271 152 | 1490[label="0x5d2:JUMPDEST 153 | 0x5d3:PUSH1 0x40 154 | 0x5d5:MLOAD 155 | 0x5d6:DUP1 156 | 0x5d7:DUP1 157 | 0x5d8:PUSH1 0x20 158 | 0x5da:ADD 159 | 0x5db:DUP3 160 | 0x5dc:DUP2 161 | 0x5dd:SUB 162 | 0x5de:DUP3 163 | 0x5df:MSTORE 164 | 0x5e0:DUP4 165 | 0x5e1:DUP2 166 | 0x5e2:DUP2 167 | 0x5e3:MLOAD 168 | 0x5e4:DUP2 169 | 0x5e5:MSTORE 170 | 0x5e6:PUSH1 0x20 171 | 0x5e8:ADD 172 | 0x5e9:SWAP2 173 | 0x5ea:POP 174 | 0x5eb:DUP1 175 | 0x5ec:MLOAD 176 | 0x5ed:SWAP1 177 | 0x5ee:PUSH1 0x20 178 | 0x5f0:ADD 179 | 0x5f1:SWAP1 180 | 0x5f2:DUP1 181 | 0x5f3:DUP4 182 | 0x5f4:DUP4 183 | 0x5f5:PUSH1 0x0"] 184 | 1490 -> 1527 185 | 1527[label="0x5f7:JUMPDEST 186 | 0x5f8:DUP4 187 | 0x5f9:DUP2 188 | 0x5fa:LT 189 | 0x5fb:ISZERO 190 | 0x5fc:PUSH2 0x612 191 | 0x5ff:JUMPI"] 192 | 1527 -> 1536 193 | 1527 -> 1554 194 | 1536[label="0x600:DUP1 195 | 0x601:DUP3 196 | 0x602:ADD 197 | 0x603:MLOAD 198 | 0x604:DUP2 199 | 0x605:DUP5 200 | 0x606:ADD 201 | 0x607:MSTORE 202 | 0x608:PUSH1 0x20 203 | 0x60a:DUP2 204 | 0x60b:ADD 205 | 0x60c:SWAP1 206 | 0x60d:POP 207 | 0x60e:PUSH2 0x5f7 208 | 0x611:JUMP"] 209 | 1536 -> 1527 210 | 1554[label="0x612:JUMPDEST 211 | 0x613:POP 212 | 0x614:POP 213 | 0x615:POP 214 | 0x616:POP 215 | 0x617:SWAP1 216 | 0x618:POP 217 | 0x619:SWAP1 218 | 0x61a:DUP2 219 | 0x61b:ADD 220 | 0x61c:SWAP1 221 | 0x61d:PUSH1 0x1f 222 | 0x61f:AND 223 | 0x620:DUP1 224 | 0x621:ISZERO 225 | 0x622:PUSH2 0x63f 226 | 0x625:JUMPI"] 227 | 1554 -> 1574 228 | 1554 -> 1599 229 | 1574[label="0x626:DUP1 230 | 0x627:DUP3 231 | 0x628:SUB 232 | 0x629:DUP1 233 | 0x62a:MLOAD 234 | 0x62b:PUSH1 0x1 235 | 0x62d:DUP4 236 | 0x62e:PUSH1 0x20 237 | 0x630:SUB 238 | 0x631:PUSH2 0x100 239 | 0x634:EXP 240 | 0x635:SUB 241 | 0x636:NOT 242 | 0x637:AND 243 | 0x638:DUP2 244 | 0x639:MSTORE 245 | 0x63a:PUSH1 0x20 246 | 0x63c:ADD 247 | 0x63d:SWAP2 248 | 0x63e:POP"] 249 | 1574 -> 1599 250 | 1599[label="0x63f:JUMPDEST 251 | 0x640:POP 252 | 0x641:SWAP3 253 | 0x642:POP 254 | 0x643:POP 255 | 0x644:POP 256 | 0x645:PUSH1 0x40 257 | 0x647:MLOAD 258 | 0x648:DUP1 259 | 0x649:SWAP2 260 | 0x64a:SUB 261 | 0x64b:SWAP1 262 | 0x64c:RETURN"] 263 | 264 | } -------------------------------------------------------------------------------- /tests/expected-fomo3d-output/fomo3d.evm_totalEthereumBalance().dot: -------------------------------------------------------------------------------- 1 | digraph{ 2 | 1124[label="0x464:JUMPDEST 3 | 0x465:CALLVALUE 4 | 0x466:DUP1 5 | 0x467:ISZERO 6 | 0x468:PUSH2 0x470 7 | 0x46b:JUMPI"] 8 | 1124 -> 1132 9 | 1124 -> 1136 10 | 1132[label="0x46c:PUSH1 0x0 11 | 0x46e:DUP1 12 | 0x46f:REVERT"] 13 | 1136[label="0x470:JUMPDEST 14 | 0x471:POP 15 | 0x472:PUSH2 0x479 16 | 0x475:PUSH2 0x15b7 17 | 0x478:JUMP"] 18 | 1136 -> 5559 19 | 5559[label="0x15b7:JUMPDEST 20 | 0x15b8:PUSH1 0x0 21 | 0x15ba:ADDRESS 22 | 0x15bb:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 23 | 0x15d0:AND 24 | 0x15d1:BALANCE 25 | 0x15d2:SWAP1 26 | 0x15d3:POP 27 | 0x15d4:SWAP1 28 | 0x15d5:JUMP"] 29 | 5559 -> 1145 30 | 1145[label="0x479:JUMPDEST 31 | 0x47a:PUSH1 0x40 32 | 0x47c:MLOAD 33 | 0x47d:DUP1 34 | 0x47e:DUP3 35 | 0x47f:DUP2 36 | 0x480:MSTORE 37 | 0x481:PUSH1 0x20 38 | 0x483:ADD 39 | 0x484:SWAP2 40 | 0x485:POP 41 | 0x486:POP 42 | 0x487:PUSH1 0x40 43 | 0x489:MLOAD 44 | 0x48a:DUP1 45 | 0x48b:SWAP2 46 | 0x48c:SUB 47 | 0x48d:SWAP1 48 | 0x48e:RETURN"] 49 | 50 | } -------------------------------------------------------------------------------- /tests/expected-fomo3d-output/fomo3d.evm_totalSupply().dot: -------------------------------------------------------------------------------- 1 | digraph{ 2 | 671[label="0x29f:JUMPDEST 3 | 0x2a0:CALLVALUE 4 | 0x2a1:DUP1 5 | 0x2a2:ISZERO 6 | 0x2a3:PUSH2 0x2ab 7 | 0x2a6:JUMPI"] 8 | 671 -> 679 9 | 671 -> 683 10 | 679[label="0x2a7:PUSH1 0x0 11 | 0x2a9:DUP1 12 | 0x2aa:REVERT"] 13 | 683[label="0x2ab:JUMPDEST 14 | 0x2ac:POP 15 | 0x2ad:PUSH2 0x2b4 16 | 0x2b0:PUSH2 0x12b8 17 | 0x2b3:JUMP"] 18 | 683 -> 4792 19 | 4792[label="0x12b8:JUMPDEST 20 | 0x12b9:PUSH1 0x0 21 | 0x12bb:PUSH1 0x8 22 | 0x12bd:SLOAD 23 | 0x12be:SWAP1 24 | 0x12bf:POP 25 | 0x12c0:SWAP1 26 | 0x12c1:JUMP"] 27 | 4792 -> 692 28 | 692[label="0x2b4:JUMPDEST 29 | 0x2b5:PUSH1 0x40 30 | 0x2b7:MLOAD 31 | 0x2b8:DUP1 32 | 0x2b9:DUP3 33 | 0x2ba:DUP2 34 | 0x2bb:MSTORE 35 | 0x2bc:PUSH1 0x20 36 | 0x2be:ADD 37 | 0x2bf:SWAP2 38 | 0x2c0:POP 39 | 0x2c1:POP 40 | 0x2c2:PUSH1 0x40 41 | 0x2c4:MLOAD 42 | 0x2c5:DUP1 43 | 0x2c6:SWAP2 44 | 0x2c7:SUB 45 | 0x2c8:SWAP1 46 | 0x2c9:RETURN"] 47 | 48 | } -------------------------------------------------------------------------------- /tests/expected-fomo3d-output/fomo3d.evm_transfer(address,uint256).dot: -------------------------------------------------------------------------------- 1 | digraph{ 2 | 1636[label="0x664:JUMPDEST 3 | 0x665:CALLVALUE 4 | 0x666:DUP1 5 | 0x667:ISZERO 6 | 0x668:PUSH2 0x670 7 | 0x66b:JUMPI"] 8 | 1636 -> 1644 9 | 1636 -> 1648 10 | 1644[label="0x66c:PUSH1 0x0 11 | 0x66e:DUP1 12 | 0x66f:REVERT"] 13 | 1648[label="0x670:JUMPDEST 14 | 0x671:POP 15 | 0x672:PUSH2 0x6af 16 | 0x675:PUSH1 0x4 17 | 0x677:DUP1 18 | 0x678:CALLDATASIZE 19 | 0x679:SUB 20 | 0x67a:DUP2 21 | 0x67b:ADD 22 | 0x67c:SWAP1 23 | 0x67d:DUP1 24 | 0x67e:DUP1 25 | 0x67f:CALLDATALOAD 26 | 0x680:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 27 | 0x695:AND 28 | 0x696:SWAP1 29 | 0x697:PUSH1 0x20 30 | 0x699:ADD 31 | 0x69a:SWAP1 32 | 0x69b:SWAP3 33 | 0x69c:SWAP2 34 | 0x69d:SWAP1 35 | 0x69e:DUP1 36 | 0x69f:CALLDATALOAD 37 | 0x6a0:SWAP1 38 | 0x6a1:PUSH1 0x20 39 | 0x6a3:ADD 40 | 0x6a4:SWAP1 41 | 0x6a5:SWAP3 42 | 0x6a6:SWAP2 43 | 0x6a7:SWAP1 44 | 0x6a8:POP 45 | 0x6a9:POP 46 | 0x6aa:POP 47 | 0x6ab:PUSH2 0x192e 48 | 0x6ae:JUMP"] 49 | 1648 -> 6446 50 | 6446[label="0x192e:JUMPDEST 51 | 0x192f:PUSH1 0x0 52 | 0x1931:DUP1 53 | 0x1932:PUSH1 0x0 54 | 0x1934:DUP1 55 | 0x1935:PUSH1 0x0 56 | 0x1937:DUP1 57 | 0x1938:PUSH2 0x193f 58 | 0x193b:PUSH2 0x17d4 59 | 0x193e:JUMP"] 60 | 6446 -> 6100 61 | 6100[label="0x17d4:JUMPDEST 62 | 0x17d5:PUSH1 0x0 63 | 0x17d7:DUP1 64 | 0x17d8:CALLER 65 | 0x17d9:SWAP1 66 | 0x17da:POP 67 | 0x17db:PUSH2 0x17e3 68 | 0x17de:DUP2 69 | 0x17df:PUSH2 0x15d6 70 | 0x17e2:JUMP"] 71 | 6100 -> 5590 72 | 5590[label="0x15d6:JUMPDEST 73 | 0x15d7:PUSH1 0x0 74 | 0x15d9:PUSH1 0x4 75 | 0x15db:PUSH1 0x0 76 | 0x15dd:DUP4 77 | 0x15de:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 78 | 0x15f3:AND 79 | 0x15f4:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 80 | 0x1609:AND 81 | 0x160a:DUP2 82 | 0x160b:MSTORE 83 | 0x160c:PUSH1 0x20 84 | 0x160e:ADD 85 | 0x160f:SWAP1 86 | 0x1610:DUP2 87 | 0x1611:MSTORE 88 | 0x1612:PUSH1 0x20 89 | 0x1614:ADD 90 | 0x1615:PUSH1 0x0 91 | 0x1617:SHA3 92 | 0x1618:SLOAD 93 | 0x1619:SWAP1 94 | 0x161a:POP 95 | 0x161b:SWAP2 96 | 0x161c:SWAP1 97 | 0x161d:POP 98 | 0x161e:JUMP"] 99 | 5590 -> 6115 100 | 6115[label="0x17e3:JUMPDEST 101 | 0x17e4:SWAP2 102 | 0x17e5:POP 103 | 0x17e6:POP 104 | 0x17e7:SWAP1 105 | 0x17e8:JUMP"] 106 | 6115 -> 6463 107 | 6463[label="0x193f:JUMPDEST 108 | 0x1940:GT 109 | 0x1941:ISZERO 110 | 0x1942:ISZERO 111 | 0x1943:PUSH2 0x194b 112 | 0x1946:JUMPI"] 113 | 6463 -> 6471 114 | 6463 -> 6475 115 | 6471[label="0x1947:PUSH1 0x0 116 | 0x1949:DUP1 117 | 0x194a:REVERT"] 118 | 6475[label="0x194b:JUMPDEST 119 | 0x194c:CALLER 120 | 0x194d:SWAP4 121 | 0x194e:POP 122 | 0x194f:PUSH1 0xb 123 | 0x1951:PUSH1 0x0 124 | 0x1953:SWAP1 125 | 0x1954:SLOAD 126 | 0x1955:SWAP1 127 | 0x1956:PUSH2 0x100 128 | 0x1959:EXP 129 | 0x195a:SWAP1 130 | 0x195b:DIV 131 | 0x195c:PUSH1 0xff 132 | 0x195e:AND 133 | 0x195f:ISZERO 134 | 0x1960:DUP1 135 | 0x1961:ISZERO 136 | 0x1962:PUSH2 0x19aa 137 | 0x1965:JUMPI"] 138 | 6475 -> 6502 139 | 6475 -> 6570 140 | 6502[label="0x1966:POP 141 | 0x1967:PUSH1 0x4 142 | 0x1969:PUSH1 0x0 143 | 0x196b:DUP6 144 | 0x196c:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 145 | 0x1981:AND 146 | 0x1982:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 147 | 0x1997:AND 148 | 0x1998:DUP2 149 | 0x1999:MSTORE 150 | 0x199a:PUSH1 0x20 151 | 0x199c:ADD 152 | 0x199d:SWAP1 153 | 0x199e:DUP2 154 | 0x199f:MSTORE 155 | 0x19a0:PUSH1 0x20 156 | 0x19a2:ADD 157 | 0x19a3:PUSH1 0x0 158 | 0x19a5:SHA3 159 | 0x19a6:SLOAD 160 | 0x19a7:DUP7 161 | 0x19a8:GT 162 | 0x19a9:ISZERO"] 163 | 6502 -> 6570 164 | 6570[label="0x19aa:JUMPDEST 165 | 0x19ab:ISZERO 166 | 0x19ac:ISZERO 167 | 0x19ad:PUSH2 0x19b5 168 | 0x19b0:JUMPI"] 169 | 6570 -> 6577 170 | 6570 -> 6581 171 | 6577[label="0x19b1:PUSH1 0x0 172 | 0x19b3:DUP1 173 | 0x19b4:REVERT"] 174 | 6581[label="0x19b5:JUMPDEST 175 | 0x19b6:PUSH1 0x0 176 | 0x19b8:PUSH2 0x19c1 177 | 0x19bb:PUSH1 0x1 178 | 0x19bd:PUSH2 0x154b 179 | 0x19c0:JUMP"] 180 | 6581 -> 5451 181 | 5451[label="0x154b:JUMPDEST 182 | 0x154c:PUSH1 0x0 183 | 0x154e:DUP1 184 | 0x154f:CALLER 185 | 0x1550:SWAP1 186 | 0x1551:POP 187 | 0x1552:DUP3 188 | 0x1553:PUSH2 0x1564 189 | 0x1556:JUMPI"] 190 | 5451 -> 5463 191 | 5451 -> 5476 192 | 5463[label="0x1557:PUSH2 0x155f 193 | 0x155a:DUP2 194 | 0x155b:PUSH2 0x1140 195 | 0x155e:JUMP"] 196 | 5463 -> 4416 197 | 5476[label="0x1564:JUMPDEST 198 | 0x1565:PUSH1 0x5 199 | 0x1567:PUSH1 0x0 200 | 0x1569:DUP3 201 | 0x156a:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 202 | 0x157f:AND 203 | 0x1580:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 204 | 0x1595:AND 205 | 0x1596:DUP2 206 | 0x1597:MSTORE 207 | 0x1598:PUSH1 0x20 208 | 0x159a:ADD 209 | 0x159b:SWAP1 210 | 0x159c:DUP2 211 | 0x159d:MSTORE 212 | 0x159e:PUSH1 0x20 213 | 0x15a0:ADD 214 | 0x15a1:PUSH1 0x0 215 | 0x15a3:SHA3 216 | 0x15a4:SLOAD 217 | 0x15a5:PUSH2 0x15ad 218 | 0x15a8:DUP3 219 | 0x15a9:PUSH2 0x1140 220 | 0x15ac:JUMP"] 221 | 5476 -> 4416 222 | 4416[label="0x1140:JUMPDEST 223 | 0x1141:PUSH1 0x0 224 | 0x1143:PUSH9 0x10000000000000000 225 | 0x114d:PUSH1 0x6 226 | 0x114f:PUSH1 0x0 227 | 0x1151:DUP5 228 | 0x1152:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 229 | 0x1167:AND 230 | 0x1168:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 231 | 0x117d:AND 232 | 0x117e:DUP2 233 | 0x117f:MSTORE 234 | 0x1180:PUSH1 0x20 235 | 0x1182:ADD 236 | 0x1183:SWAP1 237 | 0x1184:DUP2 238 | 0x1185:MSTORE 239 | 0x1186:PUSH1 0x20 240 | 0x1188:ADD 241 | 0x1189:PUSH1 0x0 242 | 0x118b:SHA3 243 | 0x118c:SLOAD 244 | 0x118d:PUSH1 0x4 245 | 0x118f:PUSH1 0x0 246 | 0x1191:DUP6 247 | 0x1192:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 248 | 0x11a7:AND 249 | 0x11a8:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 250 | 0x11bd:AND 251 | 0x11be:DUP2 252 | 0x11bf:MSTORE 253 | 0x11c0:PUSH1 0x20 254 | 0x11c2:ADD 255 | 0x11c3:SWAP1 256 | 0x11c4:DUP2 257 | 0x11c5:MSTORE 258 | 0x11c6:PUSH1 0x20 259 | 0x11c8:ADD 260 | 0x11c9:PUSH1 0x0 261 | 0x11cb:SHA3 262 | 0x11cc:SLOAD 263 | 0x11cd:PUSH1 0x9 264 | 0x11cf:SLOAD 265 | 0x11d0:MUL 266 | 0x11d1:SUB 267 | 0x11d2:DUP2 268 | 0x11d3:ISZERO 269 | 0x11d4:ISZERO 270 | 0x11d5:PUSH2 0x11da 271 | 0x11d8:JUMPI"] 272 | 4416 -> 4569 273 | 4416 -> 4570 274 | 4569[label="0x11d9:INVALID"] 275 | 4570[label="0x11da:JUMPDEST 276 | 0x11db:DIV 277 | 0x11dc:SWAP1 278 | 0x11dd:POP 279 | 0x11de:SWAP2 280 | 0x11df:SWAP1 281 | 0x11e0:POP 282 | 0x11e1:JUMP"] 283 | 4570 -> 5549 284 | 4570 -> 5471 285 | 5549[label="0x15ad:JUMPDEST 286 | 0x15ae:ADD"] 287 | 5549 -> 5551 288 | 5551[label="0x15af:JUMPDEST 289 | 0x15b0:SWAP2 290 | 0x15b1:POP 291 | 0x15b2:POP 292 | 0x15b3:SWAP2 293 | 0x15b4:SWAP1 294 | 0x15b5:POP 295 | 0x15b6:JUMP"] 296 | 5551 -> 6593 297 | 5551 -> 4946 298 | 5471[label="0x155f:JUMPDEST 299 | 0x1560:PUSH2 0x15af 300 | 0x1563:JUMP"] 301 | 5471 -> 5551 302 | 6593[label="0x19c1:JUMPDEST 303 | 0x19c2:GT 304 | 0x19c3:ISZERO 305 | 0x19c4:PUSH2 0x19d0 306 | 0x19c7:JUMPI"] 307 | 6593 -> 6600 308 | 6593 -> 6608 309 | 6600[label="0x19c8:PUSH2 0x19cf 310 | 0x19cb:PUSH2 0x1343 311 | 0x19ce:JUMP"] 312 | 6600 -> 4931 313 | 4931[label="0x1343:JUMPDEST 314 | 0x1344:PUSH1 0x0 315 | 0x1346:DUP1 316 | 0x1347:PUSH1 0x0 317 | 0x1349:PUSH2 0x1352 318 | 0x134c:PUSH1 0x1 319 | 0x134e:PUSH2 0x154b 320 | 0x1351:JUMP"] 321 | 4931 -> 5451 322 | 6608[label="0x19d0:JUMPDEST 323 | 0x19d1:PUSH2 0x19de 324 | 0x19d4:DUP7 325 | 0x19d5:PUSH1 0x5 326 | 0x19d7:PUSH1 0xff 327 | 0x19d9:AND 328 | 0x19da:PUSH2 0x21e1 329 | 0x19dd:JUMP"] 330 | 6608 -> 8673 331 | 8673[label="0x21e1:JUMPDEST 332 | 0x21e2:PUSH1 0x0 333 | 0x21e4:DUP1 334 | 0x21e5:DUP3 335 | 0x21e6:DUP5 336 | 0x21e7:DUP2 337 | 0x21e8:ISZERO 338 | 0x21e9:ISZERO 339 | 0x21ea:PUSH2 0x21ef 340 | 0x21ed:JUMPI"] 341 | 8673 -> 8686 342 | 8673 -> 8687 343 | 8686[label="0x21ee:INVALID"] 344 | 4946[label="0x1352:JUMPDEST 345 | 0x1353:GT 346 | 0x1354:ISZERO 347 | 0x1355:ISZERO 348 | 0x1356:PUSH2 0x135e 349 | 0x1359:JUMPI"] 350 | 4946 -> 4954 351 | 4946 -> 4958 352 | 4954[label="0x135a:PUSH1 0x0 353 | 0x135c:DUP1 354 | 0x135d:REVERT"] 355 | 8687[label="0x21ef:JUMPDEST 356 | 0x21f0:DIV 357 | 0x21f1:SWAP1 358 | 0x21f2:POP 359 | 0x21f3:DUP1 360 | 0x21f4:SWAP2 361 | 0x21f5:POP 362 | 0x21f6:POP 363 | 0x21f7:SWAP3 364 | 0x21f8:SWAP2 365 | 0x21f9:POP 366 | 0x21fa:POP 367 | 0x21fb:JUMP"] 368 | 8687 -> 6622 369 | 4958[label="0x135e:JUMPDEST 370 | 0x135f:CALLER 371 | 0x1360:SWAP2 372 | 0x1361:POP 373 | 0x1362:PUSH2 0x136b 374 | 0x1365:PUSH1 0x0 375 | 0x1367:PUSH2 0x154b 376 | 0x136a:JUMP"] 377 | 4958 -> 5451 378 | 6622[label="0x19de:JUMPDEST 379 | 0x19df:SWAP3 380 | 0x19e0:POP 381 | 0x19e1:PUSH2 0x19ea 382 | 0x19e4:DUP7 383 | 0x19e5:DUP5 384 | 0x19e6:PUSH2 0x21fc 385 | 0x19e9:JUMP"] 386 | 6622 -> 8700 387 | 8700[label="0x21fc:JUMPDEST 388 | 0x21fd:PUSH1 0x0 389 | 0x21ff:DUP3 390 | 0x2200:DUP3 391 | 0x2201:GT 392 | 0x2202:ISZERO 393 | 0x2203:ISZERO 394 | 0x2204:ISZERO 395 | 0x2205:PUSH2 0x220a 396 | 0x2208:JUMPI"] 397 | 8700 -> 8713 398 | 8700 -> 8714 399 | 8713[label="0x2209:INVALID"] 400 | 8714[label="0x220a:JUMPDEST 401 | 0x220b:DUP2 402 | 0x220c:DUP4 403 | 0x220d:SUB 404 | 0x220e:SWAP1 405 | 0x220f:POP 406 | 0x2210:SWAP3 407 | 0x2211:SWAP2 408 | 0x2212:POP 409 | 0x2213:POP 410 | 0x2214:JUMP"] 411 | 8714 -> 6634 412 | 8714 -> 9014 413 | 6634[label="0x19ea:JUMPDEST 414 | 0x19eb:SWAP2 415 | 0x19ec:POP 416 | 0x19ed:PUSH2 0x19f5 417 | 0x19f0:DUP4 418 | 0x19f1:PUSH2 0x22a2 419 | 0x19f4:JUMP"] 420 | 6634 -> 8866 421 | 8866[label="0x22a2:JUMPDEST 422 | 0x22a3:PUSH1 0x0 423 | 0x22a5:DUP1 424 | 0x22a6:PUSH1 0x0 425 | 0x22a8:DUP1 426 | 0x22a9:PUSH8 0xde0b6b3a7640000 427 | 0x22b2:DUP6 428 | 0x22b3:ADD 429 | 0x22b4:SWAP3 430 | 0x22b5:POP 431 | 0x22b6:PUSH8 0xde0b6b3a7640000 432 | 0x22bf:PUSH1 0x8 433 | 0x22c1:SLOAD 434 | 0x22c2:ADD 435 | 0x22c3:SWAP2 436 | 0x22c4:POP 437 | 0x22c5:PUSH8 0xde0b6b3a7640000 438 | 0x22ce:PUSH2 0x2336 439 | 0x22d1:PUSH8 0xde0b6b3a7640000 440 | 0x22da:DUP6 441 | 0x22db:SUB 442 | 0x22dc:PUSH5 0x2540be400 443 | 0x22e2:PUSH8 0xde0b6b3a7640000 444 | 0x22eb:DUP7 445 | 0x22ec:DUP2 446 | 0x22ed:ISZERO 447 | 0x22ee:ISZERO 448 | 0x22ef:PUSH2 0x22f4 449 | 0x22f2:JUMPI"] 450 | 8866 -> 8947 451 | 8866 -> 8948 452 | 8947[label="0x22f3:INVALID"] 453 | 8948[label="0x22f4:JUMPDEST 454 | 0x22f5:DIV 455 | 0x22f6:PUSH5 0x2540be400 456 | 0x22fc:MUL 457 | 0x22fd:PUSH5 0x174876e800 458 | 0x2303:ADD 459 | 0x2304:SUB 460 | 0x2305:MUL 461 | 0x2306:PUSH1 0x2 462 | 0x2308:PUSH8 0xde0b6b3a7640000 463 | 0x2311:DUP8 464 | 0x2312:PUSH1 0x2 465 | 0x2314:DUP10 466 | 0x2315:EXP 467 | 0x2316:SUB 468 | 0x2317:DUP2 469 | 0x2318:ISZERO 470 | 0x2319:ISZERO 471 | 0x231a:PUSH2 0x231f 472 | 0x231d:JUMPI"] 473 | 8948 -> 8990 474 | 8948 -> 8991 475 | 8990[label="0x231e:INVALID"] 476 | 8991[label="0x231f:JUMPDEST 477 | 0x2320:DIV 478 | 0x2321:PUSH5 0x2540be400 479 | 0x2327:MUL 480 | 0x2328:DUP2 481 | 0x2329:ISZERO 482 | 0x232a:ISZERO 483 | 0x232b:PUSH2 0x2330 484 | 0x232e:JUMPI"] 485 | 8991 -> 9007 486 | 8991 -> 9008 487 | 9007[label="0x232f:INVALID"] 488 | 9008[label="0x2330:JUMPDEST 489 | 0x2331:DIV 490 | 0x2332:PUSH2 0x21fc 491 | 0x2335:JUMP"] 492 | 9008 -> 8700 493 | 9014[label="0x2336:JUMPDEST 494 | 0x2337:DUP2 495 | 0x2338:ISZERO 496 | 0x2339:ISZERO 497 | 0x233a:PUSH2 0x233f 498 | 0x233d:JUMPI"] 499 | 9014 -> 9022 500 | 9014 -> 9023 501 | 9022[label="0x233e:INVALID"] 502 | 9023[label="0x233f:JUMPDEST 503 | 0x2340:DIV 504 | 0x2341:SWAP1 505 | 0x2342:POP 506 | 0x2343:DUP1 507 | 0x2344:SWAP4 508 | 0x2345:POP 509 | 0x2346:POP 510 | 0x2347:POP 511 | 0x2348:POP 512 | 0x2349:SWAP2 513 | 0x234a:SWAP1 514 | 0x234b:POP 515 | 0x234c:JUMP"] 516 | 9023 -> 1711 517 | 9023 -> 6645 518 | 9023 -> 6607 519 | 6607[label="0x19cf:JUMPDEST"] 520 | 6607 -> 6608 521 | 6645[label="0x19f5:JUMPDEST 522 | 0x19f6:SWAP1 523 | 0x19f7:POP 524 | 0x19f8:PUSH2 0x1a03 525 | 0x19fb:PUSH1 0x8 526 | 0x19fd:SLOAD 527 | 0x19fe:DUP5 528 | 0x19ff:PUSH2 0x21fc 529 | 0x1a02:JUMP"] 530 | 6645 -> 8700 531 | 1711[label="0x6af:JUMPDEST 532 | 0x6b0:PUSH1 0x40 533 | 0x6b2:MLOAD 534 | 0x6b3:DUP1 535 | 0x6b4:DUP3 536 | 0x6b5:ISZERO 537 | 0x6b6:ISZERO 538 | 0x6b7:ISZERO 539 | 0x6b8:ISZERO 540 | 0x6b9:DUP2 541 | 0x6ba:MSTORE 542 | 0x6bb:PUSH1 0x20 543 | 0x6bd:ADD 544 | 0x6be:SWAP2 545 | 0x6bf:POP 546 | 0x6c0:POP 547 | 0x6c1:PUSH1 0x40 548 | 0x6c3:MLOAD 549 | 0x6c4:DUP1 550 | 0x6c5:SWAP2 551 | 0x6c6:SUB 552 | 0x6c7:SWAP1 553 | 0x6c8:RETURN"] 554 | 555 | } -------------------------------------------------------------------------------- /tests/expected-fomo3d-output/fomo3d.evm_withdraw().dot: -------------------------------------------------------------------------------- 1 | digraph{ 2 | 948[label="0x3b4:JUMPDEST 3 | 0x3b5:CALLVALUE 4 | 0x3b6:DUP1 5 | 0x3b7:ISZERO 6 | 0x3b8:PUSH2 0x3c0 7 | 0x3bb:JUMPI"] 8 | 948 -> 956 9 | 948 -> 960 10 | 956[label="0x3bc:PUSH1 0x0 11 | 0x3be:DUP1 12 | 0x3bf:REVERT"] 13 | 960[label="0x3c0:JUMPDEST 14 | 0x3c1:POP 15 | 0x3c2:PUSH2 0x3c9 16 | 0x3c5:PUSH2 0x1343 17 | 0x3c8:JUMP"] 18 | 960 -> 4931 19 | 4931[label="0x1343:JUMPDEST 20 | 0x1344:PUSH1 0x0 21 | 0x1346:DUP1 22 | 0x1347:PUSH1 0x0 23 | 0x1349:PUSH2 0x1352 24 | 0x134c:PUSH1 0x1 25 | 0x134e:PUSH2 0x154b 26 | 0x1351:JUMP"] 27 | 4931 -> 5451 28 | 5451[label="0x154b:JUMPDEST 29 | 0x154c:PUSH1 0x0 30 | 0x154e:DUP1 31 | 0x154f:CALLER 32 | 0x1550:SWAP1 33 | 0x1551:POP 34 | 0x1552:DUP3 35 | 0x1553:PUSH2 0x1564 36 | 0x1556:JUMPI"] 37 | 5451 -> 5463 38 | 5451 -> 5476 39 | 5463[label="0x1557:PUSH2 0x155f 40 | 0x155a:DUP2 41 | 0x155b:PUSH2 0x1140 42 | 0x155e:JUMP"] 43 | 5463 -> 4416 44 | 5476[label="0x1564:JUMPDEST 45 | 0x1565:PUSH1 0x5 46 | 0x1567:PUSH1 0x0 47 | 0x1569:DUP3 48 | 0x156a:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 49 | 0x157f:AND 50 | 0x1580:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 51 | 0x1595:AND 52 | 0x1596:DUP2 53 | 0x1597:MSTORE 54 | 0x1598:PUSH1 0x20 55 | 0x159a:ADD 56 | 0x159b:SWAP1 57 | 0x159c:DUP2 58 | 0x159d:MSTORE 59 | 0x159e:PUSH1 0x20 60 | 0x15a0:ADD 61 | 0x15a1:PUSH1 0x0 62 | 0x15a3:SHA3 63 | 0x15a4:SLOAD 64 | 0x15a5:PUSH2 0x15ad 65 | 0x15a8:DUP3 66 | 0x15a9:PUSH2 0x1140 67 | 0x15ac:JUMP"] 68 | 5476 -> 4416 69 | 4416[label="0x1140:JUMPDEST 70 | 0x1141:PUSH1 0x0 71 | 0x1143:PUSH9 0x10000000000000000 72 | 0x114d:PUSH1 0x6 73 | 0x114f:PUSH1 0x0 74 | 0x1151:DUP5 75 | 0x1152:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 76 | 0x1167:AND 77 | 0x1168:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 78 | 0x117d:AND 79 | 0x117e:DUP2 80 | 0x117f:MSTORE 81 | 0x1180:PUSH1 0x20 82 | 0x1182:ADD 83 | 0x1183:SWAP1 84 | 0x1184:DUP2 85 | 0x1185:MSTORE 86 | 0x1186:PUSH1 0x20 87 | 0x1188:ADD 88 | 0x1189:PUSH1 0x0 89 | 0x118b:SHA3 90 | 0x118c:SLOAD 91 | 0x118d:PUSH1 0x4 92 | 0x118f:PUSH1 0x0 93 | 0x1191:DUP6 94 | 0x1192:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 95 | 0x11a7:AND 96 | 0x11a8:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 97 | 0x11bd:AND 98 | 0x11be:DUP2 99 | 0x11bf:MSTORE 100 | 0x11c0:PUSH1 0x20 101 | 0x11c2:ADD 102 | 0x11c3:SWAP1 103 | 0x11c4:DUP2 104 | 0x11c5:MSTORE 105 | 0x11c6:PUSH1 0x20 106 | 0x11c8:ADD 107 | 0x11c9:PUSH1 0x0 108 | 0x11cb:SHA3 109 | 0x11cc:SLOAD 110 | 0x11cd:PUSH1 0x9 111 | 0x11cf:SLOAD 112 | 0x11d0:MUL 113 | 0x11d1:SUB 114 | 0x11d2:DUP2 115 | 0x11d3:ISZERO 116 | 0x11d4:ISZERO 117 | 0x11d5:PUSH2 0x11da 118 | 0x11d8:JUMPI"] 119 | 4416 -> 4569 120 | 4416 -> 4570 121 | 4569[label="0x11d9:INVALID"] 122 | 4570[label="0x11da:JUMPDEST 123 | 0x11db:DIV 124 | 0x11dc:SWAP1 125 | 0x11dd:POP 126 | 0x11de:SWAP2 127 | 0x11df:SWAP1 128 | 0x11e0:POP 129 | 0x11e1:JUMP"] 130 | 4570 -> 5549 131 | 4570 -> 5471 132 | 5549[label="0x15ad:JUMPDEST 133 | 0x15ae:ADD"] 134 | 5549 -> 5551 135 | 5551[label="0x15af:JUMPDEST 136 | 0x15b0:SWAP2 137 | 0x15b1:POP 138 | 0x15b2:POP 139 | 0x15b3:SWAP2 140 | 0x15b4:SWAP1 141 | 0x15b5:POP 142 | 0x15b6:JUMP"] 143 | 5551 -> 4946 144 | 5551 -> 969 145 | 5551 -> 4971 146 | 5471[label="0x155f:JUMPDEST 147 | 0x1560:PUSH2 0x15af 148 | 0x1563:JUMP"] 149 | 5471 -> 5551 150 | 4946[label="0x1352:JUMPDEST 151 | 0x1353:GT 152 | 0x1354:ISZERO 153 | 0x1355:ISZERO 154 | 0x1356:PUSH2 0x135e 155 | 0x1359:JUMPI"] 156 | 4946 -> 4954 157 | 4946 -> 4958 158 | 4954[label="0x135a:PUSH1 0x0 159 | 0x135c:DUP1 160 | 0x135d:REVERT"] 161 | 4958[label="0x135e:JUMPDEST 162 | 0x135f:CALLER 163 | 0x1360:SWAP2 164 | 0x1361:POP 165 | 0x1362:PUSH2 0x136b 166 | 0x1365:PUSH1 0x0 167 | 0x1367:PUSH2 0x154b 168 | 0x136a:JUMP"] 169 | 4958 -> 5451 170 | 4971[label="0x136b:JUMPDEST 171 | 0x136c:SWAP1 172 | 0x136d:POP 173 | 0x136e:PUSH9 0x10000000000000000 174 | 0x1378:DUP2 175 | 0x1379:MUL 176 | 0x137a:PUSH1 0x6 177 | 0x137c:PUSH1 0x0 178 | 0x137e:DUP5 179 | 0x137f:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 180 | 0x1394:AND 181 | 0x1395:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 182 | 0x13aa:AND 183 | 0x13ab:DUP2 184 | 0x13ac:MSTORE 185 | 0x13ad:PUSH1 0x20 186 | 0x13af:ADD 187 | 0x13b0:SWAP1 188 | 0x13b1:DUP2 189 | 0x13b2:MSTORE 190 | 0x13b3:PUSH1 0x20 191 | 0x13b5:ADD 192 | 0x13b6:PUSH1 0x0 193 | 0x13b8:SHA3 194 | 0x13b9:PUSH1 0x0 195 | 0x13bb:DUP3 196 | 0x13bc:DUP3 197 | 0x13bd:SLOAD 198 | 0x13be:ADD 199 | 0x13bf:SWAP3 200 | 0x13c0:POP 201 | 0x13c1:POP 202 | 0x13c2:DUP2 203 | 0x13c3:SWAP1 204 | 0x13c4:SSTORE 205 | 0x13c5:POP 206 | 0x13c6:PUSH1 0x5 207 | 0x13c8:PUSH1 0x0 208 | 0x13ca:DUP4 209 | 0x13cb:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 210 | 0x13e0:AND 211 | 0x13e1:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 212 | 0x13f6:AND 213 | 0x13f7:DUP2 214 | 0x13f8:MSTORE 215 | 0x13f9:PUSH1 0x20 216 | 0x13fb:ADD 217 | 0x13fc:SWAP1 218 | 0x13fd:DUP2 219 | 0x13fe:MSTORE 220 | 0x13ff:PUSH1 0x20 221 | 0x1401:ADD 222 | 0x1402:PUSH1 0x0 223 | 0x1404:SHA3 224 | 0x1405:SLOAD 225 | 0x1406:DUP2 226 | 0x1407:ADD 227 | 0x1408:SWAP1 228 | 0x1409:POP 229 | 0x140a:PUSH1 0x0 230 | 0x140c:PUSH1 0x5 231 | 0x140e:PUSH1 0x0 232 | 0x1410:DUP5 233 | 0x1411:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 234 | 0x1426:AND 235 | 0x1427:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 236 | 0x143c:AND 237 | 0x143d:DUP2 238 | 0x143e:MSTORE 239 | 0x143f:PUSH1 0x20 240 | 0x1441:ADD 241 | 0x1442:SWAP1 242 | 0x1443:DUP2 243 | 0x1444:MSTORE 244 | 0x1445:PUSH1 0x20 245 | 0x1447:ADD 246 | 0x1448:PUSH1 0x0 247 | 0x144a:SHA3 248 | 0x144b:DUP2 249 | 0x144c:SWAP1 250 | 0x144d:SSTORE 251 | 0x144e:POP 252 | 0x144f:DUP2 253 | 0x1450:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 254 | 0x1465:AND 255 | 0x1466:PUSH2 0x8fc 256 | 0x1469:DUP3 257 | 0x146a:SWAP1 258 | 0x146b:DUP2 259 | 0x146c:ISZERO 260 | 0x146d:MUL 261 | 0x146e:SWAP1 262 | 0x146f:PUSH1 0x40 263 | 0x1471:MLOAD 264 | 0x1472:PUSH1 0x0 265 | 0x1474:PUSH1 0x40 266 | 0x1476:MLOAD 267 | 0x1477:DUP1 268 | 0x1478:DUP4 269 | 0x1479:SUB 270 | 0x147a:DUP2 271 | 0x147b:DUP6 272 | 0x147c:DUP9 273 | 0x147d:DUP9 274 | 0x147e:CALL 275 | 0x147f:SWAP4 276 | 0x1480:POP 277 | 0x1481:POP 278 | 0x1482:POP 279 | 0x1483:POP 280 | 0x1484:ISZERO 281 | 0x1485:DUP1 282 | 0x1486:ISZERO 283 | 0x1487:PUSH2 0x1494 284 | 0x148a:JUMPI"] 285 | 4971 -> 5259 286 | 4971 -> 5268 287 | 5259[label="0x148b:RETURNDATASIZE 288 | 0x148c:PUSH1 0x0 289 | 0x148e:DUP1 290 | 0x148f:RETURNDATACOPY 291 | 0x1490:RETURNDATASIZE 292 | 0x1491:PUSH1 0x0 293 | 0x1493:REVERT"] 294 | 969[label="0x3c9:JUMPDEST 295 | 0x3ca:STOP"] 296 | 5268[label="0x1494:JUMPDEST 297 | 0x1495:POP 298 | 0x1496:DUP2 299 | 0x1497:PUSH20 0xffffffffffffffffffffffffffffffffffffffff 300 | 0x14ac:AND 301 | 0x14ad:PUSH32 0xccad973dcd043c7d680389db4378bd6b9775db7124092e9e0422c9e46d7985dc 302 | 0x14ce:DUP3 303 | 0x14cf:PUSH1 0x40 304 | 0x14d1:MLOAD 305 | 0x14d2:DUP1 306 | 0x14d3:DUP3 307 | 0x14d4:DUP2 308 | 0x14d5:MSTORE 309 | 0x14d6:PUSH1 0x20 310 | 0x14d8:ADD 311 | 0x14d9:SWAP2 312 | 0x14da:POP 313 | 0x14db:POP 314 | 0x14dc:PUSH1 0x40 315 | 0x14de:MLOAD 316 | 0x14df:DUP1 317 | 0x14e0:SWAP2 318 | 0x14e1:SUB 319 | 0x14e2:SWAP1 320 | 0x14e3:LOG2 321 | 0x14e4:POP 322 | 0x14e5:POP 323 | 0x14e6:JUMP"] 324 | 5268 -> 969 325 | 326 | } -------------------------------------------------------------------------------- /tests/fomo3d.evm: -------------------------------------------------------------------------------- 1 | 0x608060405260043610610169576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806265318b1461017757806306fdde03146101ce57806310d0ffdd1461025e57806318160ddd1461029f57806322609373146102ca57806327defa1f1461030b578063313ce5671461033a578063392efb521461036b5780633ccfd60b146103b45780634b750334146103cb57806356d399e8146103f6578063688abbf7146104215780636b2f46321461046457806370a082311461048f5780638328b610146104e65780638620410b1461051357806389135ae91461053e5780638fea64bd1461057b578063949e8acd1461059257806395d89b41146105bd578063a8e04f341461064d578063a9059cbb14610664578063b84c8246146106c9578063c47f002714610732578063e4849b321461079b578063e9fad8ee146107c8578063f088d547146107df578063fdb5a03e14610829575b610174346000610840565b50005b34801561018357600080fd5b506101b8600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611140565b6040518082815260200191505060405180910390f35b3480156101da57600080fd5b506101e36111e2565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610223578082015181840152602081019050610208565b50505050905090810190601f1680156102505780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561026a57600080fd5b5061028960048036038101908080359060200190929190505050611280565b6040518082815260200191505060405180910390f35b3480156102ab57600080fd5b506102b46112b8565b6040518082815260200191505060405180910390f35b3480156102d657600080fd5b506102f5600480360381019080803590602001909291905050506112c2565b6040518082815260200191505060405180910390f35b34801561031757600080fd5b5061032061130b565b604051808215151515815260200191505060405180910390f35b34801561034657600080fd5b5061034f61131e565b604051808260ff1660ff16815260200191505060405180910390f35b34801561037757600080fd5b5061039a6004803603810190808035600019169060200190929190505050611323565b604051808215151515815260200191505060405180910390f35b3480156103c057600080fd5b506103c9611343565b005b3480156103d757600080fd5b506103e06114e7565b6040518082815260200191505060405180910390f35b34801561040257600080fd5b5061040b611545565b6040518082815260200191505060405180910390f35b34801561042d57600080fd5b5061044e60048036038101908080351515906020019092919050505061154b565b6040518082815260200191505060405180910390f35b34801561047057600080fd5b506104796115b7565b6040518082815260200191505060405180910390f35b34801561049b57600080fd5b506104d0600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506115d6565b6040518082815260200191505060405180910390f35b3480156104f257600080fd5b506105116004803603810190808035906020019092919050505061161f565b005b34801561051f57600080fd5b506105286116b3565b6040518082815260200191505060405180910390f35b34801561054a57600080fd5b506105796004803603810190808035600019169060200190929190803515159060200190929190505050611711565b005b34801561058757600080fd5b506105906117d2565b005b34801561059e57600080fd5b506105a76117d4565b6040518082815260200191505060405180910390f35b3480156105c957600080fd5b506105d26117e9565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156106125780820151818401526020810190506105f7565b50505050905090810190601f16801561063f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561065957600080fd5b50610662611887565b005b34801561067057600080fd5b506106af600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061192e565b604051808215151515815260200191505060405180910390f35b3480156106d557600080fd5b50610730600480360381019080803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050611c60565b005b34801561073e57600080fd5b50610799600480360381019080803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050611d04565b005b3480156107a757600080fd5b506107c660048036038101908080359060200190929190505050611da8565b005b3480156107d457600080fd5b506107dd611fd6565b005b610813600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061203d565b6040518082815260200191505060405180910390f35b34801561083557600080fd5b5061083e61204f565b005b60008060008060008060008060008a6000339050600b60009054906101000a900460ff16801561088257506801158e460913d000008261087e6115b7565b0311155b15610d705760011515600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151480156109305750670de0b6b3a764000082600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020540111155b151561093b57600080fd5b610984600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054836121c3565b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503399506109d88d600560ff166121e1565b98506109e58960036121e1565b97506109f189896121fc565b96506109fd8d8a6121fc565b9550610a0886612215565b94506801000000000000000087029350600085118015610a345750600854610a32866008546121c3565b115b1515610a3f57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff1614158015610aa857508973ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff1614155b8015610af55750600254600460008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410155b15610b8b57610b43600560008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054896121c3565b600560008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610ba6565b610b9587896121c3565b965068010000000000000000870293505b60006008541115610c1157610bbd600854866121c3565b600881905550600854680100000000000000008802811515610bdb57fe5b04600960008282540192505081905550600854680100000000000000008802811515610c0357fe5b048502840384039350610c19565b846008819055505b610c62600460008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054866121c3565b600460008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555083856009540203925082600660008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508b73ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167f022c0d992e4d873a3748436d960d5140c1f9721cf73f7ca5ec679d3d9f4fe2d58f88604051808381526020018281526020019250505060405180910390a3849a50611130565b6000600b60006101000a81548160ff021916908315150217905550339950610d9c8d600560ff166121e1565b9850610da98960036121e1565b9750610db589896121fc565b9650610dc18d8a6121fc565b9550610dcc86612215565b94506801000000000000000087029350600085118015610df85750600854610df6866008546121c3565b115b1515610e0357600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff1614158015610e6c57508973ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff1614155b8015610eb95750600254600460008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410155b15610f4f57610f07600560008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054896121c3565b600560008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610f6a565b610f5987896121c3565b965068010000000000000000870293505b60006008541115610fd557610f81600854866121c3565b600881905550600854680100000000000000008802811515610f9f57fe5b04600960008282540192505081905550600854680100000000000000008802811515610fc757fe5b048502840384039350610fdd565b846008819055505b611026600460008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054866121c3565b600460008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555083856009540203925082600660008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508b73ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167f022c0d992e4d873a3748436d960d5140c1f9721cf73f7ca5ec679d3d9f4fe2d58f88604051808381526020018281526020019250505060405180910390a3849a505b5050505050505050505092915050565b600068010000000000000000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460095402038115156111da57fe5b049050919050565b60008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156112785780601f1061124d57610100808354040283529160200191611278565b820191906000526020600020905b81548152906001019060200180831161125b57829003601f168201915b505050505081565b60008060008061129485600560ff166121e1565b92506112a085846121fc565b91506112ab82612215565b9050809350505050919050565b6000600854905090565b60008060008060085485111515156112d957600080fd5b6112e2856122a2565b92506112f283600560ff166121e1565b91506112fe83836121fc565b9050809350505050919050565b600b60009054906101000a900460ff1681565b601281565b600a6020528060005260406000206000915054906101000a900460ff1681565b6000806000611352600161154b565b11151561135e57600080fd5b33915061136b600061154b565b9050680100000000000000008102600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054810190506000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611494573d6000803e3d6000fd5b508173ffffffffffffffffffffffffffffffffffffffff167fccad973dcd043c7d680389db4378bd6b9775db7124092e9e0422c9e46d7985dc826040518082815260200191505060405180910390a25050565b6000806000806000600854141561150c576402540be40064174876e80003935061153f565b61151d670de0b6b3a76400006122a2565b925061152d83600560ff166121e1565b915061153983836121fc565b90508093505b50505090565b60025481565b600080339050826115645761155f81611140565b6115af565b600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546115ad82611140565b015b915050919050565b60003073ffffffffffffffffffffffffffffffffffffffff1631905090565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000339050600a600082604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140191505060405180910390206000191660001916815260200190815260200160002060009054906101000a900460ff1615156116a857600080fd5b816002819055505050565b600080600080600060085414156116d8576402540be40064174876e80001935061170b565b6116e9670de0b6b3a76400006122a2565b92506116f983600560ff166121e1565b915061170583836121c3565b90508093505b50505090565b6000339050600a600082604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140191505060405180910390206000191660001916815260200190815260200160002060009054906101000a900460ff16151561179a57600080fd5b81600a6000856000191660001916815260200190815260200160002060006101000a81548160ff021916908315150217905550505050565b565b6000803390506117e3816115d6565b91505090565b60018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561187f5780601f106118545761010080835404028352916020019161187f565b820191906000526020600020905b81548152906001019060200180831161186257829003601f168201915b505050505081565b6000339050600a600082604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140191505060405180910390206000191660001916815260200190815260200160002060009054906101000a900460ff16151561191057600080fd5b6000600b60006101000a81548160ff02191690831515021790555050565b60008060008060008061193f6117d4565b11151561194b57600080fd5b339350600b60009054906101000a900460ff161580156119aa5750600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548611155b15156119b557600080fd5b60006119c1600161154b565b11156119d0576119cf611343565b5b6119de86600560ff166121e1565b92506119ea86846121fc565b91506119f5836122a2565b9050611a03600854846121fc565b600881905550611a52600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054876121fc565b600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611ade600460008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054836121c3565b600460008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560095402600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055508160095402600660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550611be7600954600854680100000000000000008402811515611be157fe5b046121c3565b6009819055508673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600194505050505092915050565b6000339050600a600082604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140191505060405180910390206000191660001916815260200190815260200160002060009054906101000a900460ff161515611ce957600080fd5b8160019080519060200190611cff929190612398565b505050565b6000339050600a600082604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140191505060405180910390206000191660001916815260200190815260200160002060009054906101000a900460ff161515611d8d57600080fd5b8160009080519060200190611da3929190612398565b505050565b6000806000806000806000611dbb6117d4565b111515611dc757600080fd5b339550600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548711151515611e1857600080fd5b869450611e24856122a2565b9350611e3484600560ff166121e1565b9250611e4084846121fc565b9150611e4e600854866121fc565b600881905550611e9d600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054866121fc565b600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550680100000000000000008202856009540201905080600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555060006008541115611f7757611f70600954600854680100000000000000008602811515611f6a57fe5b046121c3565b6009819055505b8573ffffffffffffffffffffffffffffffffffffffff167fc4823739c5787d2ca17e404aa47d5569ae71dfb49cbf21b3f6152ed238a311398684604051808381526020018281526020019250505060405180910390a250505050505050565b600080339150600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008111156120315761203081611da8565b5b612039611343565b5050565b60006120493483610840565b50919050565b60008060008061205f600161154b565b11151561206b57600080fd5b612075600061154b565b9250339150680100000000000000008302600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054830192506000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612166836000610840565b90508173ffffffffffffffffffffffffffffffffffffffff167fbe339fc14b041c2b0e0f3dd2cd325d0c3668b78378001e53160eab36153264588483604051808381526020018281526020019250505060405180910390a2505050565b60008082840190508381101515156121d757fe5b8091505092915050565b60008082848115156121ef57fe5b0490508091505092915050565b600082821115151561220a57fe5b818303905092915050565b6000806000670de0b6b3a764000064174876e8000291506008546402540be40061228b612285600854866402540be400600202020260026008540a60026402540be4000a02670de0b6b3a76400008a02670de0b6b3a76400006402540be40002600202026002890a01010161234d565b856121fc565b81151561229457fe5b040390508092505050919050565b600080600080670de0b6b3a764000085019250670de0b6b3a7640000600854019150670de0b6b3a7640000612336670de0b6b3a764000085036402540be400670de0b6b3a7640000868115156122f457fe5b046402540be4000264174876e8000103026002670de0b6b3a7640000876002890a0381151561231f57fe5b046402540be4000281151561233057fe5b046121fc565b81151561233f57fe5b049050809350505050919050565b60008060026001840181151561235f57fe5b0490508291505b8181101561239257809150600281828581151561237f57fe5b040181151561238a57fe5b049050612366565b50919050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106123d957805160ff1916838001178555612407565b82800160010185558215612407579182015b828111156124065782518255916020019190600101906123eb565b5b5090506124149190612418565b5090565b61243a91905b8082111561243657600081600090555060010161241e565b5090565b905600a165627a7a72305820b7b46b4c1b384b7da3ee64c832aab16687a7dd64aba062038078421ecfdef3ef0029 2 | -------------------------------------------------------------------------------- /tests/recurse.evm: -------------------------------------------------------------------------------- 1 | 0x6080604052600436106053576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680639942ec6f146067578063a585047514607b578063c27fc30514608f575b348015605e57600080fd5b50606560a3565b005b348015607257600080fd5b50607960a3565b005b348015608657600080fd5b50608d60b1565b005b348015609a57600080fd5b5060a160b3565b005b60a960b1565b60af60b3565b565b565b60b960b1565b5600a165627a7a72305820ac7628336dfe0bb0586141b2f21b082e41c5f285a54d029561b0d8f6e91fcdec0029 2 | -------------------------------------------------------------------------------- /tests/recurse.sol: -------------------------------------------------------------------------------- 1 | contract C{ 2 | 3 | function f0(){ 4 | 5 | } 6 | 7 | function f1(){ 8 | f0(); 9 | } 10 | 11 | function f2(){ 12 | f0(); 13 | f1(); 14 | } 15 | 16 | function (){ 17 | f2(); 18 | } 19 | } 20 | --------------------------------------------------------------------------------