#
tokens: 49372/50000 90/1140 files (page 2/94)
lines: off (toggle) GitHub
raw markdown copy
This is page 2 of 94. Use http://codebase.md/cyfrin/aderyn?lines=false&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/unspecific-solidity-pragma/base/estimates.json:
--------------------------------------------------------------------------------

```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":16587.094771438966,"upper_bound":16857.32975464398},"point_estimate":16719.532949636607,"standard_error":68.86085825163204},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":16599.775702475148,"upper_bound":17113.219463753725},"point_estimate":16713.92115303983,"standard_error":101.33154228218},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":541.8638457157243,"upper_bound":802.7861053189785},"point_estimate":708.0666648794518,"standard_error":59.06149488983156},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":16089.374554265001,"upper_bound":16303.002270459601},"point_estimate":16187.91407630259,"standard_error":54.516956696773526},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":565.3284790961482,"upper_bound":821.302077321748},"point_estimate":691.3088063746786,"standard_error":66.25367868067993}}
```

--------------------------------------------------------------------------------
/benchmarks/unspecific-solidity-pragma/new/estimates.json:
--------------------------------------------------------------------------------

```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":16587.094771438966,"upper_bound":16857.32975464398},"point_estimate":16719.532949636607,"standard_error":68.86085825163204},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":16599.775702475148,"upper_bound":17113.219463753725},"point_estimate":16713.92115303983,"standard_error":101.33154228218},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":541.8638457157243,"upper_bound":802.7861053189785},"point_estimate":708.0666648794518,"standard_error":59.06149488983156},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":16089.374554265001,"upper_bound":16303.002270459601},"point_estimate":16187.91407630259,"standard_error":54.516956696773526},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":565.3284790961482,"upper_bound":821.302077321748},"point_estimate":691.3088063746786,"standard_error":66.25367868067993}}
```

--------------------------------------------------------------------------------
/benchmarks/arbitrary-transfer-from/base/estimates.json:
--------------------------------------------------------------------------------

```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":60730.4537551632,"upper_bound":62773.80829111178},"point_estimate":61639.571281831384,"standard_error":526.8375943968578},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":60756.724731182796,"upper_bound":62110.36923076923},"point_estimate":61974.48681657849,"standard_error":348.10410555000414},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":1357.0804106828684,"upper_bound":3819.3975480037075},"point_estimate":2417.255023667641,"standard_error":618.421304252327},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":58348.00997297766,"upper_bound":59530.71548877345},"point_estimate":58900.58618294665,"standard_error":302.3527794913396},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":2590.843023460305,"upper_bound":7892.2232144866375},"point_estimate":5291.754217872908,"standard_error":1460.4985574551965}}
```

--------------------------------------------------------------------------------
/benchmarks/arbitrary-transfer-from/new/estimates.json:
--------------------------------------------------------------------------------

```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":60730.4537551632,"upper_bound":62773.80829111178},"point_estimate":61639.571281831384,"standard_error":526.8375943968578},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":60756.724731182796,"upper_bound":62110.36923076923},"point_estimate":61974.48681657849,"standard_error":348.10410555000414},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":1357.0804106828684,"upper_bound":3819.3975480037075},"point_estimate":2417.255023667641,"standard_error":618.421304252327},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":58348.00997297766,"upper_bound":59530.71548877345},"point_estimate":58900.58618294665,"standard_error":302.3527794913396},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":2590.843023460305,"upper_bound":7892.2232144866375},"point_estimate":5291.754217872908,"standard_error":1460.4985574551965}}
```

--------------------------------------------------------------------------------
/benchmarks/unprotected-initializer/base/estimates.json:
--------------------------------------------------------------------------------

```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":32956.51396678968,"upper_bound":33890.64726950043},"point_estimate":33392.94594025474,"standard_error":237.67153378243583},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":32510.2208994709,"upper_bound":33427.144982993195},"point_estimate":32987.31313511757,"standard_error":244.484249430916},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":1114.521205643404,"upper_bound":2103.765838230395},"point_estimate":1543.0277491780398,"standard_error":266.5800423724992},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":32142.605570103566,"upper_bound":33251.40853618999},"point_estimate":32661.521296628598,"standard_error":283.74787120501304},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":1605.7252950223742,"upper_bound":3276.983183487452},"point_estimate":2384.147414048643,"standard_error":476.4075075620204}}
```

--------------------------------------------------------------------------------
/benchmarks/unprotected-initializer/new/estimates.json:
--------------------------------------------------------------------------------

```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":32956.51396678968,"upper_bound":33890.64726950043},"point_estimate":33392.94594025474,"standard_error":237.67153378243583},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":32510.2208994709,"upper_bound":33427.144982993195},"point_estimate":32987.31313511757,"standard_error":244.484249430916},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":1114.521205643404,"upper_bound":2103.765838230395},"point_estimate":1543.0277491780398,"standard_error":266.5800423724992},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":32142.605570103566,"upper_bound":33251.40853618999},"point_estimate":32661.521296628598,"standard_error":283.74787120501304},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":1605.7252950223742,"upper_bound":3276.983183487452},"point_estimate":2384.147414048643,"standard_error":476.4075075620204}}
```

--------------------------------------------------------------------------------
/benchmarks/deprecated-oz-functions/base/estimates.json:
--------------------------------------------------------------------------------

```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":265733.7071161058,"upper_bound":285339.5708761706},"point_estimate":274325.5023694791,"standard_error":5047.357163083142},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":257836.31666666668,"upper_bound":263832.72754329},"point_estimate":261299.82083333333,"standard_error":1665.2589482251567},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":7565.81246255501,"upper_bound":13842.193363114497},"point_estimate":10740.059748868056,"standard_error":1654.9417269018718},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":258894.72927172697,"upper_bound":272760.3983989089},"point_estimate":264763.4113802276,"standard_error":3577.7544561904174},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":21131.15684148712,"upper_bound":74900.87715555987},"point_estimate":50666.13917440051,"standard_error":14113.111864285083}}
```

--------------------------------------------------------------------------------
/benchmarks/deprecated-oz-functions/new/estimates.json:
--------------------------------------------------------------------------------

```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":265733.7071161058,"upper_bound":285339.5708761706},"point_estimate":274325.5023694791,"standard_error":5047.357163083142},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":257836.31666666668,"upper_bound":263832.72754329},"point_estimate":261299.82083333333,"standard_error":1665.2589482251567},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":7565.81246255501,"upper_bound":13842.193363114497},"point_estimate":10740.059748868056,"standard_error":1654.9417269018718},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":258894.72927172697,"upper_bound":272760.3983989089},"point_estimate":264763.4113802276,"standard_error":3577.7544561904174},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":21131.15684148712,"upper_bound":74900.87715555987},"point_estimate":50666.13917440051,"standard_error":14113.111864285083}}
```

--------------------------------------------------------------------------------
/benchmarks/block-timestamp-deadline/base/estimates.json:
--------------------------------------------------------------------------------

```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":279898.45355240104,"upper_bound":285823.50073771604},"point_estimate":282684.0430670172,"standard_error":1513.7558113658854},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":277529.13363387977,"upper_bound":281160.40625},"point_estimate":279193.08004385966,"standard_error":840.9267593947927},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":5879.855868003058,"upper_bound":11737.923160333063},"point_estimate":9470.890235429482,"standard_error":1605.4003220038455},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":280647.06572356925,"upper_bound":289548.7001414823},"point_estimate":284324.2276932171,"standard_error":2355.730168853032},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":10283.026583079984,"upper_bound":19906.354660412526},"point_estimate":15213.622694849431,"standard_error":2511.5840567966434}}
```

--------------------------------------------------------------------------------
/benchmarks/block-timestamp-deadline/new/estimates.json:
--------------------------------------------------------------------------------

```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":279898.45355240104,"upper_bound":285823.50073771604},"point_estimate":282684.0430670172,"standard_error":1513.7558113658854},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":277529.13363387977,"upper_bound":281160.40625},"point_estimate":279193.08004385966,"standard_error":840.9267593947927},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":5879.855868003058,"upper_bound":11737.923160333063},"point_estimate":9470.890235429482,"standard_error":1605.4003220038455},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":280647.06572356925,"upper_bound":289548.7001414823},"point_estimate":284324.2276932171,"standard_error":2355.730168853032},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":10283.026583079984,"upper_bound":19906.354660412526},"point_estimate":15213.622694849431,"standard_error":2511.5840567966434}}
```

--------------------------------------------------------------------------------
/benchmarks/large-numeric-literal/base/estimates.json:
--------------------------------------------------------------------------------

```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":56488.917196728085,"upper_bound":58171.246473140265},"point_estimate":57270.78698503835,"standard_error":431.2787879276012},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":55303.25911764706,"upper_bound":55884.882352941175},"point_estimate":55557.532295271056,"standard_error":173.18479893917683},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":694.3959810142628,"upper_bound":1433.9255386945008},"point_estimate":946.4199589935279,"standard_error":207.21667627339127},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":55607.7777292027,"upper_bound":56669.344514577584},"point_estimate":56087.348573092604,"standard_error":271.3141395564874},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":2842.870964632955,"upper_bound":5642.540377152117},"point_estimate":4330.023714140909,"standard_error":719.601099694424}}
```

--------------------------------------------------------------------------------
/benchmarks/large-numeric-literal/new/estimates.json:
--------------------------------------------------------------------------------

```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":56488.917196728085,"upper_bound":58171.246473140265},"point_estimate":57270.78698503835,"standard_error":431.2787879276012},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":55303.25911764706,"upper_bound":55884.882352941175},"point_estimate":55557.532295271056,"standard_error":173.18479893917683},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":694.3959810142628,"upper_bound":1433.9255386945008},"point_estimate":946.4199589935279,"standard_error":207.21667627339127},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":55607.7777292027,"upper_bound":56669.344514577584},"point_estimate":56087.348573092604,"standard_error":271.3141395564874},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":2842.870964632955,"upper_bound":5642.540377152117},"point_estimate":4330.023714140909,"standard_error":719.601099694424}}
```

--------------------------------------------------------------------------------
/benchmarks/solmate-safe-transfer-lib/base/estimates.json:
--------------------------------------------------------------------------------

```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":3311.6972790343307,"upper_bound":3371.1711894786176},"point_estimate":3338.336430722957,"standard_error":15.221550824220303},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":3297.424758259468,"upper_bound":3328.0568392425466},"point_estimate":3317.0699169153036,"standard_error":7.204354309845005},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":49.50991261878111,"upper_bound":83.61646080249584},"point_estimate":68.05713672844935,"standard_error":8.584128062325856},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":3294.6786228133583,"upper_bound":3343.672495687908},"point_estimate":3316.012264170805,"standard_error":12.624473034876091},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":72.92013570722494,"upper_bound":222.06590434702846},"point_estimate":152.9411402763156,"standard_error":38.5923559202989}}
```

--------------------------------------------------------------------------------
/benchmarks/solmate-safe-transfer-lib/new/estimates.json:
--------------------------------------------------------------------------------

```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":3311.6972790343307,"upper_bound":3371.1711894786176},"point_estimate":3338.336430722957,"standard_error":15.221550824220303},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":3297.424758259468,"upper_bound":3328.0568392425466},"point_estimate":3317.0699169153036,"standard_error":7.204354309845005},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":49.50991261878111,"upper_bound":83.61646080249584},"point_estimate":68.05713672844935,"standard_error":8.584128062325856},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":3294.6786228133583,"upper_bound":3343.672495687908},"point_estimate":3316.012264170805,"standard_error":12.624473034876091},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":72.92013570722494,"upper_bound":222.06590434702846},"point_estimate":152.9411402763156,"standard_error":38.5923559202989}}
```

--------------------------------------------------------------------------------
/benchmarks/unindexed-events/base/estimates.json:
--------------------------------------------------------------------------------

```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":28379.194772675724,"upper_bound":29003.56567100412},"point_estimate":28669.331910669003,"standard_error":159.37770729092256},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":28184.554466479465,"upper_bound":28400.397054303277},"point_estimate":28322.17613445378,"standard_error":53.48480776694323},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":455.96554006288727,"upper_bound":967.8730328168199},"point_estimate":606.3190873307054,"standard_error":128.0775392708642},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":28444.62474410856,"upper_bound":28766.3127984945},"point_estimate":28600.14350600604,"standard_error":81.91977226539862},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":975.8385045334253,"upper_bound":2142.6094429513673},"point_estimate":1604.2963863149935,"standard_error":298.7682971316091}}
```

--------------------------------------------------------------------------------
/benchmarks/unindexed-events/new/estimates.json:
--------------------------------------------------------------------------------

```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":28379.194772675724,"upper_bound":29003.56567100412},"point_estimate":28669.331910669003,"standard_error":159.37770729092256},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":28184.554466479465,"upper_bound":28400.397054303277},"point_estimate":28322.17613445378,"standard_error":53.48480776694323},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":455.96554006288727,"upper_bound":967.8730328168199},"point_estimate":606.3190873307054,"standard_error":128.0775392708642},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":28444.62474410856,"upper_bound":28766.3127984945},"point_estimate":28600.14350600604,"standard_error":81.91977226539862},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":975.8385045334253,"upper_bound":2142.6094429513673},"point_estimate":1604.2963863149935,"standard_error":298.7682971316091}}
```

--------------------------------------------------------------------------------
/benchmarks/unsafe-erc20-functions/base/estimates.json:
--------------------------------------------------------------------------------

