#
tokens: 47986/50000 5/1140 files (page 92/103)
lines: on (toggle) GitHub
raw markdown copy reset
This is page 92 of 103. Use http://codebase.md/cyfrin/aderyn?lines=true&page={x} to view the full context.

# Directory Structure

```
├── .cargo
│   └── config.toml
├── .git-blame-ignore-revs
├── .gitattributes
├── .github
│   ├── images
│   │   ├── aderyn_logo.png
│   │   ├── poweredbycyfrinblack.png
│   │   └── poweredbycyfrinblue.png
│   ├── ISSUE_TEMPLATE
│   │   ├── bug_report.md
│   │   ├── false_positive_issue.md
│   │   └── feature_request.md
│   └── workflows
│       ├── cargo.yml
│       ├── dependencies.yml
│       ├── release.yml
│       ├── reports.yml
│       └── toml.yml
├── .gitignore
├── .gitmodules
├── .vscode
│   └── settings.json
├── aderyn
│   ├── Cargo.toml
│   ├── oranda.json
│   ├── README.md
│   ├── src
│   │   ├── birdsong.rs
│   │   ├── completions.rs
│   │   ├── lib.rs
│   │   ├── lsp.rs
│   │   ├── main.rs
│   │   ├── mcp.rs
│   │   └── panic.rs
│   └── templates
│       └── aderyn.toml
├── aderyn_core
│   ├── .gitignore
│   ├── Cargo.toml
│   ├── README.md
│   ├── src
│   │   ├── ast
│   │   │   ├── ast_nodes.rs
│   │   │   ├── ast.rs
│   │   │   ├── impls
│   │   │   │   ├── ctx
│   │   │   │   │   ├── utils.rs
│   │   │   │   │   └── workspace.rs
│   │   │   │   ├── ctx.rs
│   │   │   │   ├── disp
│   │   │   │   │   ├── blocks.rs
│   │   │   │   │   ├── contracts.rs
│   │   │   │   │   ├── enumerations.rs
│   │   │   │   │   ├── errors.rs
│   │   │   │   │   ├── events.rs
│   │   │   │   │   ├── expressions.rs
│   │   │   │   │   ├── functions.rs
│   │   │   │   │   ├── identifiers.rs
│   │   │   │   │   ├── literals.rs
│   │   │   │   │   ├── modifiers.rs
│   │   │   │   │   ├── statements.rs
│   │   │   │   │   ├── structures.rs
│   │   │   │   │   ├── types.rs
│   │   │   │   │   ├── user_defined_value_types.rs
│   │   │   │   │   ├── using_for_directives.rs
│   │   │   │   │   └── variables.rs
│   │   │   │   ├── disp.rs
│   │   │   │   ├── node
│   │   │   │   │   ├── blocks.rs
│   │   │   │   │   ├── contracts.rs
│   │   │   │   │   ├── documentation.rs
│   │   │   │   │   ├── enumerations.rs
│   │   │   │   │   ├── errors.rs
│   │   │   │   │   ├── events.rs
│   │   │   │   │   ├── expressions.rs
│   │   │   │   │   ├── functions.rs
│   │   │   │   │   ├── identifiers.rs
│   │   │   │   │   ├── import_directives.rs
│   │   │   │   │   ├── literals.rs
│   │   │   │   │   ├── modifiers.rs
│   │   │   │   │   ├── pragma_directives.rs
│   │   │   │   │   ├── source_units.rs
│   │   │   │   │   ├── statements.rs
│   │   │   │   │   ├── structures.rs
│   │   │   │   │   ├── types.rs
│   │   │   │   │   ├── user_defined_value_types.rs
│   │   │   │   │   ├── using_for_directives.rs
│   │   │   │   │   └── variables.rs
│   │   │   │   ├── node.rs
│   │   │   │   ├── own
│   │   │   │   │   ├── hashing.rs
│   │   │   │   │   ├── node_id.rs
│   │   │   │   │   ├── source_units.rs
│   │   │   │   │   └── utils.rs
│   │   │   │   └── own.rs
│   │   │   ├── impls.rs
│   │   │   ├── macros.rs
│   │   │   ├── magic.rs
│   │   │   ├── node_type.rs
│   │   │   └── yul.rs
│   │   ├── ast.rs
│   │   ├── audit
│   │   │   ├── attack_surface.rs
│   │   │   ├── auditor.rs
│   │   │   ├── entrypoint.rs
│   │   │   └── public_functions_no_sender.rs
│   │   ├── audit.rs
│   │   ├── context
│   │   │   ├── browser
│   │   │   │   ├── ancestral_line.rs
│   │   │   │   ├── closest_ancestor.rs
│   │   │   │   ├── external_calls.rs
│   │   │   │   ├── extractor.rs
│   │   │   │   ├── immediate_children.rs
│   │   │   │   ├── location.rs
│   │   │   │   ├── macros.rs
│   │   │   │   ├── parent.rs
│   │   │   │   ├── peek_over.rs
│   │   │   │   ├── peek_under.rs
│   │   │   │   ├── peek.rs
│   │   │   │   ├── siblings.rs
│   │   │   │   ├── sort_nodes.rs
│   │   │   │   └── storage_vars.rs
│   │   │   ├── browser.rs
│   │   │   ├── capturable.rs
│   │   │   ├── flow
│   │   │   │   ├── display.rs
│   │   │   │   ├── error.rs
│   │   │   │   ├── kind.rs
│   │   │   │   ├── primitives.rs
│   │   │   │   ├── reducibles.rs
│   │   │   │   ├── tests.rs
│   │   │   │   ├── utils.rs
│   │   │   │   ├── visualizer.rs
│   │   │   │   └── voids.rs
│   │   │   ├── flow.rs
│   │   │   ├── graph
│   │   │   │   ├── callgraph
│   │   │   │   │   ├── legacy.rs
│   │   │   │   │   ├── new.rs
│   │   │   │   │   ├── tests.rs
│   │   │   │   │   ├── utils.rs
│   │   │   │   │   └── visit.rs
│   │   │   │   ├── callgraph.rs
│   │   │   │   ├── preprocess
│   │   │   │   │   ├── legacy.rs
│   │   │   │   │   └── new.rs
│   │   │   │   ├── preprocess.rs
│   │   │   │   ├── traits.rs
│   │   │   │   └── utils.rs
│   │   │   ├── graph.rs
│   │   │   ├── macros.rs
│   │   │   ├── mcp
│   │   │   │   ├── callgraph
│   │   │   │   │   ├── render.rs
│   │   │   │   │   ├── tool.rs
│   │   │   │   │   └── utils.rs
│   │   │   │   ├── callgraph.rs
│   │   │   │   ├── contract_surface
│   │   │   │   │   ├── render.rs
│   │   │   │   │   ├── tool.rs
│   │   │   │   │   └── util.rs
│   │   │   │   ├── contract_surface.rs
│   │   │   │   ├── list_contracts
│   │   │   │   │   ├── render.rs
│   │   │   │   │   └── tool.rs
│   │   │   │   ├── list_contracts.rs
│   │   │   │   ├── node_finder
│   │   │   │   │   ├── render.rs
│   │   │   │   │   ├── tool.rs
│   │   │   │   │   └── utils.rs
│   │   │   │   ├── node_finder.rs
│   │   │   │   ├── node_summarizer
│   │   │   │   │   ├── render.rs
│   │   │   │   │   ├── tool.rs
│   │   │   │   │   └── utils.rs
│   │   │   │   ├── node_summarizer.rs
│   │   │   │   ├── project_overview
│   │   │   │   │   ├── render.rs
│   │   │   │   │   └── tool.rs
│   │   │   │   ├── project_overview.rs
│   │   │   │   ├── tool_guide
│   │   │   │   │   └── tool.rs
│   │   │   │   └── tool_guide.rs
│   │   │   ├── mcp.rs
│   │   │   ├── router
│   │   │   │   ├── external_calls.rs
│   │   │   │   ├── internal_calls.rs
│   │   │   │   ├── modifier_calls.rs
│   │   │   │   └── tests.rs
│   │   │   ├── router.rs
│   │   │   └── workspace.rs
│   │   ├── context.rs
│   │   ├── detect
│   │   │   ├── detector.rs
│   │   │   ├── entrypoint.rs
│   │   │   ├── helpers.rs
│   │   │   ├── high
│   │   │   │   ├── _template.rs
│   │   │   │   ├── abi_encode_packed_hash_collision.rs
│   │   │   │   ├── arbitrary_transfer_from.rs
│   │   │   │   ├── const_func_changes_state.rs
│   │   │   │   ├── contract_locks_ether.rs
│   │   │   │   ├── dangerous_unary_operator.rs
│   │   │   │   ├── delegate_call_unchecked_address.rs
│   │   │   │   ├── delete_nested_mapping.rs
│   │   │   │   ├── dynamic_array_length_assignment.rs
│   │   │   │   ├── enumerable_loop_removal.rs
│   │   │   │   ├── eth_send_unchecked_address.rs
│   │   │   │   ├── experimental_encoder.rs
│   │   │   │   ├── function_selector_collision.rs
│   │   │   │   ├── incorrect_caret_operator.rs
│   │   │   │   ├── incorrect_erc20_interface.rs
│   │   │   │   ├── incorrect_erc721_interface.rs
│   │   │   │   ├── incorrect_shift_order.rs
│   │   │   │   ├── misused_boolean.rs
│   │   │   │   ├── msg_value_in_loops.rs
│   │   │   │   ├── multiple_constructors.rs
│   │   │   │   ├── nested_struct_in_mapping.rs
│   │   │   │   ├── out_of_order_retryable.rs
│   │   │   │   ├── pre_declared_variable_usage.rs
│   │   │   │   ├── reentrancy_state_change.rs
│   │   │   │   ├── reused_contract_name.rs
│   │   │   │   ├── rtlo.rs
│   │   │   │   ├── selfdestruct.rs
│   │   │   │   ├── signed_integer_storage_array.rs
│   │   │   │   ├── state_variable_shadowing.rs
│   │   │   │   ├── storage_array_memory_edit.rs
│   │   │   │   ├── strict_equality_contract_balance.rs
│   │   │   │   ├── tautological_compare.rs
│   │   │   │   ├── tautology_or_contradiction.rs
│   │   │   │   ├── tx_origin_used_for_auth.rs
│   │   │   │   ├── unchecked_low_level_call.rs
│   │   │   │   ├── unchecked_send.rs
│   │   │   │   ├── unprotected_initializer.rs
│   │   │   │   ├── unsafe_casting.rs
│   │   │   │   ├── weak_randomness.rs
│   │   │   │   └── yul_return.rs
│   │   │   ├── high.rs
│   │   │   ├── low
│   │   │   │   ├── _template.rs
│   │   │   │   ├── assert_state_change.rs
│   │   │   │   ├── block_timestamp_deadline.rs
│   │   │   │   ├── boolean_equality.rs
│   │   │   │   ├── builtin_symbol_shadowing.rs
│   │   │   │   ├── centralization_risk.rs
│   │   │   │   ├── constant_function_contains_assembly.rs
│   │   │   │   ├── costly_loop.rs
│   │   │   │   ├── dead_code.rs
│   │   │   │   ├── delegatecall_in_loop.rs
│   │   │   │   ├── deprecated_oz_function.rs
│   │   │   │   ├── division_before_multiplication.rs
│   │   │   │   ├── ecrecover.rs
│   │   │   │   ├── empty_block.rs
│   │   │   │   ├── empty_require_revert.rs
│   │   │   │   ├── function_initializing_state.rs
│   │   │   │   ├── function_pointer_in_constructor.rs
│   │   │   │   ├── inconsistent_type_names.rs
│   │   │   │   ├── incorrect_modifier.rs
│   │   │   │   ├── internal_function_used_once.rs
│   │   │   │   ├── large_numeric_literal.rs
│   │   │   │   ├── literal_instead_of_constant.rs
│   │   │   │   ├── local_variable_shadowing.rs
│   │   │   │   ├── missing_inheritance.rs
│   │   │   │   ├── modifier_used_only_once.rs
│   │   │   │   ├── multiple_placeholders.rs
│   │   │   │   ├── non_reentrant_not_first.rs
│   │   │   │   ├── push_0_opcode.rs
│   │   │   │   ├── redundant_statement.rs
│   │   │   │   ├── require_revert_in_loop.rs
│   │   │   │   ├── return_bomb.rs
│   │   │   │   ├── solmate_safe_transfer_lib.rs
│   │   │   │   ├── state_change_without_event.rs
│   │   │   │   ├── state_no_address_check.rs
│   │   │   │   ├── state_variable_could_be_constant.rs
│   │   │   │   ├── state_variable_could_be_immutable.rs
│   │   │   │   ├── state_variable_read_external.rs
│   │   │   │   ├── storage_array_length_not_cached.rs
│   │   │   │   ├── todo.rs
│   │   │   │   ├── unchecked_return.rs
│   │   │   │   ├── uninitialized_local_variable.rs
│   │   │   │   ├── unsafe_erc20_operation.rs
│   │   │   │   ├── unsafe_oz_erc721_mint.rs
│   │   │   │   ├── unspecific_solidity_pragma.rs
│   │   │   │   ├── unused_error.rs
│   │   │   │   ├── unused_import.rs
│   │   │   │   ├── unused_public_function.rs
│   │   │   │   ├── unused_state_variable.rs
│   │   │   │   └── void_constructor.rs
│   │   │   ├── low.rs
│   │   │   └── test_utils.rs
│   │   ├── detect.rs
│   │   ├── lib.rs
│   │   ├── stats
│   │   │   ├── cloc.rs
│   │   │   ├── dbg_tips.txt
│   │   │   ├── ignore.rs
│   │   │   ├── token.rs
│   │   │   └── util.rs
│   │   ├── stats.rs
│   │   ├── test_utils
│   │   │   └── load_source_unit.rs
│   │   ├── test_utils.rs
│   │   ├── visitor
│   │   │   ├── ast_visitor.rs
│   │   │   ├── macros.rs
│   │   │   └── workspace_visitor.rs
│   │   └── visitor.rs
│   ├── templates
│   │   └── mcp-tool-response
│   │       ├── callgraph.md
│   │       ├── contract_surface.md
│   │       ├── list_contracts.md
│   │       ├── node_finder_get_all.md
│   │       ├── node_finder_grep.md
│   │       ├── node_finder_search.md
│   │       ├── node_summarizer.md
│   │       ├── project_overview.md
│   │       └── tool_guide.md
│   └── tests
│       ├── common
│       │   ├── ancestral_line.rs
│       │   ├── closest_ancestor.rs
│       │   ├── immediate_children.rs
│       │   ├── immediate_parent.rs
│       │   ├── mod.rs
│       │   ├── new_ast_nodes.rs
│       │   ├── peek_over.rs
│       │   └── sibling.rs
│       └── traversal.rs
├── aderyn_driver
│   ├── .gitignore
│   ├── benches
│   │   └── detectors.rs
│   ├── Cargo.toml
│   ├── README.md
│   ├── src
│   │   ├── compile.rs
│   │   ├── config.rs
│   │   ├── display.rs
│   │   ├── driver.rs
│   │   ├── interface
│   │   │   ├── json.rs
│   │   │   ├── lsp.rs
│   │   │   ├── markdown.rs
│   │   │   ├── mod.rs
│   │   │   ├── sarif.rs
│   │   │   ├── tables.rs
│   │   │   └── util.rs
│   │   ├── lib.rs
│   │   ├── mcp.rs
│   │   ├── process.rs
│   │   └── runner.rs
│   └── tests
│       └── astgen.rs
├── bacon.toml
├── benchmarks
│   ├── aderyn
│   │   ├── base
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   ├── change
│   │   │   └── estimates.json
│   │   ├── new
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   └── report
│   │       ├── both
│   │       │   ├── iteration_times.svg
│   │       │   └── pdf.svg
│   │       ├── change
│   │       │   ├── mean.svg
│   │       │   ├── median.svg
│   │       │   └── t-test.svg
│   │       ├── index.html
│   │       ├── iteration_times_small.svg
│   │       ├── iteration_times.svg
│   │       ├── MAD.svg
│   │       ├── mean.svg
│   │       ├── median.svg
│   │       ├── pdf_small.svg
│   │       ├── pdf.svg
│   │       ├── relative_iteration_times_small.svg
│   │       ├── relative_pdf_small.svg
│   │       ├── SD.svg
│   │       └── typical.svg
│   ├── arbitrary-transfer-from
│   │   ├── base
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   ├── change
│   │   │   └── estimates.json
│   │   ├── new
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   └── report
│   │       ├── both
│   │       │   ├── pdf.svg
│   │       │   └── regression.svg
│   │       ├── change
│   │       │   ├── mean.svg
│   │       │   ├── median.svg
│   │       │   └── t-test.svg
│   │       ├── index.html
│   │       ├── MAD.svg
│   │       ├── mean.svg
│   │       ├── median.svg
│   │       ├── pdf_small.svg
│   │       ├── pdf.svg
│   │       ├── regression_small.svg
│   │       ├── regression.svg
│   │       ├── relative_pdf_small.svg
│   │       ├── relative_regression_small.svg
│   │       ├── SD.svg
│   │       ├── slope.svg
│   │       └── typical.svg
│   ├── avoid-abi-encode-packed
│   │   ├── base
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   ├── change
│   │   │   └── estimates.json
│   │   ├── new
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   └── report
│   │       ├── both
│   │       │   ├── pdf.svg
│   │       │   └── regression.svg
│   │       ├── change
│   │       │   ├── mean.svg
│   │       │   ├── median.svg
│   │       │   └── t-test.svg
│   │       ├── index.html
│   │       ├── MAD.svg
│   │       ├── mean.svg
│   │       ├── median.svg
│   │       ├── pdf_small.svg
│   │       ├── pdf.svg
│   │       ├── regression_small.svg
│   │       ├── regression.svg
│   │       ├── relative_pdf_small.svg
│   │       ├── relative_regression_small.svg
│   │       ├── SD.svg
│   │       ├── slope.svg
│   │       └── typical.svg
│   ├── block-timestamp-deadline
│   │   ├── base
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   ├── change
│   │   │   └── estimates.json
│   │   ├── new
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   └── report
│   │       ├── both
│   │       │   ├── pdf.svg
│   │       │   └── regression.svg
│   │       ├── change
│   │       │   ├── mean.svg
│   │       │   ├── median.svg
│   │       │   └── t-test.svg
│   │       ├── index.html
│   │       ├── MAD.svg
│   │       ├── mean.svg
│   │       ├── median.svg
│   │       ├── pdf_small.svg
│   │       ├── pdf.svg
│   │       ├── regression_small.svg
│   │       ├── regression.svg
│   │       ├── relative_pdf_small.svg
│   │       ├── relative_regression_small.svg
│   │       ├── SD.svg
│   │       ├── slope.svg
│   │       └── typical.svg
│   ├── centralization-risk
│   │   ├── base
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   ├── change
│   │   │   └── estimates.json
│   │   ├── new
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   └── report
│   │       ├── both
│   │       │   ├── pdf.svg
│   │       │   └── regression.svg
│   │       ├── change
│   │       │   ├── mean.svg
│   │       │   ├── median.svg
│   │       │   └── t-test.svg
│   │       ├── index.html
│   │       ├── MAD.svg
│   │       ├── mean.svg
│   │       ├── median.svg
│   │       ├── pdf_small.svg
│   │       ├── pdf.svg
│   │       ├── regression_small.svg
│   │       ├── regression.svg
│   │       ├── relative_pdf_small.svg
│   │       ├── relative_regression_small.svg
│   │       ├── SD.svg
│   │       ├── slope.svg
│   │       └── typical.svg
│   ├── constants-instead-of-literals
│   │   ├── base
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   ├── change
│   │   │   └── estimates.json
│   │   ├── new
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   └── report
│   │       ├── both
│   │       │   ├── pdf.svg
│   │       │   └── regression.svg
│   │       ├── change
│   │       │   ├── mean.svg
│   │       │   ├── median.svg
│   │       │   └── t-test.svg
│   │       ├── index.html
│   │       ├── MAD.svg
│   │       ├── mean.svg
│   │       ├── median.svg
│   │       ├── pdf_small.svg
│   │       ├── pdf.svg
│   │       ├── regression_small.svg
│   │       ├── regression.svg
│   │       ├── relative_pdf_small.svg
│   │       ├── relative_regression_small.svg
│   │       ├── SD.svg
│   │       ├── slope.svg
│   │       └── typical.svg
│   ├── delegate-call-in-loop
│   │   ├── base
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   ├── change
│   │   │   └── estimates.json
│   │   ├── new
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   └── report
│   │       ├── both
│   │       │   ├── pdf.svg
│   │       │   └── regression.svg
│   │       ├── change
│   │       │   ├── mean.svg
│   │       │   ├── median.svg
│   │       │   └── t-test.svg
│   │       ├── index.html
│   │       ├── MAD.svg
│   │       ├── mean.svg
│   │       ├── median.svg
│   │       ├── pdf_small.svg
│   │       ├── pdf.svg
│   │       ├── regression_small.svg
│   │       ├── regression.svg
│   │       ├── relative_pdf_small.svg
│   │       ├── relative_regression_small.svg
│   │       ├── SD.svg
│   │       ├── slope.svg
│   │       └── typical.svg
│   ├── deprecated-oz-functions
│   │   ├── base
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   ├── change
│   │   │   └── estimates.json
│   │   ├── new
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   └── report
│   │       ├── both
│   │       │   ├── pdf.svg
│   │       │   └── regression.svg
│   │       ├── change
│   │       │   ├── mean.svg
│   │       │   ├── median.svg
│   │       │   └── t-test.svg
│   │       ├── index.html
│   │       ├── MAD.svg
│   │       ├── mean.svg
│   │       ├── median.svg
│   │       ├── pdf_small.svg
│   │       ├── pdf.svg
│   │       ├── regression_small.svg
│   │       ├── regression.svg
│   │       ├── relative_pdf_small.svg
│   │       ├── relative_regression_small.svg
│   │       ├── SD.svg
│   │       ├── slope.svg
│   │       └── typical.svg
│   ├── ecrecover
│   │   ├── base
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   ├── change
│   │   │   └── estimates.json
│   │   ├── new
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   └── report
│   │       ├── both
│   │       │   ├── pdf.svg
│   │       │   └── regression.svg
│   │       ├── change
│   │       │   ├── mean.svg
│   │       │   ├── median.svg
│   │       │   └── t-test.svg
│   │       ├── index.html
│   │       ├── MAD.svg
│   │       ├── mean.svg
│   │       ├── median.svg
│   │       ├── pdf_small.svg
│   │       ├── pdf.svg
│   │       ├── regression_small.svg
│   │       ├── regression.svg
│   │       ├── relative_pdf_small.svg
│   │       ├── relative_regression_small.svg
│   │       ├── SD.svg
│   │       ├── slope.svg
│   │       └── typical.svg
│   ├── empty-block
│   │   ├── base
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   ├── change
│   │   │   └── estimates.json
│   │   ├── new
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   └── report
│   │       ├── both
│   │       │   ├── pdf.svg
│   │       │   └── regression.svg
│   │       ├── change
│   │       │   ├── mean.svg
│   │       │   ├── median.svg
│   │       │   └── t-test.svg
│   │       ├── index.html
│   │       ├── MAD.svg
│   │       ├── mean.svg
│   │       ├── median.svg
│   │       ├── pdf_small.svg
│   │       ├── pdf.svg
│   │       ├── regression_small.svg
│   │       ├── regression.svg
│   │       ├── relative_pdf_small.svg
│   │       ├── relative_regression_small.svg
│   │       ├── SD.svg
│   │       ├── slope.svg
│   │       └── typical.svg
│   ├── hello_world
│   │   ├── base
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   ├── new
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   └── report
│   │       ├── index.html
│   │       ├── MAD.svg
│   │       ├── mean.svg
│   │       ├── median.svg
│   │       ├── pdf_small.svg
│   │       ├── pdf.svg
│   │       ├── regression_small.svg
│   │       ├── regression.svg
│   │       ├── SD.svg
│   │       ├── slope.svg
│   │       └── typical.svg
│   ├── inconsistent-type-names
│   │   ├── base
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   ├── change
│   │   │   └── estimates.json
│   │   ├── new
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   └── report
│   │       ├── both
│   │       │   ├── pdf.svg
│   │       │   └── regression.svg
│   │       ├── change
│   │       │   ├── mean.svg
│   │       │   ├── median.svg
│   │       │   └── t-test.svg
│   │       ├── index.html
│   │       ├── MAD.svg
│   │       ├── mean.svg
│   │       ├── median.svg
│   │       ├── pdf_small.svg
│   │       ├── pdf.svg
│   │       ├── regression_small.svg
│   │       ├── regression.svg
│   │       ├── relative_pdf_small.svg
│   │       ├── relative_regression_small.svg
│   │       ├── SD.svg
│   │       ├── slope.svg
│   │       └── typical.svg
│   ├── large-numeric-literal
│   │   ├── base
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   ├── change
│   │   │   └── estimates.json
│   │   ├── new
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   └── report
│   │       ├── both
│   │       │   ├── pdf.svg
│   │       │   └── regression.svg
│   │       ├── change
│   │       │   ├── mean.svg
│   │       │   ├── median.svg
│   │       │   └── t-test.svg
│   │       ├── index.html
│   │       ├── MAD.svg
│   │       ├── mean.svg
│   │       ├── median.svg
│   │       ├── pdf_small.svg
│   │       ├── pdf.svg
│   │       ├── regression_small.svg
│   │       ├── regression.svg
│   │       ├── relative_pdf_small.svg
│   │       ├── relative_regression_small.svg
│   │       ├── SD.svg
│   │       ├── slope.svg
│   │       └── typical.svg
│   ├── non-reentrant-before-others
│   │   ├── base
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   ├── change
│   │   │   └── estimates.json
│   │   ├── new
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   └── report
│   │       ├── both
│   │       │   ├── pdf.svg
│   │       │   └── regression.svg
│   │       ├── change
│   │       │   ├── mean.svg
│   │       │   ├── median.svg
│   │       │   └── t-test.svg
│   │       ├── index.html
│   │       ├── MAD.svg
│   │       ├── mean.svg
│   │       ├── median.svg
│   │       ├── pdf_small.svg
│   │       ├── pdf.svg
│   │       ├── regression_small.svg
│   │       ├── regression.svg
│   │       ├── relative_pdf_small.svg
│   │       ├── relative_regression_small.svg
│   │       ├── SD.svg
│   │       ├── slope.svg
│   │       └── typical.svg
│   ├── push-zero-opcode
│   │   ├── base
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   ├── change
│   │   │   └── estimates.json
│   │   ├── new
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   └── report
│   │       ├── both
│   │       │   ├── pdf.svg
│   │       │   └── regression.svg
│   │       ├── change
│   │       │   ├── mean.svg
│   │       │   ├── median.svg
│   │       │   └── t-test.svg
│   │       ├── index.html
│   │       ├── MAD.svg
│   │       ├── mean.svg
│   │       ├── median.svg
│   │       ├── pdf_small.svg
│   │       ├── pdf.svg
│   │       ├── regression_small.svg
│   │       ├── regression.svg
│   │       ├── relative_pdf_small.svg
│   │       ├── relative_regression_small.svg
│   │       ├── SD.svg
│   │       ├── slope.svg
│   │       └── typical.svg
│   ├── report
│   │   └── index.html
│   ├── require-with-string
│   │   ├── base
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   ├── change
│   │   │   └── estimates.json
│   │   ├── new
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   └── report
│   │       ├── both
│   │       │   ├── pdf.svg
│   │       │   └── regression.svg
│   │       ├── change
│   │       │   ├── mean.svg
│   │       │   ├── median.svg
│   │       │   └── t-test.svg
│   │       ├── index.html
│   │       ├── MAD.svg
│   │       ├── mean.svg
│   │       ├── median.svg
│   │       ├── pdf_small.svg
│   │       ├── pdf.svg
│   │       ├── regression_small.svg
│   │       ├── regression.svg
│   │       ├── relative_pdf_small.svg
│   │       ├── relative_regression_small.svg
│   │       ├── SD.svg
│   │       ├── slope.svg
│   │       └── typical.svg
│   ├── solmate-safe-transfer-lib
│   │   ├── base
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   ├── change
│   │   │   └── estimates.json
│   │   ├── new
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   └── report
│   │       ├── both
│   │       │   ├── pdf.svg
│   │       │   └── regression.svg
│   │       ├── change
│   │       │   ├── mean.svg
│   │       │   ├── median.svg
│   │       │   └── t-test.svg
│   │       ├── index.html
│   │       ├── MAD.svg
│   │       ├── mean.svg
│   │       ├── median.svg
│   │       ├── pdf_small.svg
│   │       ├── pdf.svg
│   │       ├── regression_small.svg
│   │       ├── regression.svg
│   │       ├── relative_pdf_small.svg
│   │       ├── relative_regression_small.svg
│   │       ├── SD.svg
│   │       ├── slope.svg
│   │       └── typical.svg
│   ├── unindexed-events
│   │   ├── base
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   ├── change
│   │   │   └── estimates.json
│   │   ├── new
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   └── report
│   │       ├── both
│   │       │   ├── pdf.svg
│   │       │   └── regression.svg
│   │       ├── change
│   │       │   ├── mean.svg
│   │       │   ├── median.svg
│   │       │   └── t-test.svg
│   │       ├── index.html
│   │       ├── MAD.svg
│   │       ├── mean.svg
│   │       ├── median.svg
│   │       ├── pdf_small.svg
│   │       ├── pdf.svg
│   │       ├── regression_small.svg
│   │       ├── regression.svg
│   │       ├── relative_pdf_small.svg
│   │       ├── relative_regression_small.svg
│   │       ├── SD.svg
│   │       ├── slope.svg
│   │       └── typical.svg
│   ├── unprotected-initializer
│   │   ├── base
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   ├── change
│   │   │   └── estimates.json
│   │   ├── new
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   └── report
│   │       ├── both
│   │       │   ├── pdf.svg
│   │       │   └── regression.svg
│   │       ├── change
│   │       │   ├── mean.svg
│   │       │   ├── median.svg
│   │       │   └── t-test.svg
│   │       ├── index.html
│   │       ├── MAD.svg
│   │       ├── mean.svg
│   │       ├── median.svg
│   │       ├── pdf_small.svg
│   │       ├── pdf.svg
│   │       ├── regression_small.svg
│   │       ├── regression.svg
│   │       ├── relative_pdf_small.svg
│   │       ├── relative_regression_small.svg
│   │       ├── SD.svg
│   │       ├── slope.svg
│   │       └── typical.svg
│   ├── unsafe-erc20-functions
│   │   ├── base
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   ├── change
│   │   │   └── estimates.json
│   │   ├── new
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   └── report
│   │       ├── both
│   │       │   ├── pdf.svg
│   │       │   └── regression.svg
│   │       ├── change
│   │       │   ├── mean.svg
│   │       │   ├── median.svg
│   │       │   └── t-test.svg
│   │       ├── index.html
│   │       ├── MAD.svg
│   │       ├── mean.svg
│   │       ├── median.svg
│   │       ├── pdf_small.svg
│   │       ├── pdf.svg
│   │       ├── regression_small.svg
│   │       ├── regression.svg
│   │       ├── relative_pdf_small.svg
│   │       ├── relative_regression_small.svg
│   │       ├── SD.svg
│   │       ├── slope.svg
│   │       └── typical.svg
│   ├── unsafe-oz-erc721-mint
│   │   ├── base
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   ├── change
│   │   │   └── estimates.json
│   │   ├── new
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   └── report
│   │       ├── both
│   │       │   ├── pdf.svg
│   │       │   └── regression.svg
│   │       ├── change
│   │       │   ├── mean.svg
│   │       │   ├── median.svg
│   │       │   └── t-test.svg
│   │       ├── index.html
│   │       ├── MAD.svg
│   │       ├── mean.svg
│   │       ├── median.svg
│   │       ├── pdf_small.svg
│   │       ├── pdf.svg
│   │       ├── regression_small.svg
│   │       ├── regression.svg
│   │       ├── relative_pdf_small.svg
│   │       ├── relative_regression_small.svg
│   │       ├── SD.svg
│   │       ├── slope.svg
│   │       └── typical.svg
│   ├── unspecific-solidity-pragma
│   │   ├── base
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   ├── change
│   │   │   └── estimates.json
│   │   ├── new
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   └── report
│   │       ├── both
│   │       │   ├── pdf.svg
│   │       │   └── regression.svg
│   │       ├── change
│   │       │   ├── mean.svg
│   │       │   ├── median.svg
│   │       │   └── t-test.svg
│   │       ├── index.html
│   │       ├── MAD.svg
│   │       ├── mean.svg
│   │       ├── median.svg
│   │       ├── pdf_small.svg
│   │       ├── pdf.svg
│   │       ├── regression_small.svg
│   │       ├── regression.svg
│   │       ├── relative_pdf_small.svg
│   │       ├── relative_regression_small.svg
│   │       ├── SD.svg
│   │       ├── slope.svg
│   │       └── typical.svg
│   ├── useless-internal-function
│   │   ├── base
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   ├── change
│   │   │   └── estimates.json
│   │   ├── new
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   └── report
│   │       ├── both
│   │       │   ├── pdf.svg
│   │       │   └── regression.svg
│   │       ├── change
│   │       │   ├── mean.svg
│   │       │   ├── median.svg
│   │       │   └── t-test.svg
│   │       ├── index.html
│   │       ├── MAD.svg
│   │       ├── mean.svg
│   │       ├── median.svg
│   │       ├── pdf_small.svg
│   │       ├── pdf.svg
│   │       ├── regression_small.svg
│   │       ├── regression.svg
│   │       ├── relative_pdf_small.svg
│   │       ├── relative_regression_small.svg
│   │       ├── SD.svg
│   │       ├── slope.svg
│   │       └── typical.svg
│   ├── useless-modifier
│   │   ├── base
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   ├── change
│   │   │   └── estimates.json
│   │   ├── new
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   └── report
│   │       ├── both
│   │       │   ├── pdf.svg
│   │       │   └── regression.svg
│   │       ├── change
│   │       │   ├── mean.svg
│   │       │   ├── median.svg
│   │       │   └── t-test.svg
│   │       ├── index.html
│   │       ├── MAD.svg
│   │       ├── mean.svg
│   │       ├── median.svg
│   │       ├── pdf_small.svg
│   │       ├── pdf.svg
│   │       ├── regression_small.svg
│   │       ├── regression.svg
│   │       ├── relative_pdf_small.svg
│   │       ├── relative_regression_small.svg
│   │       ├── SD.svg
│   │       ├── slope.svg
│   │       └── typical.svg
│   ├── useless-public-function
│   │   ├── base
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   ├── change
│   │   │   └── estimates.json
│   │   ├── new
│   │   │   ├── benchmark.json
│   │   │   ├── estimates.json
│   │   │   ├── sample.json
│   │   │   └── tukey.json
│   │   └── report
│   │       ├── both
│   │       │   ├── pdf.svg
│   │       │   └── regression.svg
│   │       ├── change
│   │       │   ├── mean.svg
│   │       │   ├── median.svg
│   │       │   └── t-test.svg
│   │       ├── index.html
│   │       ├── MAD.svg
│   │       ├── mean.svg
│   │       ├── median.svg
│   │       ├── pdf_small.svg
│   │       ├── pdf.svg
│   │       ├── regression_small.svg
│   │       ├── regression.svg
│   │       ├── relative_pdf_small.svg
│   │       ├── relative_regression_small.svg
│   │       ├── SD.svg
│   │       ├── slope.svg
│   │       └── typical.svg
│   └── zero-address-check
│       ├── base
│       │   ├── benchmark.json
│       │   ├── estimates.json
│       │   ├── sample.json
│       │   └── tukey.json
│       ├── change
│       │   └── estimates.json
│       ├── new
│       │   ├── benchmark.json
│       │   ├── estimates.json
│       │   ├── sample.json
│       │   └── tukey.json
│       └── report
│           ├── both
│           │   ├── pdf.svg
│           │   └── regression.svg
│           ├── change
│           │   ├── mean.svg
│           │   ├── median.svg
│           │   └── t-test.svg
│           ├── index.html
│           ├── MAD.svg
│           ├── mean.svg
│           ├── median.svg
│           ├── pdf_small.svg
│           ├── pdf.svg
│           ├── regression_small.svg
│           ├── regression.svg
│           ├── relative_pdf_small.svg
│           ├── relative_regression_small.svg
│           ├── SD.svg
│           ├── slope.svg
│           └── typical.svg
├── Cargo.lock
├── Cargo.toml
├── cli
│   ├── benchmarks.sh
│   └── reportgen.sh
├── CODEOWNERS
├── CONTRIBUTING.md
├── cyfrinup
│   ├── dynamic_script
│   └── why.md
├── deny.toml
├── dist-workspace.toml
├── funding.json
├── LICENSE
├── Makefile
├── package-lock.json
├── package.json
├── README.md
├── RELEASE_CHECKLIST.md
├── reports
│   ├── adhoc-sol-files-highs-only-report.json
│   ├── adhoc-sol-files-report.md
│   ├── ccip-functions-report.md
│   ├── empty_report.md
│   ├── hardhat-playground-report.md
│   ├── nft-report-icm.md
│   ├── nft-report.md
│   ├── prb-math-report.md
│   ├── report.json
│   ├── report.md
│   ├── report.sarif
│   ├── sablier-aderyn-toml-nested-root.md
│   ├── templegold-report.md
│   └── uniswap_profile.md
├── rust-toolchain.toml
├── rustfmt.toml
├── tests
│   ├── adhoc-sol-files
│   │   ├── aderyn.toml
│   │   ├── Counter.sol
│   │   ├── DemoASTNodes.sol
│   │   ├── Helper.sol
│   │   ├── InconsistentUints.sol
│   │   ├── inheritance
│   │   │   ├── ExtendedInheritance.sol
│   │   │   ├── IContractInheritance.sol
│   │   │   └── InheritanceBase.sol
│   │   ├── InternalFunctions.sol
│   │   ├── lib
│   │   │   └── ThisShouldBeExcluded.sol
│   │   ├── multiple-versions
│   │   │   ├── 0.4
│   │   │   │   ├── A.sol
│   │   │   │   └── B.sol
│   │   │   ├── 0.5
│   │   │   │   ├── A.sol
│   │   │   │   └── B.sol
│   │   │   ├── 0.6
│   │   │   │   ├── A.sol
│   │   │   │   └── B.sol
│   │   │   ├── 0.7
│   │   │   │   ├── A.sol
│   │   │   │   └── B.sol
│   │   │   └── 0.8
│   │   │       ├── A.sol
│   │   │       └── B.sol
│   │   ├── OnceModifierExample.sol
│   │   └── StateVariables.sol
│   ├── ast
│   │   ├── abstract_contract.json
│   │   ├── address_payable.json
│   │   ├── array_type_name.json
│   │   ├── ast-erc4626.json
│   │   ├── base_constructor_call.json
│   │   ├── bit_not.json
│   │   ├── call.json
│   │   ├── constructor.json
│   │   ├── contract_dep_order.json
│   │   ├── do_while.json
│   │   ├── documentation_1.json
│   │   ├── documentation_2.json
│   │   ├── documentation_3.json
│   │   ├── documentation_local_variable.json
│   │   ├── documentation_on_statements.json
│   │   ├── documentation_triple.json
│   │   ├── empty_block.json
│   │   ├── enum_value_declaration.json
│   │   ├── enum_value.json
│   │   ├── event_definition.json
│   │   ├── experimental_encoder_pragma.json
│   │   ├── fallback_and_reveice_ether.json
│   │   ├── fallback_payable.json
│   │   ├── fallback.json
│   │   ├── function_type.json
│   │   ├── function.json
│   │   ├── global_enum.json
│   │   ├── global_struct.json
│   │   ├── inheritance_specifier.json
│   │   ├── leave.json
│   │   ├── license.json
│   │   ├── long_type_name_binary_operation.json
│   │   ├── long_type_name_identifier.json
│   │   ├── loop.json
│   │   ├── mappings.json
│   │   ├── modifier_definition.json
│   │   ├── modifier_invocation.json
│   │   ├── mutability.json
│   │   ├── nested_functions.json
│   │   ├── non_utf8.json
│   │   ├── override.json
│   │   ├── placeholder_statement.json
│   │   ├── receive_ether.json
│   │   ├── short_type_name_ref.json
│   │   ├── short_type_name.json
│   │   ├── slot_offset.json
│   │   ├── smoke.json
│   │   ├── source_location.json
│   │   ├── string.json
│   │   ├── stringlit.json
│   │   ├── switch_default.json
│   │   ├── switch.json
│   │   ├── try_catch.json
│   │   ├── two_base_functions.json
│   │   ├── unicode.json
│   │   ├── used_errors.json
│   │   ├── userDefinedValueType.json
│   │   ├── using_for_directive.json
│   │   ├── var_access.json
│   │   └── yul_hex_literal.json
│   ├── contract-playground
│   │   ├── .github
│   │   │   └── workflows
│   │   │       └── test.yml
│   │   ├── .gitignore
│   │   ├── dot
│   │   │   └── .gitkeep
│   │   ├── foundry.toml
│   │   ├── README.md
│   │   ├── script
│   │   │   └── Counter.s.sol
│   │   ├── src
│   │   │   ├── AbstractContract.sol
│   │   │   ├── AderynIgnoreCustomDetectors.sol
│   │   │   ├── AdminContract.sol
│   │   │   ├── ArbitraryTransferFrom.sol
│   │   │   ├── AssemblyExample.sol
│   │   │   ├── AssertStateChange.sol
│   │   │   ├── auditor_mode
│   │   │   │   ├── ExternalCalls.sol
│   │   │   │   └── PublicFunctionsWithoutSenderCheck.sol
│   │   │   ├── BooleanEquality.sol
│   │   │   ├── BuiltinSymbolShadow.sol
│   │   │   ├── CacheArrayLength.sol
│   │   │   ├── CallGraphTests.sol
│   │   │   ├── Casting.sol
│   │   │   ├── cloc
│   │   │   │   ├── AnotherHeavilyCommentedContract.sol
│   │   │   │   ├── EmptyContractFile.sol
│   │   │   │   └── HeavilyCommentedContract.sol
│   │   │   ├── CompilerBugStorageSignedIntegerArray.sol
│   │   │   ├── ConstantFuncsAssembly.sol
│   │   │   ├── ConstantsLiterals.sol
│   │   │   ├── ConstFuncChangeState.sol
│   │   │   ├── ContractLocksEther.sol
│   │   │   ├── ContractWithTodo.sol
│   │   │   ├── control_flow
│   │   │   │   └── SimpleProgram.sol
│   │   │   ├── CostlyOperationsInsideLoops.sol
│   │   │   ├── Counter.sol
│   │   │   ├── CrazyPragma.sol
│   │   │   ├── DangerousStrictEquality1.sol
│   │   │   ├── DangerousStrictEquality2.sol
│   │   │   ├── DangerousUnaryOperator.sol
│   │   │   ├── DeadCode.sol
│   │   │   ├── DelegateCallWithoutAddressCheck.sol
│   │   │   ├── DeletionNestedMappingStructureContract.sol
│   │   │   ├── DeprecatedOZFunctions.sol
│   │   │   ├── DivisionBeforeMultiplication.sol
│   │   │   ├── DynamicArrayLengthAssignment.sol
│   │   │   ├── EmitAfterExternalCall.sol
│   │   │   ├── EmptyBlocks.sol
│   │   │   ├── EnumerableSetIteration.sol
│   │   │   ├── eth2
│   │   │   │   └── DepositContract.sol
│   │   │   ├── ExperimentalEncoder.sol
│   │   │   ├── ExternalCalls.sol
│   │   │   ├── FunctionInitializingState.sol
│   │   │   ├── FunctionPointers.sol
│   │   │   ├── FunctionSignatureCollision.sol
│   │   │   ├── HugeConstants.sol
│   │   │   ├── IgnoreEverything.sol
│   │   │   ├── InconsistentUints.sol
│   │   │   ├── IncorrectCaretOperator.sol
│   │   │   ├── IncorrectERC20.sol
│   │   │   ├── IncorrectERC721.sol
│   │   │   ├── IncorrectModifier.sol
│   │   │   ├── IncorrectShift.sol
│   │   │   ├── inheritance
│   │   │   │   ├── ExtendedInheritance.sol
│   │   │   │   ├── IContractInheritance.sol
│   │   │   │   └── InheritanceBase.sol
│   │   │   ├── InternalFunctions.sol
│   │   │   ├── KeccakContract.sol
│   │   │   ├── LocalVariableShadow.sol
│   │   │   ├── MissingInheritance.sol
│   │   │   ├── MisusedBoolean.sol
│   │   │   ├── MsgValueInLoop.sol
│   │   │   ├── MultipleConstructorSchemes.sol
│   │   │   ├── MultiplePlaceholders.sol
│   │   │   ├── nested
│   │   │   │   ├── 1
│   │   │   │   │   └── Nested.sol
│   │   │   │   └── 2
│   │   │   │       └── Nested.sol
│   │   │   ├── nested_mappings
│   │   │   │   ├── LaterVersion.sol
│   │   │   │   └── NestedMappings.sol
│   │   │   ├── OnceModifierExample.sol
│   │   │   ├── OnlyLibrary.sol
│   │   │   ├── OutOfOrderRetryable.sol
│   │   │   ├── parent_chain
│   │   │   │   └── ParentChainContract.sol
│   │   │   ├── PragmaRange.sol
│   │   │   ├── PreDeclaredVarUsage.sol
│   │   │   ├── PublicFunction.sol
│   │   │   ├── PublicVariableReadInExternalContext.sol
│   │   │   ├── RedundantStatements.sol
│   │   │   ├── ReturnBomb.sol
│   │   │   ├── reused_contract_name
│   │   │   │   ├── ContractA.sol
│   │   │   │   └── ContractB.sol
│   │   │   ├── RevertsAndRequriesInLoops.sol
│   │   │   ├── router
│   │   │   │   ├── ExternalCalls.sol
│   │   │   │   ├── FallbackAndReceiveOverrides.sol
│   │   │   │   ├── InternalCalls.sol
│   │   │   │   ├── ModifierCalls.sol
│   │   │   │   └── VarOverridesFunction.sol
│   │   │   ├── RTLO.sol
│   │   │   ├── SendEtherNoChecks.sol
│   │   │   ├── SendEtherNoChecksLibImport.sol
│   │   │   ├── StateChangeAfterExternalCall.sol
│   │   │   ├── StateShadowing.sol
│   │   │   ├── StateVariableCouldBeDeclaredConstant.sol
│   │   │   ├── StateVariableCouldBeDeclaredImmutable.sol
│   │   │   ├── StateVariables.sol
│   │   │   ├── StateVariablesChangesWithoutEvents.sol
│   │   │   ├── StateVariablesManipulation.sol
│   │   │   ├── StorageConditionals.sol
│   │   │   ├── StorageParameters.sol
│   │   │   ├── T11sTranferer.sol
│   │   │   ├── TautologicalCompare.sol
│   │   │   ├── TautologyOrContradiction.sol
│   │   │   ├── TestERC20.sol
│   │   │   ├── TransientKeyword.sol
│   │   │   ├── Trump.sol
│   │   │   ├── TxOriginUsedForAuth.sol
│   │   │   ├── U2.sol
│   │   │   ├── U3.sol
│   │   │   ├── U4.sol
│   │   │   ├── U5.sol
│   │   │   ├── UncheckedCalls.sol
│   │   │   ├── UncheckedReturn.sol
│   │   │   ├── UncheckedSend.sol
│   │   │   ├── UninitializedLocalVariables.sol
│   │   │   ├── UninitializedStateVariable.sol
│   │   │   ├── uniswap
│   │   │   │   ├── UniswapV2Swapper.sol
│   │   │   │   └── UniswapV3Swapper.sol
│   │   │   ├── UnprotectedInitialize.sol
│   │   │   ├── UnsafeERC721Mint.sol
│   │   │   ├── UnusedError.sol
│   │   │   ├── UnusedImport.sol
│   │   │   ├── UnusedStateVariables.sol
│   │   │   ├── UsingSelfdestruct.sol
│   │   │   ├── VoidConstructor.sol
│   │   │   ├── WeakRandomness.sol
│   │   │   ├── WrongOrderOfLayout.sol
│   │   │   ├── YulReturn.sol
│   │   │   └── ZeroAddressCheck.sol
│   │   └── test
│   │       └── Counter.t.sol
│   ├── foundry-nft-f23
│   │   ├── .github
│   │   │   └── workflows
│   │   │       └── test.yml
│   │   ├── .gitignore
│   │   ├── foundry.lock
│   │   ├── foundry.toml
│   │   ├── README.md
│   │   ├── remappings.txt
│   │   └── src
│   │       ├── BasicNft.sol
│   │       ├── F1.sol
│   │       ├── F2.sol
│   │       ├── Initializer.sol
│   │       └── inner-core-modules
│   │           └── ICM.sol
│   ├── foundry-nft-f23-icm
│   │   ├── .github
│   │   │   └── workflows
│   │   │       └── test.yml
│   │   ├── .gitignore
│   │   ├── aderyn.toml
│   │   ├── foundry.toml
│   │   ├── README.md
│   │   ├── remappings.txt
│   │   └── src
│   │       ├── BasicNft.sol
│   │       ├── F1.sol
│   │       ├── F2.sol
│   │       ├── Initializer.sol
│   │       └── inner-core-modules
│   │           └── ICM.sol
│   ├── hardhat-js-playground
│   │   ├── .gitignore
│   │   ├── artifacts
│   │   │   ├── build-info
│   │   │   │   └── cee6fe9a9a2f03f7ff10a27ab2746af6.json
│   │   │   └── contracts
│   │   │       ├── Counter.sol
│   │   │       │   ├── Counter.dbg.json
│   │   │       │   └── Counter.json
│   │   │       ├── ExtendedInheritance.sol
│   │   │       │   ├── ExtendedInheritance.dbg.json
│   │   │       │   └── ExtendedInheritance.json
│   │   │       ├── IContractInheritance.sol
│   │   │       │   ├── IContractInheritance.dbg.json
│   │   │       │   └── IContractInheritance.json
│   │   │       ├── InheritanceBase.sol
│   │   │       │   ├── InheritanceBase.dbg.json
│   │   │       │   └── InheritanceBase.json
│   │   │       ├── KeccakContract.sol
│   │   │       │   ├── KeccakContract.dbg.json
│   │   │       │   └── KeccakContract.json
│   │   │       ├── Lock.sol
│   │   │       │   ├── Lock.dbg.json
│   │   │       │   └── Lock.json
│   │   │       └── StateVariables.sol
│   │   │           ├── StateVariables.dbg.json
│   │   │           └── StateVariables.json
│   │   ├── contracts
│   │   │   ├── Counter.sol
│   │   │   ├── ExtendedInheritance.sol
│   │   │   ├── IContractInheritance.sol
│   │   │   ├── InheritanceBase.sol
│   │   │   ├── KeccakContract.sol
│   │   │   ├── Lock.sol
│   │   │   └── StateVariables.sol
│   │   ├── hardhat.config.js
│   │   ├── package.json
│   │   ├── README.md
│   │   ├── scripts
│   │   │   └── deploy.js
│   │   ├── test
│   │   │   └── Lock.js
│   │   └── yarn.lock
│   ├── no-sol-files
│   │   ├── extra
│   │   │   └── HelloAgain.md
│   │   ├── Hello.txt
│   │   └── Hello.yul
│   └── toml
│       ├── nested_project1
│       │   ├── aderyn.toml
│       │   ├── folder1
│       │   │   └── hardhat.config.ts
│       │   ├── folder2
│       │   │   └── hardhat.config.ts
│       │   └── folder3
│       │       └── file.txt
│       └── nested_project2
│           ├── aderyn.toml
│           ├── folder1
│           │   └── foundry.toml
│           └── folder2
│               └── file1.txt
├── tools
│   └── xtask
│       ├── Cargo.toml
│       └── src
│           ├── blesspr.rs
│           ├── cut_release.rs
│           ├── flags.rs
│           ├── main.rs
│           ├── reportgen.rs
│           └── tomlgen.rs
└── typos.toml
```