```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":43135.73088684764,"upper_bound":45109.860378657824},"point_estimate":44036.06056347855,"standard_error":504.8607125723059},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":42418.97321428571,"upper_bound":43342.49107323616},"point_estimate":42901.581805098685,"standard_error":221.38919320880007},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":1326.681304915258,"upper_bound":2514.526393202903},"point_estimate":1671.3823009411808,"standard_error":311.0201957876835},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":43742.29214200489,"upper_bound":45370.86500428879},"point_estimate":44481.423454755924,"standard_error":416.3881995461573},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":2910.0601684052267,"upper_bound":6991.039610554622},"point_estimate":5071.395064143015,"standard_error":1055.5158731820607}}
```

--------------------------------------------------------------------------------
/benchmarks/unsafe-erc20-functions/new/estimates.json:
--------------------------------------------------------------------------------

```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":43135.73088684764,"upper_bound":45109.860378657824},"point_estimate":44036.06056347855,"standard_error":504.8607125723059},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":42418.97321428571,"upper_bound":43342.49107323616},"point_estimate":42901.581805098685,"standard_error":221.38919320880007},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":1326.681304915258,"upper_bound":2514.526393202903},"point_estimate":1671.3823009411808,"standard_error":311.0201957876835},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":43742.29214200489,"upper_bound":45370.86500428879},"point_estimate":44481.423454755924,"standard_error":416.3881995461573},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":2910.0601684052267,"upper_bound":6991.039610554622},"point_estimate":5071.395064143015,"standard_error":1055.5158731820607}}
```

--------------------------------------------------------------------------------
/benchmarks/unsafe-oz-erc721-mint/base/estimates.json:
--------------------------------------------------------------------------------

```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":294903.2241787214,"upper_bound":304704.40878046595},"point_estimate":299901.15344844694,"standard_error":2498.3735898628943},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":302074.25925925927,"upper_bound":315405.8788067553},"point_estimate":308509.4277210884,"standard_error":4824.830053910656},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":9061.537996310311,"upper_bound":25855.766858665607},"point_estimate":16607.759640867676,"standard_error":4720.989680383483},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":273383.9910147162,"upper_bound":286168.5667219525},"point_estimate":279288.25096645486,"standard_error":3262.9223347164743},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":21588.461845106016,"upper_bound":27885.08340636392},"point_estimate":25072.090523980274,"standard_error":1603.45582068141}}
```

--------------------------------------------------------------------------------
/benchmarks/unsafe-oz-erc721-mint/new/estimates.json:
--------------------------------------------------------------------------------

```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":294903.2241787214,"upper_bound":304704.40878046595},"point_estimate":299901.15344844694,"standard_error":2498.3735898628943},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":302074.25925925927,"upper_bound":315405.8788067553},"point_estimate":308509.4277210884,"standard_error":4824.830053910656},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":9061.537996310311,"upper_bound":25855.766858665607},"point_estimate":16607.759640867676,"standard_error":4720.989680383483},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":273383.9910147162,"upper_bound":286168.5667219525},"point_estimate":279288.25096645486,"standard_error":3262.9223347164743},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":21588.461845106016,"upper_bound":27885.08340636392},"point_estimate":25072.090523980274,"standard_error":1603.45582068141}}
```

--------------------------------------------------------------------------------
/benchmarks/useless-public-function/base/estimates.json:
--------------------------------------------------------------------------------

```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":463972.07750612614,"upper_bound":475901.6333889815},"point_estimate":469424.9983716089,"standard_error":3056.136343559275},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":456651.3703703704,"upper_bound":464734.3703703704},"point_estimate":460092.26430491556,"standard_error":1991.4633367922931},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":7471.463368198058,"upper_bound":15427.300728383376},"point_estimate":12023.070467108666,"standard_error":2004.2158451496318},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":462496.4287641224,"upper_bound":481940.13991861057},"point_estimate":471348.5915472144,"standard_error":5005.309438766497},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":17939.559263426214,"upper_bound":42545.19884528616},"point_estimate":30771.396782632975,"standard_error":6391.861916178918}}
```

--------------------------------------------------------------------------------
/benchmarks/useless-public-function/new/estimates.json:
--------------------------------------------------------------------------------

```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":463972.07750612614,"upper_bound":475901.6333889815},"point_estimate":469424.9983716089,"standard_error":3056.136343559275},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":456651.3703703704,"upper_bound":464734.3703703704},"point_estimate":460092.26430491556,"standard_error":1991.4633367922931},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":7471.463368198058,"upper_bound":15427.300728383376},"point_estimate":12023.070467108666,"standard_error":2004.2158451496318},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":462496.4287641224,"upper_bound":481940.13991861057},"point_estimate":471348.5915472144,"standard_error":5005.309438766497},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":17939.559263426214,"upper_bound":42545.19884528616},"point_estimate":30771.396782632975,"standard_error":6391.861916178918}}
```

--------------------------------------------------------------------------------
/aderyn_core/src/context/browser/parent.rs:
--------------------------------------------------------------------------------

```rust
use crate::{
    ast::*,
    context::workspace::{ASTNode, WorkspaceContext},
    visitor::ast_visitor::{ASTConstVisitor, Node},
};

pub trait GetImmediateParent {
    /// Get the parent Chain of an ASTNode
    fn parent<'a>(&self, context: &'a WorkspaceContext) -> Option<&'a ASTNode>;
}

#[derive(Default)]
struct NodeIDReceiver {
    id: Option<NodeID>,
}

impl ASTConstVisitor for NodeIDReceiver {
    fn visit_node_id(&mut self, node_id: Option<NodeID>) -> eyre::Result<()> {
        self.id = node_id;
        Ok(())
    }
}

impl<T: Node + ?Sized> GetImmediateParent for T {
    fn parent<'a>(&self, context: &'a WorkspaceContext) -> Option<&'a ASTNode> {
        // Setup a Node ID receiver
        let mut node_id_receiver = NodeIDReceiver::default();

        // Find the ID of the node this method is called upon
        self.accept_id(&mut node_id_receiver).ok()?;
        let current_node_id = node_id_receiver.id?;

        context.get_parent(current_node_id)
    }
}

```

--------------------------------------------------------------------------------
/benchmarks/avoid-abi-encode-packed/base/estimates.json:
--------------------------------------------------------------------------------

```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":14297.596213039305,"upper_bound":14590.72372580063},"point_estimate":14423.671184607407,"standard_error":75.61817271183786},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":14200.590660225444,"upper_bound":14399.774128838813},"point_estimate":14311.262919045526,"standard_error":55.4287088827779},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":253.8930074482189,"upper_bound":369.22510823188844},"point_estimate":336.78359526590634,"standard_error":31.10597964561998},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":14186.068796992065,"upper_bound":14330.386919091428},"point_estimate":14252.957706174251,"standard_error":36.943125097472794},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":298.1699648317815,"upper_bound":1165.36643042032},"point_estimate":759.8137754347297,"standard_error":237.18537163989262}}
```

--------------------------------------------------------------------------------
/benchmarks/avoid-abi-encode-packed/new/estimates.json:
--------------------------------------------------------------------------------

```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":14297.596213039305,"upper_bound":14590.72372580063},"point_estimate":14423.671184607407,"standard_error":75.61817271183786},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":14200.590660225444,"upper_bound":14399.774128838813},"point_estimate":14311.262919045526,"standard_error":55.4287088827779},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":253.8930074482189,"upper_bound":369.22510823188844},"point_estimate":336.78359526590634,"standard_error":31.10597964561998},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":14186.068796992065,"upper_bound":14330.386919091428},"point_estimate":14252.957706174251,"standard_error":36.943125097472794},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":298.1699648317815,"upper_bound":1165.36643042032},"point_estimate":759.8137754347297,"standard_error":237.18537163989262}}
```

--------------------------------------------------------------------------------
/benchmarks/delegate-call-in-loop/base/estimates.json:
--------------------------------------------------------------------------------

```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":11317.531552697299,"upper_bound":11557.55335895296},"point_estimate":11420.820673946073,"standard_error":61.90251254003519},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":11271.866026520347,"upper_bound":11363.6508356429},"point_estimate":11320.046846051288,"standard_error":26.321598517967498},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":139.05976318396694,"upper_bound":280.2788666160328},"point_estimate":192.5370064341102,"standard_error":36.60032637796171},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":11251.171697687723,"upper_bound":11360.875523447947},"point_estimate":11303.283011637814,"standard_error":27.968974887486404},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":283.9041849862997,"upper_bound":947.3560169670028},"point_estimate":619.7119327742987,"standard_error":194.91680457455266}}
```

--------------------------------------------------------------------------------
/benchmarks/delegate-call-in-loop/new/estimates.json:
--------------------------------------------------------------------------------

```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":11317.531552697299,"upper_bound":11557.55335895296},"point_estimate":11420.820673946073,"standard_error":61.90251254003519},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":11271.866026520347,"upper_bound":11363.6508356429},"point_estimate":11320.046846051288,"standard_error":26.321598517967498},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":139.05976318396694,"upper_bound":280.2788666160328},"point_estimate":192.5370064341102,"standard_error":36.60032637796171},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":11251.171697687723,"upper_bound":11360.875523447947},"point_estimate":11303.283011637814,"standard_error":27.968974887486404},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":283.9041849862997,"upper_bound":947.3560169670028},"point_estimate":619.7119327742987,"standard_error":194.91680457455266}}
```

--------------------------------------------------------------------------------
/benchmarks/hello_world/base/estimates.json:
--------------------------------------------------------------------------------

```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":1990.5024672163513,"upper_bound":2041.4207042830833},"point_estimate":2016.1337569972934,"standard_error":13.018202314016898},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":2016.262962962963,"upper_bound":2074.5326052548276},"point_estimate":2054.9008847134983,"standard_error":13.847205922551058},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":70.98977636145113,"upper_bound":141.04349120472418},"point_estimate":93.22178843829728,"standard_error":19.57811530966335},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":2051.565669841538,"upper_bound":2079.909133969329},"point_estimate":2066.890316599377,"standard_error":7.19296191320424},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":106.72562228740786,"upper_bound":152.3868446298647},"point_estimate":130.03476611427345,"standard_error":11.711099024116715}}
```

--------------------------------------------------------------------------------
/benchmarks/hello_world/new/estimates.json:
--------------------------------------------------------------------------------

```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":1990.5024672163513,"upper_bound":2041.4207042830833},"point_estimate":2016.1337569972934,"standard_error":13.018202314016898},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":2016.262962962963,"upper_bound":2074.5326052548276},"point_estimate":2054.9008847134983,"standard_error":13.847205922551058},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":70.98977636145113,"upper_bound":141.04349120472418},"point_estimate":93.22178843829728,"standard_error":19.57811530966335},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":2051.565669841538,"upper_bound":2079.909133969329},"point_estimate":2066.890316599377,"standard_error":7.19296191320424},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":106.72562228740786,"upper_bound":152.3868446298647},"point_estimate":130.03476611427345,"standard_error":11.711099024116715}}
```

--------------------------------------------------------------------------------
/benchmarks/non-reentrant-before-others/base/estimates.json:
--------------------------------------------------------------------------------

```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":3322.5901875259556,"upper_bound":3382.9243872076604},"point_estimate":3351.8070669908925,"standard_error":15.395438731982445},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":3325.803886054422,"upper_bound":3350.3777777777777},"point_estimate":3332.4556463869003,"standard_error":8.822199605080531},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":126.94651365841104,"upper_bound":177.515832873222},"point_estimate":137.51268333788235,"standard_error":12.671807909205786},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":3223.856311342474,"upper_bound":3284.73115833569},"point_estimate":3248.68749900779,"standard_error":15.757958615002043},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":122.36910606348108,"upper_bound":194.6174156811443},"point_estimate":155.70919144510964,"standard_error":19.432280989654892}}
```

--------------------------------------------------------------------------------
/benchmarks/non-reentrant-before-others/new/estimates.json:
--------------------------------------------------------------------------------

```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":3322.5901875259556,"upper_bound":3382.9243872076604},"point_estimate":3351.8070669908925,"standard_error":15.395438731982445},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":3325.803886054422,"upper_bound":3350.3777777777777},"point_estimate":3332.4556463869003,"standard_error":8.822199605080531},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":126.94651365841104,"upper_bound":177.515832873222},"point_estimate":137.51268333788235,"standard_error":12.671807909205786},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":3223.856311342474,"upper_bound":3284.73115833569},"point_estimate":3248.68749900779,"standard_error":15.757958615002043},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":122.36910606348108,"upper_bound":194.6174156811443},"point_estimate":155.70919144510964,"standard_error":19.432280989654892}}
```

--------------------------------------------------------------------------------
/benchmarks/zero-address-check/base/estimates.json:
--------------------------------------------------------------------------------

```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":451995.4420425037,"upper_bound":461634.68251033005},"point_estimate":456440.5390063259,"standard_error":2475.102133375628},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":449300.98148148146,"upper_bound":458732.1446540881},"point_estimate":455347.38947236806,"standard_error":2723.078067242322},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":10086.580192368845,"upper_bound":18491.984752273067},"point_estimate":14327.086477660478,"standard_error":2142.7706290702745},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":441768.682521572,"upper_bound":451386.46928608115},"point_estimate":445693.494827841,"standard_error":2492.9257292673647},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":15212.945298576593,"upper_bound":33120.257635551425},"point_estimate":24845.737973970296,"standard_error":4574.097569937255}}
```

--------------------------------------------------------------------------------
/benchmarks/zero-address-check/new/estimates.json:
--------------------------------------------------------------------------------

```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":451995.4420425037,"upper_bound":461634.68251033005},"point_estimate":456440.5390063259,"standard_error":2475.102133375628},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":449300.98148148146,"upper_bound":458732.1446540881},"point_estimate":455347.38947236806,"standard_error":2723.078067242322},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":10086.580192368845,"upper_bound":18491.984752273067},"point_estimate":14327.086477660478,"standard_error":2142.7706290702745},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":441768.682521572,"upper_bound":451386.46928608115},"point_estimate":445693.494827841,"standard_error":2492.9257292673647},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":15212.945298576593,"upper_bound":33120.257635551425},"point_estimate":24845.737973970296,"standard_error":4574.097569937255}}
```

--------------------------------------------------------------------------------
/benchmarks/centralization-risk/base/estimates.json:
--------------------------------------------------------------------------------

```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":12372.374617854519,"upper_bound":12619.486572524716},"point_estimate":12489.649853276607,"standard_error":63.240928499767314},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":12290.345218348588,"upper_bound":12394.337995337995},"point_estimate":12358.265004748337,"standard_error":26.193443236324235},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":300.9612468565089,"upper_bound":522.8619103271549},"point_estimate":426.53281455309894,"standard_error":58.23177658001444},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":12314.160152802557,"upper_bound":12575.382758805858},"point_estimate":12437.146804666689,"standard_error":66.5564127415918},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":453.2169484515177,"upper_bound":793.9342080363158},"point_estimate":635.9854085086872,"standard_error":87.38389042666547}}
```

--------------------------------------------------------------------------------
/benchmarks/centralization-risk/new/estimates.json:
--------------------------------------------------------------------------------

```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":12372.374617854519,"upper_bound":12619.486572524716},"point_estimate":12489.649853276607,"standard_error":63.240928499767314},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":12290.345218348588,"upper_bound":12394.337995337995},"point_estimate":12358.265004748337,"standard_error":26.193443236324235},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":300.9612468565089,"upper_bound":522.8619103271549},"point_estimate":426.53281455309894,"standard_error":58.23177658001444},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":12314.160152802557,"upper_bound":12575.382758805858},"point_estimate":12437.146804666689,"standard_error":66.5564127415918},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":453.2169484515177,"upper_bound":793.9342080363158},"point_estimate":635.9854085086872,"standard_error":87.38389042666547}}
```

--------------------------------------------------------------------------------
/benchmarks/empty-block/base/estimates.json:
--------------------------------------------------------------------------------

```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":50533.16358888091,"upper_bound":51450.14978755689},"point_estimate":50946.209565332814,"standard_error":234.98335259097047},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":50729.82546196997,"upper_bound":51334.665789473685},"point_estimate":50844.152909526725,"standard_error":163.41421723431705},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":1034.1704880433142,"upper_bound":1905.7715843832787},"point_estimate":1695.360602335409,"standard_error":243.3138392571441},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":49275.203576429274,"upper_bound":49852.45854080629},"point_estimate":49543.87925225358,"standard_error":147.51751609672135},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":1377.4820103403795,"upper_bound":3506.3580874236704},"point_estimate":2376.360430428133,"standard_error":650.7950415698192}}
```

--------------------------------------------------------------------------------
/benchmarks/empty-block/new/estimates.json:
--------------------------------------------------------------------------------

```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":50533.16358888091,"upper_bound":51450.14978755689},"point_estimate":50946.209565332814,"standard_error":234.98335259097047},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":50729.82546196997,"upper_bound":51334.665789473685},"point_estimate":50844.152909526725,"standard_error":163.41421723431705},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":1034.1704880433142,"upper_bound":1905.7715843832787},"point_estimate":1695.360602335409,"standard_error":243.3138392571441},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":49275.203576429274,"upper_bound":49852.45854080629},"point_estimate":49543.87925225358,"standard_error":147.51751609672135},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":1377.4820103403795,"upper_bound":3506.3580874236704},"point_estimate":2376.360430428133,"standard_error":650.7950415698192}}
```

--------------------------------------------------------------------------------
/benchmarks/useless-internal-function/base/estimates.json:
--------------------------------------------------------------------------------

```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":16323.15695839365,"upper_bound":17297.204694680422},"point_estimate":16764.820471726438,"standard_error":250.23893020662274},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":15885.949298241962,"upper_bound":16172.240597878495},"point_estimate":16001.404049076573,"standard_error":62.84183384782749},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":413.44735368144666,"upper_bound":851.5695395196134},"point_estimate":621.2082947934725,"standard_error":113.25508968657967},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":15839.2947516214,"upper_bound":16357.034371950269},"point_estimate":16070.118434156115,"standard_error":132.3748666775448},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":1382.958090353464,"upper_bound":3533.4556810635277},"point_estimate":2516.2695680378306,"standard_error":559.9168779283513}}
```

--------------------------------------------------------------------------------
/benchmarks/useless-internal-function/new/estimates.json:
--------------------------------------------------------------------------------

```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":16323.15695839365,"upper_bound":17297.204694680422},"point_estimate":16764.820471726438,"standard_error":250.23893020662274},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":15885.949298241962,"upper_bound":16172.240597878495},"point_estimate":16001.404049076573,"standard_error":62.84183384782749},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":413.44735368144666,"upper_bound":851.5695395196134},"point_estimate":621.2082947934725,"standard_error":113.25508968657967},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":15839.2947516214,"upper_bound":16357.034371950269},"point_estimate":16070.118434156115,"standard_error":132.3748666775448},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":1382.958090353464,"upper_bound":3533.4556810635277},"point_estimate":2516.2695680378306,"standard_error":559.9168779283513}}
```

--------------------------------------------------------------------------------
/benchmarks/useless-modifier/base/estimates.json:
--------------------------------------------------------------------------------

```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":24890.392985268707,"upper_bound":25376.256507907085},"point_estimate":25115.514275304075,"standard_error":123.88540540202386},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":24918.771750805587,"upper_bound":25299.200657894737},"point_estimate":25070.688624971517,"standard_error":79.88582200010565},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":791.4809423165412,"upper_bound":1217.9365650214322},"point_estimate":1069.7808216325957,"standard_error":88.3933701708139},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":24183.076533337047,"upper_bound":24519.28786642646},"point_estimate":24338.39109276442,"standard_error":85.74327074177101},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":826.0996733526902,"upper_bound":1738.6591832176698},"point_estimate":1244.5965098191525,"standard_error":268.5402379780004}}
```

--------------------------------------------------------------------------------
/benchmarks/useless-modifier/new/estimates.json:
--------------------------------------------------------------------------------

```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":24890.392985268707,"upper_bound":25376.256507907085},"point_estimate":25115.514275304075,"standard_error":123.88540540202386},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":24918.771750805587,"upper_bound":25299.200657894737},"point_estimate":25070.688624971517,"standard_error":79.88582200010565},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":791.4809423165412,"upper_bound":1217.9365650214322},"point_estimate":1069.7808216325957,"standard_error":88.3933701708139},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":24183.076533337047,"upper_bound":24519.28786642646},"point_estimate":24338.39109276442,"standard_error":85.74327074177101},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":826.0996733526902,"upper_bound":1738.6591832176698},"point_estimate":1244.5965098191525,"standard_error":268.5402379780004}}
```

--------------------------------------------------------------------------------
/aderyn_core/src/ast.rs:
--------------------------------------------------------------------------------

```rust
#[allow(clippy::module_inception)]
pub mod ast;
pub mod ast_nodes;
pub mod impls;
pub mod macros;
pub mod magic;
pub mod node_type;
pub mod yul;

pub use self::{impls::*, magic::*, node_type::*, yul::*};

pub use NodeID;
pub use ast::ASTNode;
pub use ast_nodes::*;

#[cfg(test)]
mod tests {
    use super::*;
    use std::{fs, path::PathBuf};

    #[test]
    fn can_parse_ast() {
        fs::read_dir(PathBuf::from("../tests/ast")).unwrap().for_each(|path| {
            let path = path.unwrap().path();
            let path_str = path.to_string_lossy();

            let input = fs::read_to_string(&path).unwrap();
            let result: Result<SourceUnit, _> = serde_json::from_str(&input);
            match result {
                Err(e) => {
                    println!("... {path_str} fail: {e}");
                    panic!();
                }
                Ok(_) => {
                    println!("... {path_str} ok");
                }
            }
        })
    }
}

```

--------------------------------------------------------------------------------
/benchmarks/constants-instead-of-literals/base/estimates.json:
--------------------------------------------------------------------------------

```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":1401902.449762742,"upper_bound":1448003.7899469824},"point_estimate":1423830.5967314192,"standard_error":11773.749065616623},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":1365183.7078651686,"upper_bound":1413049.6585365853},"point_estimate":1389140.1451612902,"standard_error":10284.598623806376},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":49759.90151879116,"upper_bound":101889.80376694661},"point_estimate":78705.98880958748,"standard_error":12996.527288313679},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":1356109.468468325,"upper_bound":1395929.2580106677},"point_estimate":1375029.6743401804,"standard_error":10141.747681460844},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":87051.80083928232,"upper_bound":145819.9374635297},"point_estimate":118061.82256568909,"standard_error":15073.154898587543}}
```

--------------------------------------------------------------------------------
/benchmarks/constants-instead-of-literals/new/estimates.json:
--------------------------------------------------------------------------------

```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":1401902.449762742,"upper_bound":1448003.7899469824},"point_estimate":1423830.5967314192,"standard_error":11773.749065616623},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":1365183.7078651686,"upper_bound":1413049.6585365853},"point_estimate":1389140.1451612902,"standard_error":10284.598623806376},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":49759.90151879116,"upper_bound":101889.80376694661},"point_estimate":78705.98880958748,"standard_error":12996.527288313679},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":1356109.468468325,"upper_bound":1395929.2580106677},"point_estimate":1375029.6743401804,"standard_error":10141.747681460844},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":87051.80083928232,"upper_bound":145819.9374635297},"point_estimate":118061.82256568909,"standard_error":15073.154898587543}}
```

--------------------------------------------------------------------------------
/benchmarks/require-with-string/base/estimates.json:
--------------------------------------------------------------------------------

```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":28956.949865992745,"upper_bound":30117.413610837426},"point_estimate":29509.890228235443,"standard_error":296.3940361871848},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":28433.689768489457,"upper_bound":29807.52380952381},"point_estimate":29594.924080547113,"standard_error":434.46289629476524},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":2135.777686986213,"upper_bound":3223.606532769543},"point_estimate":2443.3580578978126,"standard_error":316.70331032207014},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":27201.276110624487,"upper_bound":28158.714578203526},"point_estimate":27603.811002132195,"standard_error":246.06182886271637},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":2047.6133958730954,"upper_bound":3800.1738173378676},"point_estimate":2978.1139838090185,"standard_error":441.9733971004103}}
```

--------------------------------------------------------------------------------
/benchmarks/require-with-string/new/estimates.json:
--------------------------------------------------------------------------------

```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":28956.949865992745,"upper_bound":30117.413610837426},"point_estimate":29509.890228235443,"standard_error":296.3940361871848},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":28433.689768489457,"upper_bound":29807.52380952381},"point_estimate":29594.924080547113,"standard_error":434.46289629476524},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":2135.777686986213,"upper_bound":3223.606532769543},"point_estimate":2443.3580578978126,"standard_error":316.70331032207014},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":27201.276110624487,"upper_bound":28158.714578203526},"point_estimate":27603.811002132195,"standard_error":246.06182886271637},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":2047.6133958730954,"upper_bound":3800.1738173378676},"point_estimate":2978.1139838090185,"standard_error":441.9733971004103}}
```

--------------------------------------------------------------------------------
/aderyn_driver/Cargo.toml:
--------------------------------------------------------------------------------

```toml
[package]
name = "aderyn_driver"
version = "0.6.5"
edition = { workspace = true }
authors = { workspace = true }
description = { workspace = true }
license = { workspace = true }
repository = { workspace = true }
homepage = { workspace = true }

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
aderyn_core = { workspace = true }
rayon = { workspace = true }
serde_json = { workspace = true, features = ["preserve_order"] }
serde = { workspace = true, features = ["derive"] }
serde_repr = { workspace = true }
serde-sarif = { workspace = true }
toml = { workspace = true }
field_access = { workspace = true }
tokio = { workspace = true, features = ["full"] }
tower-lsp = { workspace = true }
dunce = { workspace = true }
prettytable = { workspace = true }
solidity_ast = { workspace = true }
rmcp = { workspace = true }

[lints]
workspace = true

[dev-dependencies]
criterion = { workspace = true }

[[bench]]
name = "detectors"
harness = false

```

--------------------------------------------------------------------------------
/aderyn_core/src/context/browser/ancestral_line.rs:
--------------------------------------------------------------------------------

```rust
use crate::{
    ast::*,
    context::workspace::{ASTNode, WorkspaceContext},
    visitor::ast_visitor::{ASTConstVisitor, Node},
};

pub trait GetAncestralLine {
    /// Get the parent Chain of an ASTNode
    fn ancestral_line<'a>(&self, context: &'a WorkspaceContext) -> Option<Vec<&'a ASTNode>>;
}

#[derive(Default)]
struct NodeIDReceiver {
    id: Option<NodeID>,
}

impl ASTConstVisitor for NodeIDReceiver {
    fn visit_node_id(&mut self, node_id: Option<NodeID>) -> eyre::Result<()> {
        self.id = node_id;
        Ok(())
    }
}

impl<T: Node + ?Sized> GetAncestralLine for T {
    fn ancestral_line<'a>(&self, context: &'a WorkspaceContext) -> Option<Vec<&'a ASTNode>> {
        // Setup a Node ID receiver
        let mut node_id_receiver = NodeIDReceiver::default();

        // Find the ID of the node this method is called upon
        self.accept_id(&mut node_id_receiver).ok()?;
        let current_node_id = node_id_receiver.id?;

        Some(context.get_ancestral_line(current_node_id))
    }
}

```