# Files

--------------------------------------------------------------------------------
/benchmarks/ecrecover/report/regression_small.svg:
--------------------------------------------------------------------------------

```
  1 | <svg width="450" height="300" viewBox="0 0 450 300" xmlns="http://www.w3.org/2000/svg">
  2 | <text x="15" y="130" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000" transform="rotate(270, 15, 130)">
  3 | Total sample time (ms)
  4 | </text>
  5 | <text x="255" y="285" dy="-0.5ex" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
  6 | Iterations (x 10^3)
  7 | </text>
  8 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="108" y1="244" x2="108" y2="15"/>
  9 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="145" y1="244" x2="145" y2="15"/>
 10 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="182" y1="244" x2="182" y2="15"/>
 11 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="219" y1="244" x2="219" y2="15"/>
 12 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="256" y1="244" x2="256" y2="15"/>
 13 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="293" y1="244" x2="293" y2="15"/>
 14 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="330" y1="244" x2="330" y2="15"/>
 15 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="367" y1="244" x2="367" y2="15"/>
 16 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="404" y1="244" x2="404" y2="15"/>
 17 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="75" y1="224" x2="434" y2="224"/>
 18 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="75" y1="203" x2="434" y2="203"/>
 19 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="75" y1="182" x2="434" y2="182"/>
 20 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="75" y1="161" x2="434" y2="161"/>
 21 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="75" y1="140" x2="434" y2="140"/>
 22 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="75" y1="119" x2="434" y2="119"/>
 23 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="75" y1="98" x2="434" y2="98"/>
 24 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="75" y1="77" x2="434" y2="77"/>
 25 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="75" y1="56" x2="434" y2="56"/>
 26 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="75" y1="35" x2="434" y2="35"/>
 27 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="74,15 74,244 "/>
 28 | <text x="65" y="224" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 29 | 20.0
 30 | </text>
 31 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="69,224 74,224 "/>
 32 | <text x="65" y="203" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 33 | 40.0
 34 | </text>
 35 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="69,203 74,203 "/>
 36 | <text x="65" y="182" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 37 | 60.0
 38 | </text>
 39 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="69,182 74,182 "/>
 40 | <text x="65" y="161" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 41 | 80.0
 42 | </text>
 43 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="69,161 74,161 "/>
 44 | <text x="65" y="140" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 45 | 100.0
 46 | </text>
 47 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="69,140 74,140 "/>
 48 | <text x="65" y="119" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 49 | 120.0
 50 | </text>
 51 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="69,119 74,119 "/>
 52 | <text x="65" y="98" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 53 | 140.0
 54 | </text>
 55 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="69,98 74,98 "/>
 56 | <text x="65" y="77" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 57 | 160.0
 58 | </text>
 59 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="69,77 74,77 "/>
 60 | <text x="65" y="56" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 61 | 180.0
 62 | </text>
 63 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="69,56 74,56 "/>
 64 | <text x="65" y="35" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 65 | 200.0
 66 | </text>
 67 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="69,35 74,35 "/>
 68 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="75,245 434,245 "/>
 69 | <text x="108" y="255" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 70 | 2
 71 | </text>
 72 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="108,245 108,250 "/>
 73 | <text x="145" y="255" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 74 | 4
 75 | </text>
 76 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="145,245 145,250 "/>
 77 | <text x="182" y="255" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 78 | 6
 79 | </text>
 80 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="182,245 182,250 "/>
 81 | <text x="219" y="255" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 82 | 8
 83 | </text>
 84 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="219,245 219,250 "/>
 85 | <text x="256" y="255" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 86 | 10
 87 | </text>
 88 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="256,245 256,250 "/>
 89 | <text x="293" y="255" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 90 | 12
 91 | </text>
 92 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="293,245 293,250 "/>
 93 | <text x="330" y="255" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 94 | 14
 95 | </text>
 96 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="330,245 330,250 "/>
 97 | <text x="367" y="255" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 98 | 16
 99 | </text>
100 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="367,245 367,250 "/>
101 | <text x="404" y="255" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
102 | 18
103 | </text>
104 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="404,245 404,250 "/>
105 | <circle cx="75" cy="244" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
106 | <circle cx="78" cy="243" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
107 | <circle cx="82" cy="242" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
108 | <circle cx="85" cy="241" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
109 | <circle cx="89" cy="240" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
110 | <circle cx="93" cy="239" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
111 | <circle cx="96" cy="238" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
112 | <circle cx="100" cy="238" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
113 | <circle cx="104" cy="236" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
114 | <circle cx="107" cy="235" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
115 | <circle cx="111" cy="234" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
116 | <circle cx="114" cy="233" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
117 | <circle cx="118" cy="232" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
118 | <circle cx="122" cy="231" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
119 | <circle cx="125" cy="230" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
120 | <circle cx="129" cy="230" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
121 | <circle cx="133" cy="229" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
122 | <circle cx="136" cy="228" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
123 | <circle cx="140" cy="227" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
124 | <circle cx="143" cy="226" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
125 | <circle cx="147" cy="224" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
126 | <circle cx="151" cy="223" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
127 | <circle cx="154" cy="222" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
128 | <circle cx="158" cy="221" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
129 | <circle cx="162" cy="220" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
130 | <circle cx="165" cy="219" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
131 | <circle cx="169" cy="218" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
132 | <circle cx="172" cy="217" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
133 | <circle cx="176" cy="216" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
134 | <circle cx="180" cy="216" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
135 | <circle cx="183" cy="214" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
136 | <circle cx="187" cy="213" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
137 | <circle cx="191" cy="213" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
138 | <circle cx="194" cy="212" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
139 | <circle cx="198" cy="210" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
140 | <circle cx="201" cy="207" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
141 | <circle cx="205" cy="209" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
142 | <circle cx="209" cy="207" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
143 | <circle cx="212" cy="207" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
144 | <circle cx="216" cy="207" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
145 | <circle cx="220" cy="204" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
146 | <circle cx="223" cy="202" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
147 | <circle cx="227" cy="201" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
148 | <circle cx="230" cy="200" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
149 | <circle cx="234" cy="196" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
150 | <circle cx="238" cy="193" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
151 | <circle cx="241" cy="192" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
152 | <circle cx="245" cy="192" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
153 | <circle cx="249" cy="191" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
154 | <circle cx="252" cy="186" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
155 | <circle cx="256" cy="192" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
156 | <circle cx="259" cy="191" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
157 | <circle cx="263" cy="190" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
158 | <circle cx="267" cy="189" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
159 | <circle cx="270" cy="188" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
160 | <circle cx="274" cy="186" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
161 | <circle cx="278" cy="185" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
162 | <circle cx="281" cy="183" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
163 | <circle cx="285" cy="182" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
164 | <circle cx="288" cy="181" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
165 | <circle cx="292" cy="181" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
166 | <circle cx="296" cy="179" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
167 | <circle cx="299" cy="178" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
168 | <circle cx="303" cy="178" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
169 | <circle cx="307" cy="176" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
170 | <circle cx="310" cy="175" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
171 | <circle cx="314" cy="174" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
172 | <circle cx="317" cy="173" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
173 | <circle cx="321" cy="172" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
174 | <circle cx="325" cy="171" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
175 | <circle cx="328" cy="119" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
176 | <circle cx="332" cy="173" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
177 | <circle cx="336" cy="167" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
178 | <circle cx="339" cy="169" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
179 | <circle cx="343" cy="167" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
180 | <circle cx="346" cy="164" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
181 | <circle cx="350" cy="160" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
182 | <circle cx="354" cy="161" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
183 | <circle cx="357" cy="161" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
184 | <circle cx="361" cy="161" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
185 | <circle cx="365" cy="159" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
186 | <circle cx="368" cy="163" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
187 | <circle cx="372" cy="159" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
188 | <circle cx="375" cy="158" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
189 | <circle cx="379" cy="155" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
190 | <circle cx="383" cy="155" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
191 | <circle cx="386" cy="154" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
192 | <circle cx="390" cy="152" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
193 | <circle cx="394" cy="151" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
194 | <circle cx="397" cy="153" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
195 | <circle cx="401" cy="148" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
196 | <circle cx="404" cy="140" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
197 | <circle cx="408" cy="15" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
198 | <circle cx="412" cy="142" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
199 | <circle cx="415" cy="147" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
200 | <circle cx="419" cy="145" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
201 | <circle cx="423" cy="138" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
202 | <circle cx="426" cy="129" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
203 | <circle cx="430" cy="134" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
204 | <circle cx="434" cy="140" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
205 | <polyline fill="none" opacity="1" stroke="#1F78B4" stroke-width="1" points="75,245 434,134 "/>
206 | <polygon opacity="0.25" fill="#1F78B4" points="75,245 434,139 434,126 "/>
207 | </svg>
208 | 
```