--------------------------------------------------------------------------------
/tests/ast/array_type_name.json:
--------------------------------------------------------------------------------

```json
{"absolutePath":"a","exportedSymbols":{"C":[4]},"id":5,"nodeType":"SourceUnit","nodes":[{"abstract":false,"baseContracts":[],"canonicalName":"C","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":4,"linearizedBaseContracts":[4],"name":"C","nameLocation":"9:1:1","nodeType":"ContractDefinition","nodes":[{"constant":false,"id":3,"mutability":"mutable","name":"i","nameLocation":"20:1:1","nodeType":"VariableDeclaration","scope":4,"src":"13:8:1","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage","typeString":"uint256[]"},"typeName":{"baseType":{"id":1,"name":"uint","nodeType":"ElementaryTypeName","src":"13:4:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":2,"nodeType":"ArrayTypeName","src":"13:6:1","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"scope":5,"src":"0:24:1","usedErrors":[]}],"src":"0:25:1"}

```

--------------------------------------------------------------------------------
/aderyn_core/src/context/mcp/callgraph/render.rs:
--------------------------------------------------------------------------------

```rust
use askama::Template;
use derive_builder::Builder;
use serde::Serialize;

use crate::{ast::NodeID, context::graph::RawCallGraph};

#[derive(Builder, Serialize, Template)]
#[template(path = "mcp-tool-response/callgraph.md")]
#[builder(pattern = "owned")]
pub struct CallgraphToolResponse {
    pub compilation_unit_index: usize,
    pub contract: ContractData,
    pub entrypoint_function: EntrypointFunctionData,
    pub graph: RawCallGraph, /* NOTE: we do not supply the whole callgraph; only the
                              * subgraph traversed from the entrypoint function */
    pub post_order_nodes: Vec<NodeData>,
}

#[derive(Builder, Serialize)]
#[builder(pattern = "owned")]
pub struct ContractData {
    pub name: String,
    pub node_id: NodeID,
}

#[derive(Builder, Serialize)]
#[builder(pattern = "owned")]
pub struct EntrypointFunctionData {
    pub name: String,
    pub node_id: NodeID,
}

#[derive(Builder, Serialize)]
#[builder(pattern = "owned")]
pub struct NodeData {
    pub name: String,
    pub node_id: NodeID,
    pub called_nodes: Vec<NodeData>,
}

```

--------------------------------------------------------------------------------
/tests/hardhat-js-playground/scripts/deploy.js:
--------------------------------------------------------------------------------

```javascript
// We require the Hardhat Runtime Environment explicitly here. This is optional
// but useful for running the script in a standalone fashion through `node <script>`.
//
// You can also run a script with `npx hardhat run <script>`. If you do that, Hardhat
// will compile your contracts, add the Hardhat Runtime Environment's members to the
// global scope, and execute the script.
const hre = require("hardhat");

async function main() {
  const currentTimestampInSeconds = Math.round(Date.now() / 1000);
  const unlockTime = currentTimestampInSeconds + 60;

  const lockedAmount = hre.ethers.parseEther("0.001");

  const lock = await hre.ethers.deployContract("Lock", [unlockTime], {
    value: lockedAmount,
  });

  await lock.waitForDeployment();

  console.log(
    `Lock with ${ethers.formatEther(
      lockedAmount
    )}ETH and unlock timestamp ${unlockTime} deployed to ${lock.target}`
  );
}

// We recommend this pattern to be able to use async/await everywhere
// and properly handle errors.
main().catch((error) => {
  console.error(error);
  process.exitCode = 1;
});

```

--------------------------------------------------------------------------------
/tests/ast/empty_block.json:
--------------------------------------------------------------------------------

```json
{"absolutePath":"a","exportedSymbols":{"C":[6]},"id":7,"nodeType":"SourceUnit","nodes":[{"abstract":false,"baseContracts":[],"canonicalName":"C","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":6,"linearizedBaseContracts":[6],"name":"C","nameLocation":"9:1:1","nodeType":"ContractDefinition","nodes":[{"body":{"id":4,"nodeType":"Block","src":"42:31:1","statements":[{"AST":{"nodeType":"YulBlock","src":"61:6:1","statements":[{"nodeType":"YulBlock","src":"63:2:1","statements":[]}]},"evmVersion":"london","externalReferences":[],"id":3,"nodeType":"InlineAssembly","src":"52:15:1"}]},"functionSelector":"e2179b8e","id":5,"implemented":true,"kind":"function","modifiers":[],"name":"g","nameLocation":"26:1:1","nodeType":"FunctionDefinition","parameters":{"id":1,"nodeType":"ParameterList","parameters":[],"src":"27:2:1"},"returnParameters":{"id":2,"nodeType":"ParameterList","parameters":[],"src":"42:0:1"},"scope":6,"src":"17:56:1","stateMutability":"view","virtual":false,"visibility":"public"}],"scope":7,"src":"0:75:1","usedErrors":[]}],"src":"0:76:1"}

```

--------------------------------------------------------------------------------
/tools/xtask/src/blesspr.rs:
--------------------------------------------------------------------------------

```rust
use xshell::{Shell, cmd};

pub fn blesspr() -> anyhow::Result<()> {
    let sh = Shell::new()?;
    sh.change_dir(env!("CARGO_MANIFEST_DIR"));
    sh.change_dir("../../");

    // Run cargo build (sanity test)
    let cmd = cmd!(sh, "cargo build");
    cmd.run()?;

    // Fix clippy
    let cmd = cmd!(sh, "cargo fixclippy");
    cmd.run()?;

    // Check clippy
    let cmd = cmd!(sh, "cargo clippy").arg("--").arg("-D").arg("warnings");
    cmd.run()?;

    // Fix format
    let cmd = cmd!(sh, "cargo fixfmt");
    cmd.run()?;

    // Check fixed format
    let cmd = cmd!(sh, "cargo fmt --all --check");
    cmd.run()?;

    // Create reportgen
    let cmd = cmd!(sh, "cargo prep --all --parallel");
    cmd.run()?;

    // Create aderyn.toml
    let cmd = cmd!(sh, "cargo tomlgen");
    cmd.run()?;

    // Push changes
    let cmd = cmd!(sh, "git add .");
    cmd.run()?;
    let cmd = cmd!(sh, "git commit -am").arg("chore: cargo blesspr");
    cmd.run()?;
    let cmd = cmd!(sh, "git config push.autoSetupRemote true");
    cmd.run()?;
    let cmd = cmd!(sh, "git push");
    cmd.run()?;

    Ok(())
}

```

--------------------------------------------------------------------------------
/aderyn_core/src/context/mcp/node_finder/render.rs:
--------------------------------------------------------------------------------

```rust
use askama::Template;
use derive_builder::Builder;
use serde::Serialize;
use std::collections::BTreeMap;

use crate::ast::NodeID;

pub type RNodeType = String; // To respect RMCP + template schema, chose simple type for output

#[derive(Template, Builder, Serialize)]
#[template(path = "mcp-tool-response/node_finder_search.md")]
#[builder(pattern = "owned")]
pub struct NodeFinderMatches {
    pub term: String,
    pub node_type: RNodeType,
    pub matching_nodes: Vec<NodeInfo>,
}

#[derive(Template, Builder, Serialize)]
#[template(path = "mcp-tool-response/node_finder_get_all.md")]
#[builder(pattern = "owned")]
pub struct NodeFinderAll {
    pub node_type: RNodeType,
    pub nodes: Vec<NodeInfo>,
}

#[derive(Template, Builder, Serialize)]
#[template(path = "mcp-tool-response/node_finder_grep.md")]
#[builder(pattern = "owned")]
pub struct NodeFinderGrepMatches {
    pub term: String,
    pub nodes: BTreeMap<RNodeType, Vec<NodeInfo>>,
}

#[derive(Builder, Serialize)]
#[builder(pattern = "owned")]
pub struct NodeInfo {
    pub name: String,
    pub node_id: NodeID,
    pub compilation_unit_index: usize,
}

```

--------------------------------------------------------------------------------
/tests/ast/experimental_encoder_pragma.json:
--------------------------------------------------------------------------------

```json
{
    "absolutePath": "/Users/alexroan/Documents/Cyfrin/aderyn/tests/contract-playground/src/ExperimentalEncoder.sol",
    "exportedSymbols":
    {
      "ExperimentalEncoder":
      [
        3
      ]
    },
    "id": 4,
    "nodeType": "SourceUnit",
    "nodes":
    [
      {
        "id": 1,
        "literals":
        [
          "solidity",
          "0.6",
          ".0"
        ],
        "nodeType": "PragmaDirective",
        "src": "45:22:0"
      },
      {
        "id": 2,
        "literals":
        [
          "experimental",
          "ABIEncoderV2"
        ],
        "nodeType": "PragmaDirective",
        "src": "68:33:0"
      },
      {
        "abstract": false,
        "baseContracts": [],
        "contractDependencies": [],
        "contractKind": "contract",
        "documentation": null,
        "fullyImplemented": true,
        "id": 3,
        "linearizedBaseContracts":
        [
          3
        ],
        "name": "ExperimentalEncoder",
        "nodeType": "ContractDefinition",
        "nodes": [],
        "scope": 4,
        "src": "103:32:0"
      }
    ],
    "src": "45:90:0"
  }
```

--------------------------------------------------------------------------------
/aderyn_core/src/ast/impls/node/variables.rs:
--------------------------------------------------------------------------------

```rust
use crate::{ast::*, visitor::ast_visitor::*};
use eyre::Result;

impl Node for VariableDeclaration {
    fn accept(&self, visitor: &mut impl ASTConstVisitor) -> Result<()> {
        if visitor.visit_variable_declaration(self)? {
            if self.type_name.is_some() {
                self.type_name.as_ref().unwrap().accept(visitor)?;
            }
            if self.overrides.is_some() {
                self.overrides.as_ref().unwrap().accept(visitor)?;
            }
            if self.value.is_some() {
                self.value.as_ref().unwrap().accept(visitor)?;
            }
        }
        self.accept_metadata(visitor)?;
        visitor.end_visit_variable_declaration(self)
    }
    fn accept_metadata(&self, visitor: &mut impl ASTConstVisitor) -> Result<()> {
        if let Some(overrides) = &self.overrides {
            visitor.visit_immediate_children(self.id, vec![overrides.id])?;
        }
        if let Some(value) = &self.value
            && let Some(value_id) = value.get_node_id()
        {
            visitor.visit_immediate_children(self.id, vec![value_id])?;
        }
        Ok(())
    }
    macros::accept_id!();
}

```

--------------------------------------------------------------------------------
/aderyn_core/src/context/browser/closest_ancestor.rs:
--------------------------------------------------------------------------------

```rust
use crate::{
    ast::*,
    context::workspace::{ASTNode, WorkspaceContext},
    visitor::ast_visitor::{ASTConstVisitor, Node},
};

pub trait GetClosestAncestorOfTypeX {
    /// Get the parent Chain of an ASTNode
    fn closest_ancestor_of_type<'a>(
        &self,
        context: &'a WorkspaceContext,
        node_type: NodeType,
    ) -> Option<&'a ASTNode>;
}

#[derive(Default)]
struct NodeIDReceiver {
    id: Option<NodeID>,
}

impl ASTConstVisitor for NodeIDReceiver {
    fn visit_node_id(&mut self, node_id: Option<NodeID>) -> eyre::Result<()> {
        self.id = node_id;
        Ok(())
    }
}

impl<T: Node + ?Sized> GetClosestAncestorOfTypeX for T {
    fn closest_ancestor_of_type<'a>(
        &self,
        context: &'a WorkspaceContext,
        node_type: NodeType,
    ) -> Option<&'a ASTNode> {
        // Setup a Node ID receiver
        let mut node_id_receiver = NodeIDReceiver::default();

        // Find the ID of the node this method is called upon
        self.accept_id(&mut node_id_receiver).ok()?;
        let current_node_id = node_id_receiver.id?;
        context.get_closest_ancestor(current_node_id, node_type)
    }
}

```

--------------------------------------------------------------------------------
/aderyn_driver/benches/detectors.rs:
--------------------------------------------------------------------------------

```rust
use std::path::PathBuf;

use aderyn_driver::{detector::get_all_issue_detectors, process::PreprocessedConfig};

use criterion::{Criterion, criterion_group, criterion_main};
use rayon::iter::{IntoParallelRefIterator, ParallelIterator};

fn bench_individual_detectors_on_contract_playground(c: &mut Criterion) {
    let root_path = PathBuf::from("../tests/contract-playground");
    let preprocessed_config =
        PreprocessedConfig { root_path, src: None, include: None, exclude: None };
    let (contexts, _) =
        aderyn_driver::compile::compile_project(preprocessed_config, false, true).unwrap();

    for detector in get_all_issue_detectors() {
        c.bench_function(detector.name().as_str(), |b| {
            b.iter(|| {
                contexts.par_iter().for_each(|context| {
                    let mut d = detector.skeletal_clone();
                    let _ = d.detect(context).unwrap();
                })
            })
        });
    }
}

criterion_group!(
    detectors,                                         // Group name is the first argument
    bench_individual_detectors_on_contract_playground, // Group 1
);
criterion_main!(detectors);

```

--------------------------------------------------------------------------------
/aderyn/Cargo.toml:
--------------------------------------------------------------------------------

```toml
[package]
name = "aderyn"
version = "0.6.5"
edition = { workspace = true }
default-run = "aderyn"
authors = { workspace = true }
description = { workspace = true }
license = { workspace = true }
repository = { workspace = true }
homepage = { workspace = true }

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
urlencoding = { workspace = true }
webbrowser = { workspace = true }
indoc = { workspace = true }
aderyn_driver = { workspace = true }
clap = { workspace = true, features = ["derive"] }
reqwest = { workspace = true, features = ["blocking", "json", "rustls-tls"] }
semver = { workspace = true }
serde = { workspace = true, features = ["derive"] }
serde_json = { workspace = true, features = ["preserve_order"] }
strum = { workspace = true, features = ["derive"] }
notify-debouncer-full = { workspace = true }
crossbeam-channel = { workspace = true}
termcolor = { workspace = true }
tokio = { workspace = true, features = ["full"] }
tower-lsp = { workspace = true }
log = { workspace = true }
rmcp = { workspace = true }
axum = { workspace = true }
clap_complete = { workspace = true }
simplelog = "0"

[lints]
workspace = true

```

--------------------------------------------------------------------------------
/tests/ast/leave.json:
--------------------------------------------------------------------------------

```json
{"absolutePath":"a","exportedSymbols":{"C":[6]},"id":7,"nodeType":"SourceUnit","nodes":[{"abstract":false,"baseContracts":[],"canonicalName":"C","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":6,"linearizedBaseContracts":[6],"name":"C","nameLocation":"9:1:1","nodeType":"ContractDefinition","nodes":[{"body":{"id":4,"nodeType":"Block","src":"37:51:1","statements":[{"AST":{"nodeType":"YulBlock","src":"56:26:1","statements":[{"body":{"nodeType":"YulBlock","src":"71:9:1","statements":[{"nodeType":"YulLeave","src":"73:5:1"}]},"name":"f","nodeType":"YulFunctionDefinition","src":"58:22:1"}]},"evmVersion":"london","externalReferences":[],"id":3,"nodeType":"InlineAssembly","src":"47:35:1"}]},"functionSelector":"ece866b9","id":5,"implemented":true,"kind":"function","modifiers":[],"name":"l","nameLocation":"26:1:1","nodeType":"FunctionDefinition","parameters":{"id":1,"nodeType":"ParameterList","parameters":[],"src":"27:2:1"},"returnParameters":{"id":2,"nodeType":"ParameterList","parameters":[],"src":"37:0:1"},"scope":6,"src":"17:71:1","stateMutability":"nonpayable","virtual":false,"visibility":"public"}],"scope":7,"src":"0:90:1","usedErrors":[]}],"src":"0:91:1"}

```

--------------------------------------------------------------------------------
/aderyn_core/templates/mcp-tool-response/node_summarizer.md:
--------------------------------------------------------------------------------

```markdown
## Node summarizer

### Compilation Unit: {{ compilation_unit_index }}
### Node ID: {{ node_id }}
### Filepath: {{ filepath }}

{% if let Some(contract) = containing_contract %}
### Containing Contract Class: {{ contract.name }} | Node Id: {{ contract.node_id }}
{% endif %}

{% if let Some(function) = containing_function %}
### Containing Function: {{ function.name }} | Node Id: {{ function.node_id }}
{% endif %}

{% if let Some(modifier) = containing_modifier %}
### Containing Modifier: {{ modifier.name }} | Node Id: {{ modifier.node_id }}
{% endif %}

### Code snippet of the node:
```solidity
{{ code }}
```

### Metadata
{% if containing_callgraphs.len() == 0 %}
No metadata present.
{% else %}
In this compilation unit {{ compilation_unit_index }}, Node ID {{ node_id }} appears in the callgraphs of the following entrypoints:
{% for c in containing_callgraphs %}
- Deployable contract `{{ c.deployable_contract_name }}` (node ID: {{ c.deployable_contract_id }}) entrypoints:
{% for e in c.entrypoint_ids %}
    - Entrypoint Node ID {{ e }}
{% endfor %}

{% endfor %}

You can make use of Aderyn's callgraph tool to further holistically explore the bigger context in which this function is a part of.
{% endif %}

```

--------------------------------------------------------------------------------
/aderyn_core/src/context/browser/immediate_children.rs:
--------------------------------------------------------------------------------

```rust
use crate::{
    ast::*,
    context::{
        browser::ExtractImmediateChildrenIDs,
        workspace::{ASTNode, WorkspaceContext},
    },
    visitor::ast_visitor::{ASTConstVisitor, Node},
};

pub trait GetImmediateChildren {
    /// Get the immediate children of an ASTNode
    fn children<'a>(&self, context: &'a WorkspaceContext) -> Option<Vec<&'a ASTNode>>;
}

#[derive(Default)]
struct NodeIDReceiver {
    id: Option<NodeID>,
}

impl ASTConstVisitor for NodeIDReceiver {
    fn visit_node_id(&mut self, node_id: Option<NodeID>) -> eyre::Result<()> {
        self.id = node_id;
        Ok(())
    }
}

impl<T: Node + ?Sized> GetImmediateChildren for T {
    fn children<'a>(&self, context: &'a WorkspaceContext) -> Option<Vec<&'a ASTNode>> {
        // Setup a Node ID receiver
        let mut node_id_receiver = NodeIDReceiver::default();

        // Find the ID of the node this method is called upon
        self.accept_id(&mut node_id_receiver).ok()?;
        let current_node_id = node_id_receiver.id?;

        let children = ExtractImmediateChildrenIDs::from(context.nodes.get(&current_node_id)?)
            .extracted
            .into_iter()
            .filter_map(|x| context.nodes.get(&x))
            .collect::<Vec<_>>();
        Some(children)
    }
}

```

--------------------------------------------------------------------------------
/tests/ast/stringlit.json:
--------------------------------------------------------------------------------

```json
{"absolutePath":"a","exportedSymbols":{"C":[6]},"id":7,"nodeType":"SourceUnit","nodes":[{"abstract":false,"baseContracts":[],"canonicalName":"C","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":6,"linearizedBaseContracts":[6],"name":"C","nameLocation":"9:1:1","nodeType":"ContractDefinition","nodes":[{"body":{"id":4,"nodeType":"Block","src":"37:43:1","statements":[{"AST":{"nodeType":"YulBlock","src":"56:18:1","statements":[{"nodeType":"YulVariableDeclaration","src":"58:14:1","value":{"hexValue":"616263","kind":"string","nodeType":"YulLiteral","src":"67:5:1","type":"","value":"abc"},"variables":[{"name":"x","nodeType":"YulTypedName","src":"62:1:1","type":""}]}]},"evmVersion":"london","externalReferences":[],"id":3,"nodeType":"InlineAssembly","src":"47:27:1"}]},"functionSelector":"5a2ee019","id":5,"implemented":true,"kind":"function","modifiers":[],"name":"m","nameLocation":"26:1:1","nodeType":"FunctionDefinition","parameters":{"id":1,"nodeType":"ParameterList","parameters":[],"src":"27:2:1"},"returnParameters":{"id":2,"nodeType":"ParameterList","parameters":[],"src":"37:0:1"},"scope":6,"src":"17:63:1","stateMutability":"nonpayable","virtual":false,"visibility":"public"}],"scope":7,"src":"0:82:1","usedErrors":[]}],"src":"0:83:1"}

```

--------------------------------------------------------------------------------
/aderyn_core/src/ast/impls/node/blocks.rs:
--------------------------------------------------------------------------------

```rust
use crate::{
    ast::{Block, UncheckedBlock, macros::accept_id},
    visitor::ast_visitor::*,
};
use eyre::Result;

impl Node for Block {
    fn accept(&self, visitor: &mut impl ASTConstVisitor) -> Result<()> {
        if visitor.visit_block(self)? {
            list_accept(&self.statements, visitor)?;
        }
        self.accept_metadata(visitor)?;
        visitor.end_visit_block(self)
    }

    fn accept_metadata(&self, visitor: &mut impl ASTConstVisitor) -> Result<()> {
        let children_ids = self.statements.iter().flat_map(|x| x.get_node_id()).collect::<Vec<_>>();
        visitor.visit_immediate_children(self.id, children_ids)?;
        Ok(())
    }

    accept_id!();
}

impl Node for UncheckedBlock {
    fn accept(&self, visitor: &mut impl ASTConstVisitor) -> Result<()> {
        if visitor.visit_unchecked_block(self)? {
            list_accept(&self.statements, visitor)?;
        }
        self.accept_metadata(visitor)?;
        visitor.end_visit_unchecked_block(self)
    }

    fn accept_metadata(&self, visitor: &mut impl ASTConstVisitor) -> Result<()> {
        let children_ids = self.statements.iter().flat_map(|x| x.get_node_id()).collect::<Vec<_>>();
        visitor.visit_immediate_children(self.id, children_ids)?;
        Ok(())
    }

    accept_id!();
}

```

--------------------------------------------------------------------------------
/aderyn_core/src/context/mcp/tool_guide/tool.rs:
--------------------------------------------------------------------------------

```rust
use crate::context::mcp::{MCPToolNamePool, ModelContextProtocolState, ModelContextProtocolTool};
use indoc::indoc;
use rmcp::{
    ErrorData as McpError,
    handler::server::wrapper::Parameters,
    model::{CallToolResult, Content},
};
use std::sync::Arc;

#[derive(Clone)]
pub struct ToolGuide;

impl ModelContextProtocolTool for ToolGuide {
    type Input = rmcp::model::EmptyObject;

    fn new(_state: Arc<ModelContextProtocolState>) -> Self {
        Self
    }

    fn name(&self) -> String {
        MCPToolNamePool::AderynGetToolGuide.to_string()
    }

    fn description(&self) -> String {
        indoc! {
            "MUST be called once at the beginning to have that base knowledge required to \
            solve user's problems. Provides glossary, general approaches to common scenarios, \
            advanced tool calling strategies and tips to leverage Aderyn's MCP tools for \
            high performance and accuracy."
        }
        .to_string()
    }

    fn execute(&self, _input: Parameters<Self::Input>) -> Result<CallToolResult, McpError> {
        let response = include_str!(concat!(
            env!("CARGO_MANIFEST_DIR"),
            "/templates/mcp-tool-response/tool_guide.md"
        ));
        Ok(CallToolResult::success(vec![Content::text(response)]))
    }
}

```

--------------------------------------------------------------------------------
/tests/ast/fallback_and_reveice_ether.json:
--------------------------------------------------------------------------------

```json
{"absolutePath":"a","exportedSymbols":{"C":[9]},"id":10,"nodeType":"SourceUnit","nodes":[{"abstract":false,"baseContracts":[],"canonicalName":"C","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":9,"linearizedBaseContracts":[9],"name":"C","nameLocation":"9:1:1","nodeType":"ContractDefinition","nodes":[{"body":{"id":3,"nodeType":"Block","src":"42:5:1","statements":[]},"id":4,"implemented":true,"kind":"receive","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":1,"nodeType":"ParameterList","parameters":[],"src":"22:2:1"},"returnParameters":{"id":2,"nodeType":"ParameterList","parameters":[],"src":"42:0:1"},"scope":9,"src":"15:32:1","stateMutability":"payable","virtual":false,"visibility":"external"},{"body":{"id":7,"nodeType":"Block","src":"78:5:1","statements":[]},"id":8,"implemented":true,"kind":"fallback","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":5,"nodeType":"ParameterList","parameters":[],"src":"58:2:1"},"returnParameters":{"id":6,"nodeType":"ParameterList","parameters":[],"src":"78:0:1"},"scope":9,"src":"50:33:1","stateMutability":"payable","virtual":false,"visibility":"external"}],"scope":10,"src":"0:85:1","usedErrors":[]}],"src":"0:86:1"}

```

--------------------------------------------------------------------------------
/aderyn_core/Cargo.toml:
--------------------------------------------------------------------------------

```toml
[package]
name = "aderyn_core"
version = "0.6.5"
edition = { workspace = true }
authors = { workspace = true }
description = { workspace = true }
license = { workspace = true }
repository = { workspace = true }
homepage = { workspace = true }

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
eyre = { workspace = true }
ignore = { workspace = true }
phf = { workspace = true, features = ["macros"] }
prettytable = { workspace = true }
rayon = { workspace = true }
semver = { workspace = true }
serde = { workspace = true, features = ["derive"] }
serde_json = { workspace = true, features = ["preserve_order"] }
serde_repr = { workspace = true }
strum = { workspace = true, features = ["derive"] }
num-bigint = { workspace = true }
num-traits = { workspace = true }
lazy-regex = { workspace = true }
derive_more = { workspace = true }
dunce = { workspace = true }
solidity_ast = { workspace = true }
rmcp = { workspace = true }
askama = { workspace = true }
indoc = { workspace = true}
derive_builder = { workspace = true }
log = { workspace = true }
regex = { workspace = true }

[dev-dependencies]
petgraph = { workspace = true }
serial_test = { workspace = true }
once_cell = { workspace = true }

[lints]
workspace = true

[lib]
doctest = false

```