--------------------------------------------------------------------------------
/aderyn_core/src/context/flow.rs:
--------------------------------------------------------------------------------

```rust
  1 | pub mod display;
  2 | pub mod error;
  3 | pub mod kind;
  4 | pub mod primitives;
  5 | pub mod reducibles;
  6 | mod tests;
  7 | pub mod utils;
  8 | pub mod visualizer;
  9 | pub mod voids;
 10 | 
 11 | use crate::{
 12 |     ast::*,
 13 |     context::flow::utils::{Calibration, discover_jump_sources},
 14 | };
 15 | 
 16 | pub use kind::CfgNodeKind;
 17 | pub use reducibles::CfgBlock;
 18 | 
 19 | use std::collections::{HashMap, HashSet, VecDeque, hash_map::Entry};
 20 | 
 21 | use self::{
 22 |     primitives::*,
 23 |     reducibles::{
 24 |         CfgDoWhileStatement, CfgForStatement, CfgIfStatement, CfgUncheckedBlock, CfgWhileStatement,
 25 |     },
 26 |     utils::find_jump_dest,
 27 |     voids::{CfgEndNode, CfgStartNode},
 28 | };
 29 | 
 30 | use super::workspace::WorkspaceContext;
 31 | 
 32 | // This is done to differentiate AstNodeIDs from CfgNodeIDs
 33 | type AstNodeId = NodeID;
 34 | 
 35 | #[derive(Eq, Hash, Default, PartialEq, Clone, Copy, Debug, PartialOrd, Ord)]
 36 | pub struct CfgNodeId(usize);
 37 | 
 38 | impl CfgNodeId {
 39 |     #[allow(dead_code)]
 40 |     fn peek(&self) -> usize {
 41 |         self.0
 42 |     }
 43 |     #[allow(dead_code)]
 44 |     fn peek_mut(&mut self) -> &mut usize {
 45 |         &mut self.0
 46 |     }
 47 |     fn advance(&mut self) {
 48 |         self.0 += 1;
 49 |     }
 50 | }
 51 | 
 52 | #[derive(Debug, Clone)]
 53 | pub enum CfgNodeDescriptor {
 54 |     // Void nodes
 55 |     Start(Box<CfgStartNode>),
 56 |     End(Box<CfgEndNode>),
 57 | 
 58 |     // Primitives
 59 |     VariableDeclarationStatement(Box<CfgVariableDeclarationStatement>),
 60 |     ExpressionStatement(Box<CfgExpressionStatement>),
 61 |     PlaceholderStatement(Box<CfgPlaceholderStatement>),
 62 |     Break(Box<CfgBreakStatement>),
 63 |     Continue(Box<CfgContinueStatement>),
 64 |     Return(Box<CfgReturnStatement>),
 65 |     EmitStatement(Box<CfgEmitStatement>),
 66 |     RevertStatement(Box<CfgRevertStatement>),
 67 |     TryStatement(Box<CfgTryStatement>),
 68 |     InlineAssembly(Box<CfgInlineAssemblyStatement>),
 69 |     IfStatementCondition(Box<CfgIfStatementCondition>),
 70 |     WhileStatementCondition(Box<CfgWhileStatementCondition>),
 71 |     ForStatementCondition(Box<CfgForStatementCondition>),
 72 |     DoWhileStatementCondition(Box<CfgDoWhileStatementCondition>),
 73 | 
 74 |     // Reducibles
 75 |     Block(Box<CfgBlock>),
 76 |     UncheckedBlock(Box<CfgUncheckedBlock>),
 77 |     IfStatement(Box<CfgIfStatement>),
 78 |     WhileStatement(Box<CfgWhileStatement>),
 79 |     ForStatement(Box<CfgForStatement>),
 80 |     DoWhileStatement(Box<CfgDoWhileStatement>),
 81 | }
 82 | 
 83 | #[derive(Debug, Clone)]
 84 | pub struct CfgNode {
 85 |     /// Node ID
 86 |     pub id: CfgNodeId,
 87 |     /// Node descriptor
 88 |     pub nd: CfgNodeDescriptor,
 89 | }
 90 | 
 91 | /// Control fow graph
 92 | #[derive(Default, Debug)]
 93 | pub struct Cfg {
 94 |     /// Node registry
 95 |     pub nodes: HashMap<CfgNodeId, CfgNode>,
 96 | 
 97 |     /// Adjacency list representation of the Control Flow Graph
 98 |     pub adj_list: HashMap<CfgNodeId, Vec<CfgNodeId>>,
 99 | 
100 |     /// ID to construct the next node
101 |     next_available_id: CfgNodeId,
102 | 
103 |     /// Current reducibles
104 |     reduction_queue: VecDeque<CfgNodeId>,
105 | 
106 |     /// Lookup the corresponding End node for any start node (Start*, End*)
107 |     start_end_pairs: HashMap<CfgNodeId, CfgNodeId>,
108 | 
109 |     /// Lookup the Condition node for a given loop's start node
110 |     start_cond_pairs: HashMap<CfgNodeId, CfgNodeId>,
111 | 
112 |     /// Lookup the loop_expression node for a given for loop's start node
113 |     start_loop_expr: HashMap<CfgNodeId, CfgNodeId>,
114 | 
115 |     /// Lookup the StartFor given end of loop_expr
116 |     loop_expr_start: HashMap<CfgNodeId, CfgNodeId>,
117 | 
118 |     /// Lookup the StartWhile, StartDoWhile of a loop condition given condition
119 |     cond_start_pairs: HashMap<CfgNodeId, CfgNodeId>,
120 | }
121 | 
122 | pub trait CfgReduce {
123 |     fn reduce(&self, context: &WorkspaceContext, cfg: &mut Cfg) -> (CfgNodeId, CfgNodeId);
124 | }
125 | 
126 | impl Cfg {
127 |     pub fn new() -> Self {
128 |         Default::default()
129 |     }
130 |     pub fn total_nodes(&self) -> usize {
131 |         debug_assert_eq!(self.next_available_id.peek(), self.nodes.len());
132 |         self.next_available_id.peek()
133 |     }
134 |     pub fn total_edges(&self) -> usize {
135 |         self.adj_list.values().map(|conn| conn.len()).sum()
136 |     }
137 |     fn add_raw_node(&mut self, id: CfgNodeId, nd: CfgNodeDescriptor) {
138 |         let cfg_node = CfgNode { id, nd };
139 |         self.nodes.insert(id, cfg_node);
140 |     }
141 |     fn add_raw_directed_edge(&mut self, from: CfgNodeId, to: CfgNodeId) {
142 |         match self.adj_list.entry(from) {
143 |             Entry::Vacant(v) => {
144 |                 v.insert(vec![to]);
145 |             }
146 |             Entry::Occupied(mut o) => {
147 |                 o.get_mut().push(to);
148 |             }
149 |         };
150 |     }
151 |     fn remove_raw_directed_edge(&mut self, from: CfgNodeId, to: CfgNodeId) {
152 |         let existing_nodes = self.adj_list.get_mut(&from).expect("Relationship doesn't exist");
153 |         existing_nodes.retain_mut(|x| *x != to);
154 |     }
155 |     fn raw_predecessors(&self, id: CfgNodeId) -> Vec<CfgNodeId> {
156 |         let mut predecessors = vec![];
157 |         for (from, to_list) in &self.adj_list {
158 |             if to_list.contains(&id) {
159 |                 predecessors.push(*from);
160 |             }
161 |         }
162 |         predecessors
163 |     }
164 |     fn raw_successors(&self, id: CfgNodeId) -> Vec<CfgNodeId> {
165 |         let Some(successors) = self.adj_list.get(&id) else {
166 |             return Default::default();
167 |         };
168 |         successors.to_vec()
169 |     }
170 |     fn remove_raw_edges_involving(&mut self, node_id: CfgNodeId) {
171 |         // Remove all successors' edges starting from node_id
172 |         self.adj_list.remove(&node_id);
173 | 
174 |         // Remove edges ending at node_id
175 |         for (_, to_list) in self.adj_list.iter_mut() {
176 |             to_list.retain_mut(|x| *x != node_id);
177 |         }
178 |     }
179 |     fn reset_raw_successors(&mut self, node_id: CfgNodeId, to: CfgNodeId) {
180 |         // Remove edges starting from node_id
181 |         self.adj_list.remove(&node_id);
182 |         self.add_raw_directed_edge(node_id, to);
183 |     }
184 | }
185 | 
186 | impl Cfg {
187 |     /// Assigns a unique ID to the given node and adds it to the CFG
188 |     #[must_use]
189 |     pub fn add_node(&mut self, nd: CfgNodeDescriptor) -> CfgNodeId {
190 |         // Grab the currently available id
191 |         let node_id = self.next_available_id;
192 | 
193 |         // Increment the ID for next use
194 |         self.next_available_id.advance();
195 | 
196 |         // Check that node with that ID has not already been inserted
197 |         assert!(!self.nodes.contains_key(&node_id));
198 | 
199 |         // Queue the node to be reduced if it is reducible
200 |         if nd.kind() == CfgNodeKind::Reducible {
201 |             self.reduction_queue.push_back(node_id);
202 |         }
203 | 
204 |         // Add the node to the CFG
205 |         self.add_raw_node(node_id, nd);
206 | 
207 |         //Maintain map from ast to cfg
208 |         //if let Some(ast_id) = nd.reflect() {
209 |         //    self.ast_to_cfg.insert(ast_id, node_id);
210 |         //}
211 | 
212 |         // Check that node has been inserted
213 |         assert!(self.nodes.contains_key(&node_id));
214 | 
215 |         // Return the ID of the freshly inserted node
216 |         node_id
217 |     }
218 | 
219 |     /// Disconnects existing relationships (mostly used during reduction)
220 |     pub fn remove_flow_edge(&mut self, from: CfgNodeId, to: CfgNodeId) {
221 |         self.remove_raw_directed_edge(from, to);
222 |     }
223 | 
224 |     /// Connects the given two given nodes in the CFG
225 |     pub fn add_flow_edge(&mut self, from: CfgNodeId, to: CfgNodeId) {
226 |         self.add_raw_directed_edge(from, to);
227 |     }
228 | 
229 |     /// Reduce the reducible nodes stored the queue at the time of adding nodes
230 |     pub fn reduce(&mut self, context: &WorkspaceContext, reduction_candidate: CfgNodeId) {
231 |         // Step 0: Remove the node that's being reduced
232 |         let cfg_node =
233 |             self.nodes.remove(&reduction_candidate).expect("Reduction candidate doesn't exist");
234 | 
235 |         // Step 1: Get the predecessors
236 |         let predecessors = self.raw_predecessors(reduction_candidate);
237 | 
238 |         // Step 2: Get the successors
239 |         let successors = self.raw_successors(reduction_candidate);
240 | 
241 |         // Step 3: Remove existing predecessor relationships with reduction candidate to build new
242 |         // ones
243 |         for pred in &predecessors {
244 |             self.remove_flow_edge(*pred, cfg_node.id);
245 |         }
246 | 
247 |         // Step 4: Remove existing predecessor relationships with reduction candidate to build new
248 |         // ones
249 |         for succ in &successors {
250 |             self.remove_flow_edge(cfg_node.id, *succ);
251 |         }
252 | 
253 |         // Step 5: Get the (start s, end e) of the reduced cfg
254 |         let (start_id, end_id) = match cfg_node.nd {
255 |             // Voids and Primitives
256 |             CfgNodeDescriptor::Start(_)
257 |             | CfgNodeDescriptor::End(_)
258 |             | CfgNodeDescriptor::VariableDeclarationStatement(_)
259 |             | CfgNodeDescriptor::Break(_)
260 |             | CfgNodeDescriptor::Return(_)
261 |             | CfgNodeDescriptor::Continue(_)
262 |             | CfgNodeDescriptor::RevertStatement(_)
263 |             | CfgNodeDescriptor::PlaceholderStatement(_)
264 |             | CfgNodeDescriptor::InlineAssembly(_)
265 |             | CfgNodeDescriptor::TryStatement(_)
266 |             | CfgNodeDescriptor::EmitStatement(_)
267 |             | CfgNodeDescriptor::ExpressionStatement(_)
268 |             | CfgNodeDescriptor::WhileStatementCondition(_)
269 |             | CfgNodeDescriptor::ForStatementCondition(_)
270 |             | CfgNodeDescriptor::DoWhileStatementCondition(_)
271 |             | CfgNodeDescriptor::IfStatementCondition(_) => {
272 |                 unreachable!("Expect only reducible nodes")
273 |             }
274 | 
275 |             // Reducibles
276 |             CfgNodeDescriptor::Block(cfg_block) => cfg_block.reduce(context, self),
277 |             CfgNodeDescriptor::UncheckedBlock(cfg_block) => cfg_block.reduce(context, self),
278 |             CfgNodeDescriptor::IfStatement(cfg_block) => cfg_block.reduce(context, self),
279 |             CfgNodeDescriptor::WhileStatement(cfg_block) => cfg_block.reduce(context, self),
280 |             CfgNodeDescriptor::ForStatement(cfg_block) => cfg_block.reduce(context, self),
281 |             CfgNodeDescriptor::DoWhileStatement(cfg_block) => cfg_block.reduce(context, self),
282 |         };
283 | 
284 |         // Step 6: Connect all the predecessors to `s`
285 |         for pred in &predecessors {
286 |             self.add_flow_edge(*pred, start_id);
287 |         }
288 | 
289 |         // Step 7: Connect `e` to all the successors
290 |         for succ in &successors {
291 |             self.add_flow_edge(end_id, *succ);
292 |         }
293 | 
294 |         // Step 8: Remove existing connections with reduction_candidate
295 |         self.remove_raw_edges_involving(reduction_candidate);
296 |     }
297 | 
298 |     /// Corrects the flow of continue, break and return statements
299 |     ///
300 |     /// This is hard to perform at the time of reduction so it must be done post-reduction.
301 |     ///
302 |     /// Continue CFG Nodes should flow back the parent loop's condition node in case of a `while` or
303 |     /// `do while` and likewise to the parent loop's update expression in case of `for`.
304 |     ///
305 |     /// Break CFG Nodes should always flow to the end of the parent loop
306 |     ///
307 |     /// Return CFG Nodes should flow to the end of the function body or a modifier body
308 |     ///
309 |     /// Arguments
310 |     ///
311 |     /// * start_node - Node discovery starts here at this point.
312 |     ///
313 |     /// * end_node - Return statements flow to here. It also serves as a fallback for break and
314 |     ///   continue statements if parent loop is not found
315 |     pub fn calibrate_jump_statements_in_body(
316 |         &mut self,
317 |         start_node: CfgNodeId,
318 |         end_node: CfgNodeId,
319 |     ) {
320 |         // Jump sources
321 |         let mut continue_statements = vec![];
322 |         let mut break_statements = vec![];
323 |         let mut return_statements = vec![];
324 | 
325 |         let mut visited: HashSet<CfgNodeId> = Default::default();
326 | 
327 |         // Start node sets the scope of discovery
328 |         discover_jump_sources(
329 |             self,
330 |             start_node,
331 |             &mut visited,
332 |             &mut continue_statements,
333 |             &mut break_statements,
334 |             &mut return_statements,
335 |         );
336 | 
337 |         // Proposed Calibrations
338 |         let mut proposed_calibrations = vec![];
339 | 
340 |         for continue_statement in continue_statements {
341 |             let mut visited = Default::default();
342 |             let dest = find_jump_dest(self, continue_statement, &mut visited).unwrap_or_default();
343 |             proposed_calibrations.push(Calibration::ContinueShouldFlowTo(continue_statement, dest));
344 |         }
345 | 
346 |         for break_statement in break_statements {
347 |             let mut visited = Default::default();
348 |             let dest = find_jump_dest(self, break_statement, &mut visited).unwrap_or_default();
349 |             proposed_calibrations.push(Calibration::BreakShouldFlowTo(break_statement, dest));
350 |         }
351 | 
352 |         for return_statement in return_statements {
353 |             proposed_calibrations.push(Calibration::ReturnShouldFlowToEndNode(return_statement));
354 |         }
355 | 
356 |         // End node now comes into play
357 |         self.calibrate(proposed_calibrations, end_node);
358 |     }
359 | 
360 |     pub fn find_ending_counter_part(&self, start_node_id: CfgNodeId) -> CfgNodeId {
361 |         *self.start_end_pairs.get(&start_node_id).expect("ending counter part not found!")
362 |     }
363 | 
364 |     pub fn find_condition_node(&self, start_loop_id: CfgNodeId) -> CfgNodeId {
365 |         *self.start_cond_pairs.get(&start_loop_id).expect("could not resolve condition!")
366 |     }
367 | 
368 |     pub fn find_loop_expression_node(&self, start_loop_id: CfgNodeId) -> CfgNodeId {
369 |         *self.start_loop_expr.get(&start_loop_id).expect("could not resolve loop_expression!")
370 |     }
371 | }
372 | 
373 | impl Cfg {
374 |     /// Creates a new CFG from a given FunctionDefinition's body
375 |     ///
376 |     /// * Returns - Tuple containing Cfg, Start Node, End Node
377 |     ///
378 |     /// We don't yet have the ability to derive a CFG for the whole function because that involves
379 |     /// combining modifiers with the function body plus resolving internal functions, etc.
380 |     /// That's why the name here is from_function_body. We only create a CFG for the function's
381 |     /// body. It is static.
382 |     pub fn from_function_body(
383 |         context: &WorkspaceContext,
384 |         function_definition: &FunctionDefinition,
385 |     ) -> Option<(Cfg, CfgNodeId, CfgNodeId)> {
386 |         // Verify that the function has a body
387 |         let function_body_block = function_definition.body.as_ref()?;
388 | 
389 |         // Create an empty Cfg
390 |         let mut cfg = Self::new();
391 | 
392 |         // Add the starters for function body
393 |         let start = cfg.add_start_function_body_node(function_definition.id);
394 |         let end = cfg.add_end_function_body_node(function_definition.id);
395 |         cfg.start_end_pairs.insert(start, end);
396 | 
397 |         // Add the actual function body
398 |         let block = cfg.add_block_node(function_body_block);
399 | 
400 |         // Connect the flow edges
401 |         cfg.add_flow_edge(start, block);
402 |         cfg.add_flow_edge(block, end);
403 | 
404 |         // Reduction step (Standard thing to do after you assemble your Cfg skeleton)
405 |         while let Some(reduction_candidate) = cfg.reduction_queue.pop_front() {
406 |             cfg.reduce(context, reduction_candidate);
407 |         }
408 | 
409 |         // Calibration step (Standard thing to do after you reduce your CFG)
410 |         cfg.calibrate_jump_statements_in_body(start, end);
411 | 
412 |         // Return the CFG
413 |         Some((cfg, start, end))
414 |     }
415 | 
416 |     /// Same as [`Self::from_function_body`] but for modifiers
417 |     pub fn from_modifier_body(
418 |         context: &WorkspaceContext,
419 |         modifier_definition: &ModifierDefinition,
420 |     ) -> Option<(Cfg, CfgNodeId, CfgNodeId)> {
421 |         // Verify that the function has a body
422 |         let Some(modifier_body_block) = &modifier_definition.body else {
423 |             return None;
424 |         };
425 | 
426 |         // Create an empty Cfg
427 |         let mut cfg = Self::new();
428 | 
429 |         // Add the starters for function body
430 |         let start = cfg.add_start_modifier_body_node(modifier_definition.id);
431 |         let end = cfg.add_end_modifier_body_node(modifier_definition.id);
432 |         cfg.start_end_pairs.insert(start, end);
433 | 
434 |         // Add the actual function body
435 |         let block = cfg.add_block_node(modifier_body_block);
436 | 
437 |         // Connect the flow edges
438 |         cfg.add_flow_edge(start, block);
439 |         cfg.add_flow_edge(block, end);
440 | 
441 |         // Reduction step (Standard thing to do after you assemble your Cfg skeleton)
442 |         while let Some(reduction_candidate) = cfg.reduction_queue.pop_front() {
443 |             cfg.reduce(context, reduction_candidate);
444 |         }
445 | 
446 |         // Calibration step (Standard thing to do after you reduce your CFG)
447 |         cfg.calibrate_jump_statements_in_body(start, end);
448 | 
449 |         // Return the CFG
450 |         Some((cfg, start, end))
451 |     }
452 | }
453 | 
454 | // These methods help with recursion for detectors using the library
455 | impl CfgNodeId {
456 |     pub fn children(&self, cfg: &Cfg) -> Vec<CfgNodeId> {
457 |         cfg.raw_successors(*self)
458 |     }
459 | }
460 | 
461 | impl CfgNode {
462 |     pub fn children<'a>(&self, cfg: &'a Cfg) -> Vec<&'a CfgNode> {
463 |         let children_ids = cfg.raw_successors(self.id);
464 |         children_ids.into_iter().map(|c| cfg.nodes.get(&c).expect("cfg invalid!")).collect()
465 |     }
466 | }
467 | 
```