--------------------------------------------------------------------------------
/aderyn_core/src/context/mcp/contract_surface/render.rs:
--------------------------------------------------------------------------------

```rust
use askama::Template;
use derive_builder::Builder;
use serde::Serialize;

use crate::ast::NodeID;

#[derive(Builder, Serialize, Template)]
#[template(path = "mcp-tool-response/contract_surface.md")]
#[builder(pattern = "owned")]
pub struct ContractSurface {
    pub name: String,
    pub node_id: NodeID,
    pub filepath: String,
    pub compilation_unit_index: usize,
    pub total_state_variables: usize,
    pub reversed_chain: Vec<ContractInfo>,
    pub entrypoints: EntrypointFunctions,
}

#[derive(Builder, Serialize, Default)]
#[builder(pattern = "owned")]
pub struct EntrypointFunctions {
    pub external_functions: Vec<FunctionInfo>,
    pub public_functions: Vec<FunctionInfo>,
    pub fallback_function: Option<FunctionInfo>,
    pub receive_function: Option<FunctionInfo>,
}

#[derive(Builder, Serialize)]
#[builder(pattern = "owned")]
pub struct ContractInfo {
    pub name: String,
    pub node_id: NodeID,
    pub state_variables: Vec<String>,
    pub filepath: String,
}

#[derive(Builder, Serialize)]
#[builder(pattern = "owned")]
pub struct FunctionInfo {
    pub name: String,
    pub node_id: NodeID,
    pub containing_contract: ContainingContract,
}

#[derive(Builder, Serialize)]
#[builder(pattern = "owned")]
pub struct ContainingContract {
    pub name: String,
    pub node_id: NodeID,
}

```

--------------------------------------------------------------------------------
/aderyn_core/src/ast/impls/own/source_units.rs:
--------------------------------------------------------------------------------

```rust
use crate::ast::{ImportDirective, SourceUnit, SourceUnitNode};
use eyre::{Result, eyre};
use std::io;

impl SourceUnit {
    pub fn source_line(&self, src: &str) -> Result<usize> {
        let source = match self.source.as_ref() {
            Some(source) => source.as_str(),
            _ => return Err(eyre!("not found")),
        };

        let values: Vec<Option<usize>> = src
            .split(':')
            .map(|token| {
                if token.is_empty() {
                    None
                } else {
                    token
                        .parse()
                        .map_err(|error| io::Error::new(io::ErrorKind::InvalidData, error))
                        .ok()
                }
            })
            .collect();

        let index = values.first().and_then(|&value| value).ok_or_else(|| eyre!("not found"))?;

        if index > source.len() {
            return Err(eyre!("index out of bounds"));
        }

        Ok(source[..index].chars().filter(|&c| c == '\n').count() + 1)
    }

    pub fn import_directives(&self) -> Vec<&ImportDirective> {
        self.nodes
            .iter()
            .filter_map(|n| {
                let SourceUnitNode::ImportDirective(node) = n else {
                    return None;
                };
                Some(node)
            })
            .collect()
    }
}

```

--------------------------------------------------------------------------------
/aderyn_core/src/audit/entrypoint.rs:
--------------------------------------------------------------------------------

```rust
use crate::{audit::auditor::get_auditor_detectors, context::workspace::WorkspaceContext};
use eyre::Result;
use prettytable::Row;
use rayon::iter::{IntoParallelRefMutIterator, ParallelIterator};
use std::{
    collections::{BTreeMap, btree_map::Entry},
    error::Error,
};

pub type AT = Vec<(String, (Row, Vec<Row>))>;

pub fn prepare_audit_tables(contexts: &[WorkspaceContext]) -> Result<AT, Box<dyn Error>> {
    let audit_detectors_with_output = get_auditor_detectors()
        .par_iter_mut()
        .flat_map(|detector| {
            // Keys -> detector's title
            // Value -> (table titles, table rows)
            let mut grouped_instances: BTreeMap<String, (Row, Vec<Row>)> = BTreeMap::new();

            for context in contexts {
                let mut d = detector.skeletal_clone();
                if let Ok(found) = d.detect(context)
                    && found
                {
                    match grouped_instances.entry(d.title()) {
                        Entry::Occupied(o) => o.into_mut().1.extend(d.table_rows()),
                        Entry::Vacant(v) => {
                            v.insert((d.table_titles(), d.table_rows()));
                        }
                    };
                }
            }

            grouped_instances
        })
        .collect::<Vec<_>>();

    Ok(audit_detectors_with_output)
}

```

--------------------------------------------------------------------------------
/aderyn_core/src/stats/util.rs:
--------------------------------------------------------------------------------

```rust
use std::str::FromStr;

pub struct CodeIterator {
    pub content: Vec<char>,
    pub curr_pos: usize,
    pub line_no: usize,
}

pub struct StatefulToken {
    pub curr: char,
    pub next: Option<char>,
    pub line_no: usize,
}

impl Iterator for CodeIterator {
    type Item = StatefulToken;

    fn next(&mut self) -> Option<Self::Item> {
        let curr_pos = self.curr_pos;
        self.curr_pos += 1;
        let result = {
            if curr_pos < self.content.len() - 1 {
                Some(StatefulToken {
                    curr: self.content[curr_pos],
                    next: Some(self.content[curr_pos + 1]),
                    line_no: self.line_no,
                })
            } else if curr_pos < self.content.len() {
                Some(StatefulToken {
                    curr: self.content[curr_pos],
                    next: None,
                    line_no: self.line_no,
                })
            } else {
                None
            }
        };

        if let Some(ref c) = result
            && c.curr == '\n'
        {
            self.line_no += 1;
        }

        result
    }
}

impl FromStr for CodeIterator {
    type Err = usize;

    fn from_str(code: &str) -> Result<Self, <Self as FromStr>::Err> {
        Ok(CodeIterator { content: code.chars().collect::<Vec<_>>(), curr_pos: 0, line_no: 1 })
    }
}

```

--------------------------------------------------------------------------------
/aderyn_core/src/detect/low/boolean_equality.rs:
--------------------------------------------------------------------------------

```rust
use crate::{detect::helpers::is_constant_boolean, issue_detector};
use eyre::Result;

issue_detector! {
    BooleanEqualityDetector;

    severity: Low,
    title: "Boolean equality is not required",
    desc: "If `x` is a boolean, use `if(x)` and `if(!x)` instead of `if(x == true)` or `if(x == false)`.",
    name: BooleanEquality,

    |context| {
        for binary_operation in context.binary_operations() {
            if binary_operation.operator == "=="
                && [
                    binary_operation.left_expression.as_ref(),
                    binary_operation.right_expression.as_ref(),
                ]
                .iter()
                .any(|&operand| is_constant_boolean(context, operand))
            {
                grab!(binary_operation);
            }
        }
    }

}

#[cfg(test)]
mod boolean_equality_tests {

    use crate::detect::{detector::IssueDetector, low::boolean_equality::BooleanEqualityDetector};

    #[test]

    fn test_boolean_equality_by_loading_contract_directly() {
        let context = crate::detect::test_utils::load_solidity_source_unit(
            "../tests/contract-playground/src/BooleanEquality.sol",
        );

        let mut detector = BooleanEqualityDetector::default();
        let found = detector.detect(&context).unwrap();
        assert!(found);
        assert_eq!(detector.instances().len(), 4);
    }
}

```

--------------------------------------------------------------------------------
/aderyn_core/src/ast/impls/disp/modifiers.rs:
--------------------------------------------------------------------------------

```rust
use crate::ast::*;
use std::fmt::Display;

impl Display for ModifierDefinition {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        f.write_str("modifier")?;

        if !self.name.is_empty() {
            f.write_fmt(format_args!(" {}", self.name))?;
        }

        f.write_fmt(format_args!("{}", self.parameters))?;

        if self.visibility != Visibility::Internal {
            f.write_fmt(format_args!("{} {}", self.parameters, self.visibility))?;
        }

        if self.is_virtual {
            f.write_fmt(format_args!(" virtual"))?;
        }

        if let Some(overrides) = self.overrides.as_ref() {
            f.write_fmt(format_args!(" {overrides}"))?;
        }

        if let Some(body) = self.body.as_ref() {
            f.write_fmt(format_args!(" {}", body))?;
        }

        Ok(())
    }
}

impl Display for ModifierInvocation {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        f.write_fmt(format_args!("{:?}", self.modifier_name))?;

        if let Some(arguments) = self.arguments.as_ref() {
            f.write_str("(")?;

            for (i, argument) in arguments.iter().enumerate() {
                if i > 0 {
                    f.write_str(", ")?;
                }

                f.write_fmt(format_args!("{argument}"))?;
            }

            f.write_str(")")?;
        }

        Ok(())
    }
}

```

--------------------------------------------------------------------------------
/dist-workspace.toml:
--------------------------------------------------------------------------------

```toml
[workspace]
members = ["cargo:."]

# Config for 'dist'
[dist]
# The preferred dist version to use in CI (Cargo.toml SemVer syntax)
cargo-dist-version = "0.28.0"
# CI backends to support
ci = "github"
# The installers to generate for each app
installers = ["shell", "npm", "homebrew"]
# A GitHub repo to push Homebrew formulas to
tap = "cyfrin/homebrew-tap"
# Target platforms to build apps for (Rust target-triple syntax)
targets = ["aarch64-apple-darwin", "aarch64-unknown-linux-gnu", "x86_64-apple-darwin", "x86_64-unknown-linux-gnu"]
# A namespace to use when publishing this package to the npm registry
npm-scope = "@cyfrin"
# Path that installers should place binaries in
install-path = "CARGO_HOME"
# Publish jobs to run in CI
publish-jobs = ["homebrew", "npm"]
# Whether to install an updater program
install-updater = true

[dist.github-custom-runners]
global = "ubuntu-latest"

[dist.github-custom-runners.x86_64-unknown-linux-gnu]
runner = "ubuntu-latest"
container = { image = "quay.io/pypa/manylinux_2_28_x86_64", host = "x86_64-unknown-linux-musl" }

[dist.github-custom-runners.x86_64-unknown-linux-musl]
runner = "ubuntu-latest"
container = { image = "quay.io/pypa/musllinux_1_2_x86_64", host = "x86_64-unknown-linux-musl" }

[dist.github-custom-runners.aarch64-unknown-linux-gnu]
runner = "ubuntu-latest"
container = { image = "quay.io/pypa/manylinux_2_28_x86_64", host = "x86_64-unknown-linux-musl" }

```

--------------------------------------------------------------------------------
/aderyn_core/src/stats/dbg_tips.txt:
--------------------------------------------------------------------------------

```
for group in &token_insight_groups {
   if group.token_type == HighLevelType::Code {
       println!(
           "{}-{} Size:{} Contrib:{}",
           group.start_line,
           group.end_line,
           group.token_insights.len(),
           group.total_contribution(),
       );
       if group.total_contribution() == 37 {
           for i in &group.token_insights {
               println!(
                   "{:?} - {:?} - {} - {} - {}",
                   i.token_type,
                   i.code_lines.info_lines,
                   i.starts_with_newline,
                   i.start_line,
                   i.end_line
               );
           }
       }
   }
}


if value.token_type != TokenType::MultilineComment
    && value.token_type != TokenType::SinglelineComment
    && insight.start_line == 3
    || insight.end_line == 3
{
    print!(
        "{:?}, {}-{}\n",
        value.token_type.clone(),
        value.start_line,
        value.end_line
    );
    println!("{}", value.content.clone());

    println!(
        "Lines {}/{}/{}\n----------------------",
        insight.code_lines.info_lines,
        insight.code_lines.actual_first_line,
        insight.code_lines.last_line_has_code
    );
}

starts in the same line, overcounted !
println!(
    "cutting for {} {} {} {} {}",
    curr.start_line,
    prev.end_line,
    curr.code_lines.info_lines,
    prev.code_lines.info_lines,
    prev.code_lines.actual_first_line,
);

```

--------------------------------------------------------------------------------
/tests/ast/switch_default.json:
--------------------------------------------------------------------------------

```json
{"absolutePath":"a","exportedSymbols":{"C":[6]},"id":7,"nodeType":"SourceUnit","nodes":[{"abstract":false,"baseContracts":[],"canonicalName":"C","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":6,"linearizedBaseContracts":[6],"name":"C","nameLocation":"9:1:1","nodeType":"ContractDefinition","nodes":[{"body":{"id":4,"nodeType":"Block","src":"42:58:1","statements":[{"AST":{"nodeType":"YulBlock","src":"61:33:1","statements":[{"cases":[{"body":{"nodeType":"YulBlock","src":"79:2:1","statements":[]},"nodeType":"YulCase","src":"72:9:1","value":{"kind":"number","nodeType":"YulLiteral","src":"77:1:1","type":"","value":"0"}},{"body":{"nodeType":"YulBlock","src":"90:2:1","statements":[]},"nodeType":"YulCase","src":"82:10:1","value":"default"}],"expression":{"kind":"number","nodeType":"YulLiteral","src":"70:1:1","type":"","value":"0"},"nodeType":"YulSwitch","src":"63:29:1"}]},"evmVersion":"london","externalReferences":[],"id":3,"nodeType":"InlineAssembly","src":"52:42:1"}]},"functionSelector":"e2179b8e","id":5,"implemented":true,"kind":"function","modifiers":[],"name":"g","nameLocation":"26:1:1","nodeType":"FunctionDefinition","parameters":{"id":1,"nodeType":"ParameterList","parameters":[],"src":"27:2:1"},"returnParameters":{"id":2,"nodeType":"ParameterList","parameters":[],"src":"42:0:1"},"scope":6,"src":"17:83:1","stateMutability":"view","virtual":false,"visibility":"public"}],"scope":7,"src":"0:102:1","usedErrors":[]}],"src":"0:103:1"}

```

--------------------------------------------------------------------------------
/aderyn_core/tests/common/peek_over.rs:
--------------------------------------------------------------------------------

```rust
use std::{collections::BTreeMap, error::Error};

use aderyn_core::{
    ast::NodeID,
    capture,
    context::{browser::PeekOver, workspace::WorkspaceContext},
    detect::detector::{IssueDetector, IssueDetectorNamePool, IssueSeverity},
};
use eyre::Result;

#[derive(Default)]
pub struct PeekOverDemonstrator {
    // Keys are: [0] source file name, [1] line number, [2] character location of node.
    // Do not add items manually, use `capture!` to add nodes to this BTreeMap.
    found_instances: BTreeMap<(String, usize, String), NodeID>,
}

impl IssueDetector for PeekOverDemonstrator {
    fn detect(&mut self, context: &WorkspaceContext) -> Result<bool, Box<dyn Error>> {
        for event in context.event_definitions() {
            if let Some(text) = event.peek_over(context)
                && (text.contains("// SAME CONDITIONALS")
                    || text.contains("// DIFFERENT CONDITIONALS"))
            {
                capture!(self, context, event);
            }
        }

        Ok(!self.found_instances.is_empty())
    }

    fn severity(&self) -> IssueSeverity {
        IssueSeverity::High
    }

    fn title(&self) -> String {
        String::from("Peek Over Demonstration")
    }

    fn description(&self) -> String {
        String::from("Peek Over Demonstration")
    }

    fn instances(&self) -> BTreeMap<(String, usize, String), NodeID> {
        self.found_instances.clone()
    }

    fn name(&self) -> String {
        format!("{}", IssueDetectorNamePool::CentralizationRisk)
    }
}

```

--------------------------------------------------------------------------------
/aderyn_core/src/ast/node_type.rs:
--------------------------------------------------------------------------------

```rust
use serde::{Deserialize, Serialize};

pub type NodeID = i64;

#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, PartialOrd, Eq, Ord, Hash)]
pub enum NodeType {
    SourceUnit,
    PragmaDirective,
    ImportDirective,
    UsingForDirective,
    ContractDefinition,
    InheritanceSpecifier,
    OverrideSpecifier,
    IdentifierPath,
    StructuredDocumentation,
    VariableDeclaration,
    Mapping,
    ElementaryTypeName,
    ElementaryTypeNameExpression,
    ArrayTypeName,
    TupleExpression,
    FunctionDefinition,
    ParameterList,
    Block,
    UncheckedBlock,
    Continue,
    Break,
    Return,
    Throw,
    Literal,
    Conditional,
    Identifier,
    IndexAccess,
    IndexRangeAccess,
    MemberAccess,
    Assignment,
    FunctionCall,
    FunctionCallOptions,
    FunctionTypeName,
    NewExpression,
    ExpressionStatement,
    VariableDeclarationStatement,
    IfStatement,
    TryCatchClause,
    UnaryOperation,
    BinaryOperation,
    EventDefinition,
    ErrorDefinition,
    EmitStatement,
    PlaceholderStatement,
    TryStatement,
    RevertStatement,
    ForStatement,
    WhileStatement,
    DoWhileStatement,
    ModifierDefinition,
    ModifierInvocation,
    EnumDefinition,
    EnumValue,
    StructDefinition,
    UserDefinedTypeName,
    InlineAssembly,
    YulLiteral,
    YulTypedName,
    YulSwitch,
    YulCase,
    YulFunctionCall,
    YulExpressionStatement,
    YulAssignment,
    YulIdentifier,
    YulVariableDeclaration,
    YulBlock,
    UserDefinedValueTypeDefinition,
}

```

--------------------------------------------------------------------------------
/aderyn_core/src/ast/impls/ctx/workspace.rs:
--------------------------------------------------------------------------------

```rust
use rayon::iter::{IntoParallelIterator, ParallelBridge};

use crate::{
    ast::{ContractDefinition, FunctionDefinition},
    context::{
        graph::{CallGraphConsumer, CallGraphDirection},
        workspace::WorkspaceContext,
    },
};

impl WorkspaceContext {
    #[inline]
    pub fn deployable_contracts(&self) -> impl Iterator<Item = &ContractDefinition> {
        self.contract_definitions().into_iter().filter(|c| c.is_deployable_contract())
    }

    #[inline]
    pub fn par_deployable_contracts(
        &self,
    ) -> impl IntoParallelIterator<Item = &ContractDefinition> {
        self.contract_definitions().into_iter().filter(|c| c.is_deployable_contract()).par_bridge()
    }

    pub fn entrypoints_of_deployable_contracts(&self) -> Vec<&FunctionDefinition> {
        let mut entrypoints = vec![];
        for contract in self.deployable_contracts() {
            if let Some(entrypoint_funcs) = contract.entrypoint_functions(self) {
                entrypoints.extend(entrypoint_funcs);
            }
        }
        entrypoints
    }

    pub fn entrypoints_with_callgraphs(
        &self,
    ) -> Vec<(&FunctionDefinition, Vec<CallGraphConsumer>)> {
        let mut result = vec![];
        for func in self.entrypoints_of_deployable_contracts() {
            let Ok(callgraphs) =
                CallGraphConsumer::get(self, &[&(func.into())], CallGraphDirection::Inward)
            else {
                continue;
            };
            result.push((func, callgraphs));
        }
        result
    }
}

```

--------------------------------------------------------------------------------
/aderyn_core/templates/mcp-tool-response/project_overview.md:
--------------------------------------------------------------------------------

```markdown
## Project Overview

### Configuration
- **Root:** {{ root }}
- **Source:** {{ source }}
- **Remappings:**
{%if remappings.len() > 0 %}
{% for r in remappings %}
  - "{{ r }}"
{% endfor %}
{% else %}
  - No remappings found
{% endif %}

### Notes:
- *Root* directory is an absolute path.
- *Remappings* can be relative or absolute. The relative ones are relative to the root.
- Not all solidity files in the root directory are authored by the developer. Some files are 3rd party libraries which should be omitted for analysis unless explicitly pulled as a dependency by other developer authored solidity files.
- *Source* directory is the most important directory of all. It lives inside the *Root* and contains all the solidity contracts that the developer has worked on.

Aderyn has determined that there are **{{ compilation_units.len() }} compilation units**. The actual Solc versions itself are not mentioned.

Note that the file paths shown are relative to the project's **Root** shown above. Please also note that only a subset of these files are considered included files - those lines of entries are appended with `INCLUDED` keyword.

{% for cu in compilation_units %}
### Compilation Unit {{ loop.index }}:
{% for f in cu.files %}
- {{ f.path }}{% if f.included %} INCLUDED{% endif %}
{% endfor %}

{% endfor %}

### Summary:
- Total compilation units: **{{ compilation_units.len() }}**
{% for cu in compilation_units %}
- Compilation Unit {{ loop.index }} has **{{ cu.files.len() }}** files of which **{{ cu.included_count }}** are included.
{% endfor %}

```

--------------------------------------------------------------------------------
/aderyn/src/birdsong.rs:
--------------------------------------------------------------------------------

```rust
use indoc::indoc;

pub const MESSAGES: [&str; 8] = [
    indoc! {"
        Aderyn saved you hours of headaches.
        ☕ Buy us a virtual coffee with a GitHub star:
    "},
    indoc! {"
        🐦 Aderyn finds bugs. You write safer code.
        ⭐ Star us on GitHub if that sounds fair:
    "},
    indoc! {"
        🛡️ Together we make Solidity safer.
        ✨ Support open-source security — star Aderyn:
    "},
    indoc! {"
        ✔  Done! Fast, clean, effective.
        ⭐ Support the project with a star:
    "},
    indoc! {"
        🌱 Aderyn is growing with community support.
        Help others discover it — drop a star on GitHub:
    "},
    indoc! {"
        ✔ Aderyn did its job. Solidity's a bit safer now.
        💫 Like the tool? A star on GitHub goes a long way:
    "},
    indoc! {"
        🪶 Aderyn spotted all it could. Stay secure.
        If our little bird helped you out, give it a perch with a GitHub Star ⭐
    "},
    indoc! {"
        💡 Did Aderyn help you today?
        Show some love with a quick star on GitHub Star ⭐
    "},
];

use std::time::{SystemTime, UNIX_EPOCH};

pub fn print_last_words() {
    let random_in_range = |min: usize, max: usize| -> usize {
        let now =
            SystemTime::now().duration_since(UNIX_EPOCH).expect("Time went backwards").as_nanos();

        let hash = (now ^ (now >> 3) ^ (now << 7)) as usize;
        min + (hash % (max - min))
    };
    let message_idx = random_in_range(0, MESSAGES.len());
    let message = MESSAGES[message_idx];
    print!("\n{}", message);
    println!("https://github.com/Cyfrin/aderyn");
}

```

--------------------------------------------------------------------------------
/benchmarks/aderyn/base/sample.json:
--------------------------------------------------------------------------------

```json
{"sampling_mode":"Flat","iters":[1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0],"times":[93792368.0,125797761.0,96254770.0,102374608.0,96493368.0,94031566.0,92396047.0,92177740.0,143306731.0,117915483.0,116549204.0,120464727.0,119302292.0,103040968.0,111625647.0,100710330.0,95988974.0,100853519.0,103700207.0,96537843.0,102143255.0,99264821.0,104100188.0,103455867.0,190820242.0,199394390.0,142701189.0,100542974.0,91910714.0,93222451.0,92382061.0,93195709.0,92210554.0,92074295.0,93916028.0,94650533.0,95918744.0,93382773.0,89506898.0,93195935.0,91561765.0,91837441.0,104168599.0,103359199.0,113947329.0,109202194.0,95463817.0,91603965.0,97421558.0,132146204.0,125159248.0,99479231.0,93373712.0,92970819.0,94648268.0,100649670.0,105911313.0,114752590.0,112190279.0,116569945.0,101618637.0,100205137.0,99485415.0,103899776.0,104103036.0,105496380.0,117068490.0,114958188.0,119318918.0,114960419.0,102964747.0,119196332.0,149610159.0,139797727.0,122250300.0,120796880.0,241071573.0,156090165.0,160000214.0,137333096.0,137873192.0,139612525.0,146369137.0,127092104.0,109784544.0,115614577.0,114103645.0,115323101.0,126611514.0,159452369.0,124081522.0,117945249.0,116389840.0,120472367.0,115915601.0,163522498.0,114205847.0,172101235.0,111150712.0,121448947.0]}
```

--------------------------------------------------------------------------------
/benchmarks/aderyn/new/sample.json:
--------------------------------------------------------------------------------

```json
{"sampling_mode":"Flat","iters":[1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0],"times":[93792368.0,125797761.0,96254770.0,102374608.0,96493368.0,94031566.0,92396047.0,92177740.0,143306731.0,117915483.0,116549204.0,120464727.0,119302292.0,103040968.0,111625647.0,100710330.0,95988974.0,100853519.0,103700207.0,96537843.0,102143255.0,99264821.0,104100188.0,103455867.0,190820242.0,199394390.0,142701189.0,100542974.0,91910714.0,93222451.0,92382061.0,93195709.0,92210554.0,92074295.0,93916028.0,94650533.0,95918744.0,93382773.0,89506898.0,93195935.0,91561765.0,91837441.0,104168599.0,103359199.0,113947329.0,109202194.0,95463817.0,91603965.0,97421558.0,132146204.0,125159248.0,99479231.0,93373712.0,92970819.0,94648268.0,100649670.0,105911313.0,114752590.0,112190279.0,116569945.0,101618637.0,100205137.0,99485415.0,103899776.0,104103036.0,105496380.0,117068490.0,114958188.0,119318918.0,114960419.0,102964747.0,119196332.0,149610159.0,139797727.0,122250300.0,120796880.0,241071573.0,156090165.0,160000214.0,137333096.0,137873192.0,139612525.0,146369137.0,127092104.0,109784544.0,115614577.0,114103645.0,115323101.0,126611514.0,159452369.0,124081522.0,117945249.0,116389840.0,120472367.0,115915601.0,163522498.0,114205847.0,172101235.0,111150712.0,121448947.0]}
```

--------------------------------------------------------------------------------
/tests/ast/short_type_name.json:
--------------------------------------------------------------------------------

```json
{"absolutePath":"a","exportedSymbols":{"c":[11]},"id":12,"nodeType":"SourceUnit","nodes":[{"abstract":false,"baseContracts":[],"canonicalName":"c","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":11,"linearizedBaseContracts":[11],"name":"c","nameLocation":"9:1:1","nodeType":"ContractDefinition","nodes":[{"body":{"id":9,"nodeType":"Block","src":"33:20:1","statements":[{"assignments":[7],"declarations":[{"constant":false,"id":7,"mutability":"mutable","name":"x","nameLocation":"49:1:1","nodeType":"VariableDeclaration","scope":9,"src":"35:15:1","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":5,"name":"uint","nodeType":"ElementaryTypeName","src":"35:4:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":6,"nodeType":"ArrayTypeName","src":"35:6:1","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"id":8,"nodeType":"VariableDeclarationStatement","src":"35:15:1"}]},"functionSelector":"26121ff0","id":10,"implemented":true,"kind":"function","modifiers":[],"name":"f","nameLocation":"22:1:1","nodeType":"FunctionDefinition","parameters":{"id":1,"nodeType":"ParameterList","parameters":[],"src":"23:2:1"},"returnParameters":{"id":2,"nodeType":"ParameterList","parameters":[],"src":"33:0:1"},"scope":11,"src":"13:40:1","stateMutability":"nonpayable","virtual":false,"visibility":"public"}],"scope":12,"src":"0:55:1","usedErrors":[]}],"src":"0:56:1"}

```