--------------------------------------------------------------------------------
/reports/hardhat-playground-report.md:
--------------------------------------------------------------------------------

```markdown
  1 | # Aderyn Analysis Report
  2 | 
  3 | This report was generated by [Aderyn](https://github.com/Cyfrin/aderyn), a static analysis tool built by [Cyfrin](https://cyfrin.io), a blockchain security company. This report is not a substitute for manual audit or security review. It should not be relied upon for any purpose other than to assist in the identification of potential security vulnerabilities.
  4 | # Table of Contents
  5 | 
  6 | - [Summary](#summary)
  7 |   - [Files Summary](#files-summary)
  8 |   - [Files Details](#files-details)
  9 |   - [Issue Summary](#issue-summary)
 10 | - [High Issues](#high-issues)
 11 |   - [H-1: `abi.encodePacked()` Hash Collision](#h-1-abiencodepacked-hash-collision)
 12 |   - [H-2: `delegatecall` to an Arbitrary Address](#h-2-delegatecall-to-an-arbitrary-address)
 13 |   - [H-3: Unchecked Low level calls](#h-3-unchecked-low-level-calls)
 14 | - [Low Issues](#low-issues)
 15 |   - [L-1: `delegatecall` in loop](#l-1-delegatecall-in-loop)
 16 |   - [L-2: `ecrecover` Signature Malleability](#l-2-ecrecover-signature-malleability)
 17 |   - [L-3: Unsafe ERC20 Operation](#l-3-unsafe-erc20-operation)
 18 |   - [L-4: Unspecific Solidity Pragma](#l-4-unspecific-solidity-pragma)
 19 |   - [L-5: Address State Variable Set Without Checks](#l-5-address-state-variable-set-without-checks)
 20 |   - [L-6: Public Function Not Used Internally](#l-6-public-function-not-used-internally)
 21 |   - [L-7: PUSH0 Opcode](#l-7-push0-opcode)
 22 |   - [L-8: Contract has TODO Comments](#l-8-contract-has-todo-comments)
 23 |   - [L-9: Unused State Variable](#l-9-unused-state-variable)
 24 |   - [L-10: Unused Import](#l-10-unused-import)
 25 |   - [L-11: State Variable Could Be Constant](#l-11-state-variable-could-be-constant)
 26 |   - [L-12: State Change Without Event](#l-12-state-change-without-event)
 27 |   - [L-13: State Variable Could Be Immutable](#l-13-state-variable-could-be-immutable)
 28 | 
 29 | 
 30 | # Summary
 31 | 
 32 | ## Files Summary
 33 | 
 34 | | Key | Value |
 35 | | --- | --- |
 36 | | .sol Files | 7 |
 37 | | Total nSLOC | 140 |
 38 | 
 39 | 
 40 | ## Files Details
 41 | 
 42 | | Filepath | nSLOC |
 43 | | --- | --- |
 44 | | contracts/Counter.sol | 20 |
 45 | | contracts/ExtendedInheritance.sol | 17 |
 46 | | contracts/IContractInheritance.sol | 4 |
 47 | | contracts/InheritanceBase.sol | 8 |
 48 | | contracts/KeccakContract.sol | 21 |
 49 | | contracts/Lock.sol | 20 |
 50 | | contracts/StateVariables.sol | 50 |
 51 | | **Total** | **140** |
 52 | 
 53 | 
 54 | ## Issue Summary
 55 | 
 56 | | Category | No. of Issues |
 57 | | --- | --- |
 58 | | High | 3 |
 59 | | Low | 13 |
 60 | 
 61 | 
 62 | # High Issues
 63 | 
 64 | ## H-1: `abi.encodePacked()` Hash Collision
 65 | 
 66 | abi.encodePacked() should not be used with dynamic types when passing the result to a hash function such as `keccak256()`. Use `abi.encode()` instead which will pad items to 32 bytes, preventing hash collisions: https://docs.soliditylang.org/en/v0.8.13/abi-spec.html#non-standard-packed-mode. (e.g. `abi.encodePacked(0x123,0x456)` => `0x123456` => `abi.encodePacked(0x1,0x23456)`, but `abi.encode(0x123,0x456)` => `0x0...1230...456`). Unless there is a compelling reason, `abi.encode` should be preferred. If there is only one argument to `abi.encodePacked()` it can often be cast to `bytes()` or `bytes32()` instead: https://ethereum.stackexchange.com/questions/30912/how-to-compare-strings-in-solidity#answer-82739. If all arguments are strings and or bytes, `bytes.concat()` should be used instead.
 67 | 
 68 | <details><summary>3 Found Instances</summary>
 69 | 
 70 | 
 71 | - Found in contracts/KeccakContract.sol [Line: 18](../tests/hardhat-js-playground/contracts/KeccakContract.sol#L18)
 72 | 
 73 | 	```solidity
 74 | 	        return keccak256(abi.encodePacked(a, b));
 75 | 	```
 76 | 
 77 | - Found in contracts/KeccakContract.sol [Line: 22](../tests/hardhat-js-playground/contracts/KeccakContract.sol#L22)
 78 | 
 79 | 	```solidity
 80 | 	        return keccak256(abi.encodePacked(a, b));
 81 | 	```
 82 | 
 83 | - Found in contracts/KeccakContract.sol [Line: 26](../tests/hardhat-js-playground/contracts/KeccakContract.sol#L26)
 84 | 
 85 | 	```solidity
 86 | 	        return keccak256(abi.encodePacked(a, b));
 87 | 	```
 88 | 
 89 | </details>
 90 | 
 91 | 
 92 | 
 93 | ## H-2: `delegatecall` to an Arbitrary Address
 94 | 
 95 | Making a `delegatecall` to an arbitrary address without any checks is dangerous. Consider adding requirements on the target address.
 96 | 
 97 | <details><summary>1 Found Instances</summary>
 98 | 
 99 | 
100 | - Found in contracts/ExtendedInheritance.sol [Line: 14](../tests/hardhat-js-playground/contracts/ExtendedInheritance.sol#L14)
101 | 
102 | 	```solidity
103 | 	    function doSomethingElse(address target) external {
104 | 	```
105 | 
106 | </details>
107 | 
108 | 
109 | 
110 | ## H-3: Unchecked Low level calls
111 | 
112 | The return value of the low-level call is not checked, so if the call fails, the Ether will be locked in the contract. If the low level is used to prevent blocking operations, consider logging failed calls. Ensure that the return value of a low-level call is checked or logged.
113 | 
114 | <details><summary>1 Found Instances</summary>
115 | 
116 | 
117 | - Found in contracts/ExtendedInheritance.sol [Line: 16](../tests/hardhat-js-playground/contracts/ExtendedInheritance.sol#L16)
118 | 
119 | 	```solidity
120 | 	            target.delegatecall(abi.encodeWithSignature("doSomething(uint256)", i));
121 | 	```
122 | 
123 | </details>
124 | 
125 | 
126 | 
127 | # Low Issues
128 | 
129 | ## L-1: `delegatecall` in loop
130 | 
131 | Using `delegatecall` in loop may consume excessive gas, or worse, lead to more severe issues.
132 | 
133 | <details><summary>1 Found Instances</summary>
134 | 
135 | 
136 | - Found in contracts/ExtendedInheritance.sol [Line: 15](../tests/hardhat-js-playground/contracts/ExtendedInheritance.sol#L15)
137 | 
138 | 	```solidity
139 | 	        for (uint256 i = 0; i < 3; i++) {
140 | 	```
141 | 
142 | </details>
143 | 
144 | 
145 | 
146 | ## L-2: `ecrecover` Signature Malleability
147 | 
148 | The `ecrecover` function is susceptible to signature malleability. This means that the same message can be signed in multiple ways, allowing an attacker to change the message signature without invalidating it. This can lead to unexpected behavior in smart contracts, such as the loss of funds or the ability to bypass access control. Consider using OpenZeppelin's ECDSA library instead of the built-in function.
149 | 
150 | <details><summary>1 Found Instances</summary>
151 | 
152 | 
153 | - Found in contracts/ExtendedInheritance.sol [Line: 21](../tests/hardhat-js-playground/contracts/ExtendedInheritance.sol#L21)
154 | 
155 | 	```solidity
156 | 	        return ecrecover(theHash, v, r, s);
157 | 	```
158 | 
159 | </details>
160 | 
161 | 
162 | 
163 | ## L-3: Unsafe ERC20 Operation
164 | 
165 | ERC20 functions may not behave as expected. For example: return values are not always meaningful. It is recommended to use OpenZeppelin's SafeERC20 library.
166 | 
167 | <details><summary>1 Found Instances</summary>
168 | 
169 | 
170 | - Found in contracts/Lock.sol [Line: 32](../tests/hardhat-js-playground/contracts/Lock.sol#L32)
171 | 
172 | 	```solidity
173 | 	        owner.transfer(address(this).balance);
174 | 	```
175 | 
176 | </details>
177 | 
178 | 
179 | 
180 | ## L-4: Unspecific Solidity Pragma
181 | 
182 | Consider using a specific version of Solidity in your contracts instead of a wide version. For example, instead of `pragma solidity ^0.8.0;`, use `pragma solidity 0.8.0;`
183 | 
184 | <details><summary>4 Found Instances</summary>
185 | 
186 | 
187 | - Found in contracts/Counter.sol [Line: 2](../tests/hardhat-js-playground/contracts/Counter.sol#L2)
188 | 
189 | 	```solidity
190 | 	pragma solidity ^0.8.13;
191 | 	```
192 | 
193 | - Found in contracts/IContractInheritance.sol [Line: 2](../tests/hardhat-js-playground/contracts/IContractInheritance.sol#L2)
194 | 
195 | 	```solidity
196 | 	pragma solidity >=0.8.0;
197 | 	```
198 | 
199 | - Found in contracts/InheritanceBase.sol [Line: 2](../tests/hardhat-js-playground/contracts/InheritanceBase.sol#L2)
200 | 
201 | 	```solidity
202 | 	pragma solidity ^0.8.0;
203 | 	```
204 | 
205 | - Found in contracts/Lock.sol [Line: 2](../tests/hardhat-js-playground/contracts/Lock.sol#L2)
206 | 
207 | 	```solidity
208 | 	pragma solidity ^0.8.20;
209 | 	```
210 | 
211 | </details>
212 | 
213 | 
214 | 
215 | ## L-5: Address State Variable Set Without Checks
216 | 
217 | Check for `address(0)` when assigning values to address state variables.
218 | 
219 | <details><summary>1 Found Instances</summary>
220 | 
221 | 
222 | - Found in contracts/StateVariables.sol [Line: 58](../tests/hardhat-js-playground/contracts/StateVariables.sol#L58)
223 | 
224 | 	```solidity
225 | 	        addr = newAddr;
226 | 	```
227 | 
228 | </details>
229 | 
230 | 
231 | 
232 | ## L-6: Public Function Not Used Internally
233 | 
234 | If a function is marked public but is not used internally, consider marking it as `external`.
235 | 
236 | <details><summary>7 Found Instances</summary>
237 | 
238 | 
239 | - Found in contracts/Counter.sol [Line: 7](../tests/hardhat-js-playground/contracts/Counter.sol#L7)
240 | 
241 | 	```solidity
242 | 	    function setNumber(uint256 newNumber) public {
243 | 	```
244 | 
245 | - Found in contracts/Lock.sol [Line: 23](../tests/hardhat-js-playground/contracts/Lock.sol#L23)
246 | 
247 | 	```solidity
248 | 	    function withdraw() public {
249 | 	```
250 | 
251 | - Found in contracts/StateVariables.sol [Line: 47](../tests/hardhat-js-playground/contracts/StateVariables.sol#L47)
252 | 
253 | 	```solidity
254 | 	    function setAddrNoZeroError(address newAddr) public {
255 | 	```
256 | 
257 | - Found in contracts/StateVariables.sol [Line: 52](../tests/hardhat-js-playground/contracts/StateVariables.sol#L52)
258 | 
259 | 	```solidity
260 | 	    function setAddrNoZeroRequire(address newAddr) public {
261 | 	```
262 | 
263 | - Found in contracts/StateVariables.sol [Line: 57](../tests/hardhat-js-playground/contracts/StateVariables.sol#L57)
264 | 
265 | 	```solidity
266 | 	    function setAddrNoCheck(address newAddr) public {
267 | 	```
268 | 
269 | - Found in contracts/StateVariables.sol [Line: 61](../tests/hardhat-js-playground/contracts/StateVariables.sol#L61)
270 | 
271 | 	```solidity
272 | 	    function setEmptyAlteredNumbers(uint256 _emptyAlteredPrivateNumber, uint256 _emptyAlteredInternalNumber, uint256 _emptyAlteredPublicNumber) public {
273 | 	```
274 | 
275 | - Found in contracts/StateVariables.sol [Line: 67](../tests/hardhat-js-playground/contracts/StateVariables.sol#L67)
276 | 
277 | 	```solidity
278 | 	    function setNonEmptyAlteredNumbers(uint256 _nonEmptyAlteredPrivateNumber, uint256 _nonEmptyAlteredInternalNumber, uint256 _nonEmptyAlteredPublicNumber) public {
279 | 	```
280 | 
281 | </details>
282 | 
283 | 
284 | 
285 | ## L-7: PUSH0 Opcode
286 | 
287 | Solc compiler version 0.8.20 switches the default target EVM version to Shanghai, which means that the generated bytecode will include PUSH0 opcodes. Be sure to select the appropriate EVM version in case you intend to deploy on a chain other than mainnet like L2 chains that may not support PUSH0, otherwise deployment of your contracts will fail.
288 | 
289 | <details><summary>7 Found Instances</summary>
290 | 
291 | 
292 | - Found in contracts/Counter.sol [Line: 2](../tests/hardhat-js-playground/contracts/Counter.sol#L2)
293 | 
294 | 	```solidity
295 | 	pragma solidity ^0.8.13;
296 | 	```
297 | 
298 | - Found in contracts/ExtendedInheritance.sol [Line: 2](../tests/hardhat-js-playground/contracts/ExtendedInheritance.sol#L2)
299 | 
300 | 	```solidity
301 | 	pragma solidity 0.8.20;
302 | 	```
303 | 
304 | - Found in contracts/IContractInheritance.sol [Line: 2](../tests/hardhat-js-playground/contracts/IContractInheritance.sol#L2)
305 | 
306 | 	```solidity
307 | 	pragma solidity >=0.8.0;
308 | 	```
309 | 
310 | - Found in contracts/InheritanceBase.sol [Line: 2](../tests/hardhat-js-playground/contracts/InheritanceBase.sol#L2)
311 | 
312 | 	```solidity
313 | 	pragma solidity ^0.8.0;
314 | 	```
315 | 
316 | - Found in contracts/KeccakContract.sol [Line: 2](../tests/hardhat-js-playground/contracts/KeccakContract.sol#L2)
317 | 
318 | 	```solidity
319 | 	pragma solidity 0.8.20;
320 | 	```
321 | 
322 | - Found in contracts/Lock.sol [Line: 2](../tests/hardhat-js-playground/contracts/Lock.sol#L2)
323 | 
324 | 	```solidity
325 | 	pragma solidity ^0.8.20;
326 | 	```
327 | 
328 | - Found in contracts/StateVariables.sol [Line: 2](../tests/hardhat-js-playground/contracts/StateVariables.sol#L2)
329 | 
330 | 	```solidity
331 | 	pragma solidity 0.8.20;
332 | 	```
333 | 
334 | </details>
335 | 
336 | 
337 | 
338 | ## L-8: Contract has TODO Comments
339 | 
340 | Contract contains comments with TODOS. Consider implementing or removing them.
341 | 
342 | <details><summary>1 Found Instances</summary>
343 | 
344 | 
345 | - Found in contracts/Counter.sol [Line: 4](../tests/hardhat-js-playground/contracts/Counter.sol#L4)
346 | 
347 | 	```solidity
348 | 	contract Counter {
349 | 	```
350 | 
351 | </details>
352 | 
353 | 
354 | 
355 | ## L-9: Unused State Variable
356 | 
357 | State variable appears to be unused. No analysis has been performed to see if any inline assembly references it. Consider removing this unused variable.
358 | 
359 | <details><summary>6 Found Instances</summary>
360 | 
361 | 
362 | - Found in contracts/StateVariables.sol [Line: 8](../tests/hardhat-js-playground/contracts/StateVariables.sol#L8)
363 | 
364 | 	```solidity
365 | 	    uint256 private staticPrivateNumber;
366 | 	```
367 | 
368 | - Found in contracts/StateVariables.sol [Line: 9](../tests/hardhat-js-playground/contracts/StateVariables.sol#L9)
369 | 
370 | 	```solidity
371 | 	    uint256 internal staticInternalNumber;
372 | 	```
373 | 
374 | - Found in contracts/StateVariables.sol [Line: 13](../tests/hardhat-js-playground/contracts/StateVariables.sol#L13)
375 | 
376 | 	```solidity
377 | 	    uint256 private staticNonEmptyPrivateNumber = 1;
378 | 	```
379 | 
380 | - Found in contracts/StateVariables.sol [Line: 14](../tests/hardhat-js-playground/contracts/StateVariables.sol#L14)
381 | 
382 | 	```solidity
383 | 	    uint256 internal staticNonEmptyInternalNumber = 2;
384 | 	```
385 | 
386 | - Found in contracts/StateVariables.sol [Line: 28](../tests/hardhat-js-playground/contracts/StateVariables.sol#L28)
387 | 
388 | 	```solidity
389 | 	    uint256 private constant PRIVATE_CONSTANT = 1;
390 | 	```
391 | 
392 | - Found in contracts/StateVariables.sol [Line: 29](../tests/hardhat-js-playground/contracts/StateVariables.sol#L29)
393 | 
394 | 	```solidity
395 | 	    uint256 internal constant INTERNAL_CONSTANT = 2;
396 | 	```
397 | 
398 | </details>
399 | 
400 | 
401 | 
402 | ## L-10: Unused Import
403 | 
404 | Redundant import statement. Consider removing it.
405 | 
406 | <details><summary>1 Found Instances</summary>
407 | 
408 | 
409 | - Found in contracts/StateVariables.sol [Line: 4](../tests/hardhat-js-playground/contracts/StateVariables.sol#L4)
410 | 
411 | 	```solidity
412 | 	import {Counter} from "./Counter.sol";
413 | 	```
414 | 
415 | </details>
416 | 
417 | 
418 | 
419 | ## L-11: State Variable Could Be Constant
420 | 
421 | State variables that are not updated following deployment should be declared constant to save gas. Add the `constant` attribute to state variables that never change.
422 | 
423 | <details><summary>3 Found Instances</summary>
424 | 
425 | 
426 | - Found in contracts/StateVariables.sol [Line: 13](../tests/hardhat-js-playground/contracts/StateVariables.sol#L13)
427 | 
428 | 	```solidity
429 | 	    uint256 private staticNonEmptyPrivateNumber = 1;
430 | 	```
431 | 
432 | - Found in contracts/StateVariables.sol [Line: 14](../tests/hardhat-js-playground/contracts/StateVariables.sol#L14)
433 | 
434 | 	```solidity
435 | 	    uint256 internal staticNonEmptyInternalNumber = 2;
436 | 	```
437 | 
438 | - Found in contracts/StateVariables.sol [Line: 15](../tests/hardhat-js-playground/contracts/StateVariables.sol#L15)
439 | 
440 | 	```solidity
441 | 	    uint256 public staticNonEmptyPublicNumber = 3;
442 | 	```
443 | 
444 | </details>
445 | 
446 | 
447 | 
448 | ## L-12: State Change Without Event
449 | 
450 | There are state variable changes in this function but no event is emitted. Consider emitting an event to enable offchain indexers to track the changes.
451 | 
452 | <details><summary>10 Found Instances</summary>
453 | 
454 | 
455 | - Found in contracts/Counter.sol [Line: 7](../tests/hardhat-js-playground/contracts/Counter.sol#L7)
456 | 
457 | 	```solidity
458 | 	    function setNumber(uint256 newNumber) public {
459 | 	```
460 | 
461 | - Found in contracts/Counter.sol [Line: 11](../tests/hardhat-js-playground/contracts/Counter.sol#L11)
462 | 
463 | 	```solidity
464 | 	    function increment() public {
465 | 	```
466 | 
467 | - Found in contracts/Counter.sol [Line: 16](../tests/hardhat-js-playground/contracts/Counter.sol#L16)
468 | 
469 | 	```solidity
470 | 	    function callIncrement() external {
471 | 	```
472 | 
473 | - Found in contracts/Counter.sol [Line: 21](../tests/hardhat-js-playground/contracts/Counter.sol#L21)
474 | 
475 | 	```solidity
476 | 	    function incrementByTwoMagic() external {
477 | 	```
478 | 
479 | - Found in contracts/Counter.sol [Line: 28](../tests/hardhat-js-playground/contracts/Counter.sol#L28)
480 | 
481 | 	```solidity
482 | 	    function incrementByTwoConstant() external {
483 | 	```
484 | 
485 | - Found in contracts/StateVariables.sol [Line: 47](../tests/hardhat-js-playground/contracts/StateVariables.sol#L47)
486 | 
487 | 	```solidity
488 | 	    function setAddrNoZeroError(address newAddr) public {
489 | 	```
490 | 
491 | - Found in contracts/StateVariables.sol [Line: 52](../tests/hardhat-js-playground/contracts/StateVariables.sol#L52)
492 | 
493 | 	```solidity
494 | 	    function setAddrNoZeroRequire(address newAddr) public {
495 | 	```
496 | 
497 | - Found in contracts/StateVariables.sol [Line: 57](../tests/hardhat-js-playground/contracts/StateVariables.sol#L57)
498 | 
499 | 	```solidity
500 | 	    function setAddrNoCheck(address newAddr) public {
501 | 	```
502 | 
503 | - Found in contracts/StateVariables.sol [Line: 61](../tests/hardhat-js-playground/contracts/StateVariables.sol#L61)
504 | 
505 | 	```solidity
506 | 	    function setEmptyAlteredNumbers(uint256 _emptyAlteredPrivateNumber, uint256 _emptyAlteredInternalNumber, uint256 _emptyAlteredPublicNumber) public {
507 | 	```
508 | 
509 | - Found in contracts/StateVariables.sol [Line: 67](../tests/hardhat-js-playground/contracts/StateVariables.sol#L67)
510 | 
511 | 	```solidity
512 | 	    function setNonEmptyAlteredNumbers(uint256 _nonEmptyAlteredPrivateNumber, uint256 _nonEmptyAlteredInternalNumber, uint256 _nonEmptyAlteredPublicNumber) public {
513 | 	```
514 | 
515 | </details>
516 | 
517 | 
518 | 
519 | ## L-13: State Variable Could Be Immutable
520 | 
521 | State variables that are only changed in the constructor should be declared immutable to save gas. Add the `immutable` attribute to state variables that are only changed in the constructor
522 | 
523 | <details><summary>2 Found Instances</summary>
524 | 
525 | 
526 | - Found in contracts/Lock.sol [Line: 8](../tests/hardhat-js-playground/contracts/Lock.sol#L8)
527 | 
528 | 	```solidity
529 | 	    uint public unlockTime;
530 | 	```
531 | 
532 | - Found in contracts/Lock.sol [Line: 9](../tests/hardhat-js-playground/contracts/Lock.sol#L9)
533 | 
534 | 	```solidity
535 | 	    address payable public owner;
536 | 	```
537 | 
538 | </details>
539 | 
540 | 
541 | 
542 | 
```

--------------------------------------------------------------------------------
/benchmarks/delegate-call-in-loop/report/regression.svg:
--------------------------------------------------------------------------------

```
  1 | <svg width="960" height="540" viewBox="0 0 960 540" xmlns="http://www.w3.org/2000/svg">
  2 | <text x="480" y="32" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="16.129032258064516" opacity="1" fill="#000000">
  3 | delegate-call-in-loop
  4 | </text>
  5 | <text x="27" y="263" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000" transform="rotate(270, 27, 263)">
  6 | Total sample time (ms)
  7 | </text>
  8 | <text x="510" y="513" dy="-0.5ex" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
  9 | Iterations (x 10^3)
 10 | </text>
 11 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="183" y1="472" x2="183" y2="53"/>
 12 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="289" y1="472" x2="289" y2="53"/>
 13 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="394" y1="472" x2="394" y2="53"/>
 14 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="499" y1="472" x2="499" y2="53"/>
 15 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="605" y1="472" x2="605" y2="53"/>
 16 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="710" y1="472" x2="710" y2="53"/>
 17 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="816" y1="472" x2="816" y2="53"/>
 18 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="921" y1="472" x2="921" y2="53"/>
 19 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="431" x2="932" y2="431"/>
 20 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="385" x2="932" y2="385"/>
 21 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="338" x2="932" y2="338"/>
 22 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="292" x2="932" y2="292"/>
 23 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="245" x2="932" y2="245"/>
 24 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="199" x2="932" y2="199"/>
 25 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="153" x2="932" y2="153"/>
 26 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="106" x2="932" y2="106"/>
 27 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="60" x2="932" y2="60"/>
 28 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="86,53 86,472 "/>
 29 | <text x="77" y="431" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 30 | 10.0
 31 | </text>
 32 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,431 86,431 "/>
 33 | <text x="77" y="385" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 34 | 20.0
 35 | </text>
 36 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,385 86,385 "/>
 37 | <text x="77" y="338" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 38 | 30.0
 39 | </text>
 40 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,338 86,338 "/>
 41 | <text x="77" y="292" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 42 | 40.0
 43 | </text>
 44 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,292 86,292 "/>
 45 | <text x="77" y="245" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 46 | 50.0
 47 | </text>
 48 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,245 86,245 "/>
 49 | <text x="77" y="199" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 50 | 60.0
 51 | </text>
 52 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,199 86,199 "/>
 53 | <text x="77" y="153" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 54 | 70.0
 55 | </text>
 56 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,153 86,153 "/>
 57 | <text x="77" y="106" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 58 | 80.0
 59 | </text>
 60 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,106 86,106 "/>
 61 | <text x="77" y="60" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 62 | 90.0
 63 | </text>
 64 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,60 86,60 "/>
 65 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="87,473 932,473 "/>
 66 | <text x="183" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 67 | 1
 68 | </text>
 69 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="183,473 183,478 "/>
 70 | <text x="289" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 71 | 2
 72 | </text>
 73 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="289,473 289,478 "/>
 74 | <text x="394" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 75 | 3
 76 | </text>
 77 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="394,473 394,478 "/>
 78 | <text x="499" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 79 | 4
 80 | </text>
 81 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="499,473 499,478 "/>
 82 | <text x="605" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 83 | 5
 84 | </text>
 85 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="605,473 605,478 "/>
 86 | <text x="710" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 87 | 6
 88 | </text>
 89 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="710,473 710,478 "/>
 90 | <text x="816" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 91 | 7
 92 | </text>
 93 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="816,473 816,478 "/>
 94 | <text x="921" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 95 | 8
 96 | </text>
 97 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="921,473 921,478 "/>
 98 | <circle cx="87" cy="472" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
 99 | <circle cx="95" cy="465" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
100 | <circle cx="104" cy="464" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
101 | <circle cx="112" cy="461" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
102 | <circle cx="121" cy="455" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
103 | <circle cx="129" cy="452" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
104 | <circle cx="138" cy="446" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
105 | <circle cx="146" cy="444" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
106 | <circle cx="155" cy="440" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
107 | <circle cx="163" cy="435" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
108 | <circle cx="172" cy="432" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
109 | <circle cx="180" cy="427" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
110 | <circle cx="189" cy="423" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
111 | <circle cx="197" cy="418" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
112 | <circle cx="206" cy="411" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
113 | <circle cx="215" cy="405" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
114 | <circle cx="223" cy="401" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
115 | <circle cx="232" cy="388" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
116 | <circle cx="240" cy="391" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
117 | <circle cx="249" cy="381" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
118 | <circle cx="257" cy="389" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
119 | <circle cx="266" cy="382" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
120 | <circle cx="274" cy="380" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
121 | <circle cx="283" cy="379" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
122 | <circle cx="291" cy="374" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
123 | <circle cx="300" cy="369" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
124 | <circle cx="308" cy="363" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
125 | <circle cx="317" cy="361" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
126 | <circle cx="325" cy="355" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
127 | <circle cx="334" cy="347" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
128 | <circle cx="343" cy="343" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
129 | <circle cx="351" cy="343" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
130 | <circle cx="360" cy="336" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
131 | <circle cx="368" cy="332" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
132 | <circle cx="377" cy="328" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
133 | <circle cx="385" cy="323" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
134 | <circle cx="394" cy="319" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
135 | <circle cx="402" cy="315" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
136 | <circle cx="411" cy="311" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
137 | <circle cx="419" cy="305" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
138 | <circle cx="428" cy="302" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
139 | <circle cx="436" cy="298" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
140 | <circle cx="445" cy="294" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
141 | <circle cx="454" cy="289" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
142 | <circle cx="462" cy="275" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
143 | <circle cx="471" cy="282" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
144 | <circle cx="479" cy="279" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
145 | <circle cx="488" cy="273" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
146 | <circle cx="496" cy="268" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
147 | <circle cx="505" cy="263" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
148 | <circle cx="513" cy="257" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
149 | <circle cx="522" cy="263" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
150 | <circle cx="530" cy="261" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
151 | <circle cx="539" cy="255" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
152 | <circle cx="547" cy="252" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
153 | <circle cx="556" cy="236" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
154 | <circle cx="564" cy="240" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
155 | <circle cx="573" cy="234" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
156 | <circle cx="582" cy="228" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
157 | <circle cx="590" cy="222" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
158 | <circle cx="599" cy="217" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
159 | <circle cx="607" cy="214" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
160 | <circle cx="616" cy="208" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
161 | <circle cx="624" cy="205" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
162 | <circle cx="633" cy="196" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
163 | <circle cx="641" cy="204" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
164 | <circle cx="650" cy="197" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
165 | <circle cx="658" cy="191" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
166 | <circle cx="667" cy="187" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
167 | <circle cx="675" cy="183" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
168 | <circle cx="684" cy="185" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
169 | <circle cx="693" cy="181" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
170 | <circle cx="701" cy="167" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
171 | <circle cx="710" cy="167" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
172 | <circle cx="718" cy="163" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
173 | <circle cx="727" cy="158" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
174 | <circle cx="735" cy="148" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
175 | <circle cx="744" cy="140" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
176 | <circle cx="752" cy="114" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
177 | <circle cx="761" cy="129" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
178 | <circle cx="769" cy="134" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
179 | <circle cx="778" cy="132" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
180 | <circle cx="786" cy="134" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
181 | <circle cx="795" cy="121" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
182 | <circle cx="803" cy="117" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
183 | <circle cx="812" cy="108" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
184 | <circle cx="821" cy="99" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
185 | <circle cx="829" cy="105" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
186 | <circle cx="838" cy="97" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
187 | <circle cx="846" cy="93" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
188 | <circle cx="855" cy="89" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
189 | <circle cx="863" cy="85" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
190 | <circle cx="872" cy="82" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
191 | <circle cx="880" cy="89" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
192 | <circle cx="889" cy="83" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
193 | <circle cx="897" cy="70" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
194 | <circle cx="906" cy="63" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
195 | <circle cx="914" cy="54" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
196 | <circle cx="923" cy="60" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
197 | <circle cx="932" cy="53" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
198 | <polyline fill="none" opacity="1" stroke="#1F78B4" stroke-width="1" points="87,473 932,53 "/>
199 | <polygon opacity="0.25" fill="#1F78B4" points="87,473 932,55 932,53 "/>
200 | <text x="132" y="68" dy="0.76em" text-anchor="start" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
201 | Sample
202 | </text>
203 | <text x="132" y="83" dy="0.76em" text-anchor="start" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
204 | Linear regression
205 | </text>
206 | <text x="132" y="98" dy="0.76em" text-anchor="start" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
207 | Confidence interval
208 | </text>
209 | <circle cx="112" cy="73" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
210 | <polyline fill="none" opacity="1" stroke="#1F78B4" stroke-width="2" points="102,88 122,88 "/>
211 | <rect x="102" y="98" width="20" height="10" opacity="0.25" fill="#1F78B4" stroke="none"/>
212 | </svg>
213 | 
```

--------------------------------------------------------------------------------
/benchmarks/unindexed-events/report/regression.svg:
--------------------------------------------------------------------------------

```
  1 | <svg width="960" height="540" viewBox="0 0 960 540" xmlns="http://www.w3.org/2000/svg">
  2 | <text x="480" y="32" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="16.129032258064516" opacity="1" fill="#000000">
  3 | unindexed-events
  4 | </text>
  5 | <text x="27" y="263" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000" transform="rotate(270, 27, 263)">
  6 | Total sample time (ms)
  7 | </text>
  8 | <text x="510" y="513" dy="-0.5ex" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
  9 | Iterations (x 10^3)
 10 | </text>
 11 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="200" y1="472" x2="200" y2="53"/>
 12 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="322" y1="472" x2="322" y2="53"/>
 13 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="444" y1="472" x2="444" y2="53"/>
 14 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="566" y1="472" x2="566" y2="53"/>
 15 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="688" y1="472" x2="688" y2="53"/>
 16 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="810" y1="472" x2="810" y2="53"/>
 17 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="932" y1="472" x2="932" y2="53"/>
 18 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="435" x2="932" y2="435"/>
 19 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="393" x2="932" y2="393"/>
 20 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="352" x2="932" y2="352"/>
 21 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="310" x2="932" y2="310"/>
 22 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="268" x2="932" y2="268"/>
 23 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="227" x2="932" y2="227"/>
 24 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="185" x2="932" y2="185"/>
 25 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="144" x2="932" y2="144"/>
 26 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="102" x2="932" y2="102"/>
 27 | <line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="60" x2="932" y2="60"/>
 28 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="86,53 86,472 "/>
 29 | <text x="77" y="435" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 30 | 10.0
 31 | </text>
 32 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,435 86,435 "/>
 33 | <text x="77" y="393" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 34 | 20.0
 35 | </text>
 36 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,393 86,393 "/>
 37 | <text x="77" y="352" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 38 | 30.0
 39 | </text>
 40 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,352 86,352 "/>
 41 | <text x="77" y="310" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 42 | 40.0
 43 | </text>
 44 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,310 86,310 "/>
 45 | <text x="77" y="268" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 46 | 50.0
 47 | </text>
 48 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,268 86,268 "/>
 49 | <text x="77" y="227" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 50 | 60.0
 51 | </text>
 52 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,227 86,227 "/>
 53 | <text x="77" y="185" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 54 | 70.0
 55 | </text>
 56 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,185 86,185 "/>
 57 | <text x="77" y="144" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 58 | 80.0
 59 | </text>
 60 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,144 86,144 "/>
 61 | <text x="77" y="102" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 62 | 90.0
 63 | </text>
 64 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,102 86,102 "/>
 65 | <text x="77" y="60" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 66 | 100.0
 67 | </text>
 68 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,60 86,60 "/>
 69 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="87,473 932,473 "/>
 70 | <text x="200" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 71 | 0.5
 72 | </text>
 73 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="200,473 200,478 "/>
 74 | <text x="322" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 75 | 1
 76 | </text>
 77 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="322,473 322,478 "/>
 78 | <text x="444" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 79 | 1.5
 80 | </text>
 81 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="444,473 444,478 "/>
 82 | <text x="566" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 83 | 2
 84 | </text>
 85 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="566,473 566,478 "/>
 86 | <text x="688" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 87 | 2.5
 88 | </text>
 89 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="688,473 688,478 "/>
 90 | <text x="810" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 91 | 3
 92 | </text>
 93 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="810,473 810,478 "/>
 94 | <text x="932" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 95 | 3.5
 96 | </text>
 97 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="932,473 932,478 "/>
 98 | <circle cx="87" cy="472" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
 99 | <circle cx="95" cy="468" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
100 | <circle cx="104" cy="463" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
101 | <circle cx="112" cy="461" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
102 | <circle cx="121" cy="456" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
103 | <circle cx="129" cy="452" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
104 | <circle cx="138" cy="449" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
105 | <circle cx="146" cy="445" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
106 | <circle cx="155" cy="441" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
107 | <circle cx="163" cy="437" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
108 | <circle cx="172" cy="432" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
109 | <circle cx="180" cy="429" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
110 | <circle cx="189" cy="424" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
111 | <circle cx="197" cy="421" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
112 | <circle cx="206" cy="416" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
113 | <circle cx="215" cy="412" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
114 | <circle cx="223" cy="409" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
115 | <circle cx="232" cy="402" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
116 | <circle cx="240" cy="400" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
117 | <circle cx="249" cy="396" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
118 | <circle cx="257" cy="392" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
119 | <circle cx="266" cy="382" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
120 | <circle cx="274" cy="374" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
121 | <circle cx="283" cy="364" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
122 | <circle cx="291" cy="342" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
123 | <circle cx="300" cy="351" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
124 | <circle cx="308" cy="353" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
125 | <circle cx="317" cy="347" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
126 | <circle cx="325" cy="322" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
127 | <circle cx="334" cy="342" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
128 | <circle cx="343" cy="349" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
129 | <circle cx="351" cy="347" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
130 | <circle cx="360" cy="342" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
131 | <circle cx="368" cy="338" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
132 | <circle cx="377" cy="334" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
133 | <circle cx="385" cy="330" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
134 | <circle cx="394" cy="325" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
135 | <circle cx="402" cy="319" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
136 | <circle cx="411" cy="318" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
137 | <circle cx="419" cy="314" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
138 | <circle cx="428" cy="308" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
139 | <circle cx="436" cy="304" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
140 | <circle cx="445" cy="299" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
141 | <circle cx="454" cy="297" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
142 | <circle cx="462" cy="293" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
143 | <circle cx="471" cy="288" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
144 | <circle cx="479" cy="285" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
145 | <circle cx="488" cy="282" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
146 | <circle cx="496" cy="279" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
147 | <circle cx="505" cy="276" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
148 | <circle cx="513" cy="274" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
149 | <circle cx="522" cy="267" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
150 | <circle cx="530" cy="247" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
151 | <circle cx="539" cy="230" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
152 | <circle cx="547" cy="242" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
153 | <circle cx="556" cy="237" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
154 | <circle cx="564" cy="236" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
155 | <circle cx="573" cy="237" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
156 | <circle cx="582" cy="233" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
157 | <circle cx="590" cy="226" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
158 | <circle cx="599" cy="224" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
159 | <circle cx="607" cy="221" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
160 | <circle cx="616" cy="216" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
161 | <circle cx="624" cy="212" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
162 | <circle cx="633" cy="208" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
163 | <circle cx="641" cy="203" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
164 | <circle cx="650" cy="197" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
165 | <circle cx="658" cy="193" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
166 | <circle cx="667" cy="188" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
167 | <circle cx="675" cy="189" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
168 | <circle cx="684" cy="185" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
169 | <circle cx="693" cy="178" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
170 | <circle cx="701" cy="175" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
171 | <circle cx="710" cy="173" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
172 | <circle cx="718" cy="170" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
173 | <circle cx="727" cy="162" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
174 | <circle cx="735" cy="167" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
175 | <circle cx="744" cy="168" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
176 | <circle cx="752" cy="155" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
177 | <circle cx="761" cy="126" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
178 | <circle cx="769" cy="126" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
179 | <circle cx="778" cy="117" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
180 | <circle cx="786" cy="122" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
181 | <circle cx="795" cy="131" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
182 | <circle cx="803" cy="126" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
183 | <circle cx="812" cy="117" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
184 | <circle cx="821" cy="114" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
185 | <circle cx="829" cy="115" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
186 | <circle cx="838" cy="109" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
187 | <circle cx="846" cy="105" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
188 | <circle cx="855" cy="99" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
189 | <circle cx="863" cy="98" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
190 | <circle cx="872" cy="93" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
191 | <circle cx="880" cy="76" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
192 | <circle cx="889" cy="83" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
193 | <circle cx="897" cy="78" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
194 | <circle cx="906" cy="74" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
195 | <circle cx="914" cy="67" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
196 | <circle cx="923" cy="62" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
197 | <circle cx="932" cy="53" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
198 | <polyline fill="none" opacity="1" stroke="#1F78B4" stroke-width="1" points="87,473 932,60 "/>
199 | <polygon opacity="0.25" fill="#1F78B4" points="87,473 932,62 932,58 "/>
200 | <text x="132" y="68" dy="0.76em" text-anchor="start" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
201 | Sample
202 | </text>
203 | <text x="132" y="83" dy="0.76em" text-anchor="start" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
204 | Linear regression
205 | </text>
206 | <text x="132" y="98" dy="0.76em" text-anchor="start" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
207 | Confidence interval
208 | </text>
209 | <circle cx="112" cy="73" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
210 | <polyline fill="none" opacity="1" stroke="#1F78B4" stroke-width="2" points="102,88 122,88 "/>
211 | <rect x="102" y="98" width="20" height="10" opacity="0.25" fill="#1F78B4" stroke="none"/>
212 | </svg>
213 | 
```
Page 92/103FirstPrevNextLast