--------------------------------------------------------------------------------
/aderyn_core/src/context/graph/callgraph/utils.rs:
--------------------------------------------------------------------------------

```rust
use super::*;
use crate::context::workspace::{ASTNode, WorkspaceContext};

impl CallGraphConsumer {
    /// Legacy method
    ///
    /// Creates a [`CallGraphConsumer`] that can explore paths from given nodes.
    pub(super) fn from_nodes(
        context: &WorkspaceContext,
        nodes: &[&ASTNode],
        direction: CallGraphDirection,
    ) -> super::Result<CallGraphConsumer> {
        Ok(CallGraphConsumer {
            entry_points: legacy::derive_entry_points(nodes)?,
            inward_surface_points: legacy::derive_inward_surface_points_legacy(context, nodes),
            outward_surface_points: legacy::derive_outward_surface_points(context, nodes),
            direction,
            base_contract: None,
        })
    }

    /// New method
    ///
    /// Creates a [`CallGraphConsumer`] that can explore paths from given nodes.
    pub(super) fn many_from_nodes(
        context: &WorkspaceContext,
        nodes: &[&ASTNode],
        direction: CallGraphDirection,
    ) -> super::Result<Vec<CallGraphConsumer>> {
        let mut cg_consumers = vec![];
        let cg_points = new::derive_surface_points(context, nodes);
        for (contract_id, points) in cg_points.points {
            cg_consumers.push(CallGraphConsumer {
                entry_points: points.entry.into_iter().collect(),
                inward_surface_points: points.inward.into_iter().collect(),
                outward_surface_points: points.outward.into_iter().collect(),
                direction: direction.clone(),
                base_contract: Some(contract_id),
            });
        }
        Ok(cg_consumers)
    }
}

```

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

```rust
mod callgraph;
mod preprocess;
mod traits;
mod utils;

use std::collections::HashMap;

pub use callgraph::*;
pub use traits::*;

use derive_more::From;

use crate::ast::{ASTNode, NodeID};

pub type Result<T> = core::result::Result<T, Error>;

#[derive(Debug)]
pub struct LegacyWorkspaceCallGraph {
    pub raw_callgraph: RawCallGraph,
}

#[derive(Debug, Default)]
pub struct WorkspaceCallGraphs {
    // Key => Contract Definition NodeID
    pub inward_callgraphs: HashMap<NodeID, RawCallGraph>,
    pub outward_callgraphs: HashMap<NodeID, RawCallGraph>,
}

/**
 * Every NodeID in RawCallGraph should corresponds to [`crate::ast::FunctionDefinition`] or
 * [`crate::ast::ModifierDefinition`]
 */
pub type RawCallGraph = HashMap<NodeID, Vec<NodeID>>;

#[derive(Debug, From)]
pub enum Error {
    #[from]
    Custom(String),

    // region: -- standard::* errors
    WorkspaceCallGraphDFSError,
    InwardCallgraphNotAvailable,
    OutwardCallgraphNotAvailable,
    UnidentifiedEntryPointNode(ASTNode),
    InvalidEntryPointId(NodeID),
    EntryPointVisitError,
    OutwardFunctionDefinitionVisitError,
    OutwardModifierDefinitionVisitError,
    InwardFunctionDefinitionVisitError,
    InwardModifierDefinitionVisitError,
    OutwardSideEffectFunctionDefinitionVisitError,
    OutwardSideEffectModifierDefinitionVisitError,
    // endregion
}

impl core::fmt::Display for Error {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        write!(f, "{self:?}")
    }
}

impl From<&str> for Error {
    fn from(value: &str) -> Self {
        Error::Custom(value.to_string())
    }
}

impl std::error::Error for Error {}

```

--------------------------------------------------------------------------------
/aderyn_core/src/detect/high/misused_boolean.rs:
--------------------------------------------------------------------------------

```rust
use crate::{detect::helpers::is_constant_boolean, issue_detector};
use eyre::Result;

issue_detector! {
    MisusedBooleanDetector;

    severity: High,
    title: "Misused boolean with logical operators",
    desc: "The patterns `if (… || true)` and `if (.. && false)` will always evaluate to true and false respectively.",
    name: MisusedBoolean,

    |context| {
        for binary_operation in context.binary_operations() {
            if (binary_operation.operator == "||" || binary_operation.operator == "&&")
                && [
                    binary_operation.left_expression.as_ref(),
                    binary_operation.right_expression.as_ref(),
                ]
                .iter()
                .any(|&operand| is_constant_boolean(context, operand))
            {
                grab!(binary_operation);
            }

        }

        for if_statement in context.if_statements()
            .iter()
            .filter(|statement| is_constant_boolean(context, &statement.condition)) {
            grab!(if_statement);
        }

    }

}

#[cfg(test)]
mod misused_boolean_tests {

    use crate::detect::{detector::IssueDetector, high::misused_boolean::MisusedBooleanDetector};

    #[test]

    fn test_misused_boolean_by_loading_contract_directly() {
        let context = crate::detect::test_utils::load_solidity_source_unit(
            "../tests/contract-playground/src/MisusedBoolean.sol",
        );

        let mut detector = MisusedBooleanDetector::default();
        let found = detector.detect(&context).unwrap();
        assert!(found);
        assert_eq!(detector.instances().len(), 10);
    }
}

```

--------------------------------------------------------------------------------
/benchmarks/constants-instead-of-literals/base/sample.json:
--------------------------------------------------------------------------------

```json
{"sampling_mode":"Linear","iters":[1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0,16.0,17.0,18.0,19.0,20.0,21.0,22.0,23.0,24.0,25.0,26.0,27.0,28.0,29.0,30.0,31.0,32.0,33.0,34.0,35.0,36.0,37.0,38.0,39.0,40.0,41.0,42.0,43.0,44.0,45.0,46.0,47.0,48.0,49.0,50.0,51.0,52.0,53.0,54.0,55.0,56.0,57.0,58.0,59.0,60.0,61.0,62.0,63.0,64.0,65.0,66.0,67.0,68.0,69.0,70.0,71.0,72.0,73.0,74.0,75.0,76.0,77.0,78.0,79.0,80.0,81.0,82.0,83.0,84.0,85.0,86.0,87.0,88.0,89.0,90.0,91.0,92.0,93.0,94.0,95.0,96.0,97.0,98.0,99.0,100.0],"times":[1530154.0,3786403.0,4780065.0,6216677.0,8035474.0,8938606.0,10593770.0,12056631.0,13282303.0,14929757.0,16174241.0,17504075.0,18869312.0,19023353.0,22679148.0,22519825.0,23774477.0,24889277.0,27175643.0,27833145.0,27844391.0,29172203.0,30801785.0,31952963.0,33003466.0,36186822.0,37326592.0,37893290.0,42988748.0,56336444.0,57137096.0,55538151.0,52398523.0,55036494.0,54236353.0,54891861.0,54070748.0,54155193.0,53985735.0,59019625.0,61193547.0,62909028.0,63334642.0,62950312.0,63861801.0,62503226.0,69195132.0,74584832.0,72419454.0,72525201.0,68655217.0,70553653.0,72501885.0,72573705.0,73268430.0,74415913.0,78268192.0,80314832.0,82486034.0,80097578.0,84251529.0,86143500.0,87706901.0,89353993.0,88609606.0,89144200.0,92110952.0,90592715.0,93340835.0,93799346.0,95116589.0,96573241.0,97644534.0,100361460.0,100967200.0,102238249.0,101520321.0,104297523.0,107496632.0,108144837.0,110091121.0,115870072.0,132701223.0,112406516.0,123351023.0,126283323.0,121591944.0,120108621.0,121501350.0,122774954.0,126387079.0,123549593.0,137655095.0,133832134.0,125641323.0,122604778.0,123774041.0,126619019.0,124813813.0,124270673.0]}
```

--------------------------------------------------------------------------------
/benchmarks/constants-instead-of-literals/new/sample.json:
--------------------------------------------------------------------------------

```json
{"sampling_mode":"Linear","iters":[1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0,16.0,17.0,18.0,19.0,20.0,21.0,22.0,23.0,24.0,25.0,26.0,27.0,28.0,29.0,30.0,31.0,32.0,33.0,34.0,35.0,36.0,37.0,38.0,39.0,40.0,41.0,42.0,43.0,44.0,45.0,46.0,47.0,48.0,49.0,50.0,51.0,52.0,53.0,54.0,55.0,56.0,57.0,58.0,59.0,60.0,61.0,62.0,63.0,64.0,65.0,66.0,67.0,68.0,69.0,70.0,71.0,72.0,73.0,74.0,75.0,76.0,77.0,78.0,79.0,80.0,81.0,82.0,83.0,84.0,85.0,86.0,87.0,88.0,89.0,90.0,91.0,92.0,93.0,94.0,95.0,96.0,97.0,98.0,99.0,100.0],"times":[1530154.0,3786403.0,4780065.0,6216677.0,8035474.0,8938606.0,10593770.0,12056631.0,13282303.0,14929757.0,16174241.0,17504075.0,18869312.0,19023353.0,22679148.0,22519825.0,23774477.0,24889277.0,27175643.0,27833145.0,27844391.0,29172203.0,30801785.0,31952963.0,33003466.0,36186822.0,37326592.0,37893290.0,42988748.0,56336444.0,57137096.0,55538151.0,52398523.0,55036494.0,54236353.0,54891861.0,54070748.0,54155193.0,53985735.0,59019625.0,61193547.0,62909028.0,63334642.0,62950312.0,63861801.0,62503226.0,69195132.0,74584832.0,72419454.0,72525201.0,68655217.0,70553653.0,72501885.0,72573705.0,73268430.0,74415913.0,78268192.0,80314832.0,82486034.0,80097578.0,84251529.0,86143500.0,87706901.0,89353993.0,88609606.0,89144200.0,92110952.0,90592715.0,93340835.0,93799346.0,95116589.0,96573241.0,97644534.0,100361460.0,100967200.0,102238249.0,101520321.0,104297523.0,107496632.0,108144837.0,110091121.0,115870072.0,132701223.0,112406516.0,123351023.0,126283323.0,121591944.0,120108621.0,121501350.0,122774954.0,126387079.0,123549593.0,137655095.0,133832134.0,125641323.0,122604778.0,123774041.0,126619019.0,124813813.0,124270673.0]}
```

--------------------------------------------------------------------------------
/benchmarks/inconsistent-type-names/base/sample.json:
--------------------------------------------------------------------------------

```json
{"sampling_mode":"Linear","iters":[1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0,16.0,17.0,18.0,19.0,20.0,21.0,22.0,23.0,24.0,25.0,26.0,27.0,28.0,29.0,30.0,31.0,32.0,33.0,34.0,35.0,36.0,37.0,38.0,39.0,40.0,41.0,42.0,43.0,44.0,45.0,46.0,47.0,48.0,49.0,50.0,51.0,52.0,53.0,54.0,55.0,56.0,57.0,58.0,59.0,60.0,61.0,62.0,63.0,64.0,65.0,66.0,67.0,68.0,69.0,70.0,71.0,72.0,73.0,74.0,75.0,76.0,77.0,78.0,79.0,80.0,81.0,82.0,83.0,84.0,85.0,86.0,87.0,88.0,89.0,90.0,91.0,92.0,93.0,94.0,95.0,96.0,97.0,98.0,99.0,100.0],"times":[1391819.0,3386217.0,4477651.0,6524564.0,7318024.0,9048109.0,9425488.0,11788924.0,12828796.0,13837872.0,15116400.0,16509303.0,17964175.0,19454366.0,20834586.0,22690938.0,24731256.0,24470341.0,51938004.0,34618273.0,33539975.0,35307362.0,33854398.0,43262153.0,33239567.0,34581602.0,38079560.0,37190004.0,39196121.0,41439007.0,45214454.0,52692402.0,84566651.0,81819636.0,175764715.0,69021524.0,64483921.0,74659844.0,87088671.0,61066938.0,73088726.0,62188662.0,97479725.0,71287929.0,76791498.0,73379120.0,72118482.0,72526746.0,74200748.0,69667915.0,70815119.0,73712764.0,129778210.0,104212871.0,92037879.0,89621704.0,94037949.0,98800282.0,93295515.0,99444742.0,96661099.0,207670202.0,119110134.0,124353249.0,133843290.0,98900375.0,99755899.0,104107496.0,115668505.0,121691129.0,133149960.0,126631987.0,118332600.0,113460003.0,118194027.0,116893945.0,117890680.0,120412950.0,121675553.0,142772487.0,125229628.0,129010023.0,123035780.0,142395818.0,152111201.0,127373286.0,130579969.0,129336934.0,145881032.0,142304156.0,170626431.0,176995000.0,136790746.0,129906996.0,140958540.0,164265694.0,170057358.0,144300927.0,139602643.0,140552634.0]}
```
Page 2/94FirstPrevNextLast