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

# Directory Structure

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

# Files

--------------------------------------------------------------------------------
/benchmarks/delegate-call-in-loop/report/change/t-test.svg:
--------------------------------------------------------------------------------

```
 1 | <svg width="960" height="540" viewBox="0 0 960 540" xmlns="http://www.w3.org/2000/svg">
 2 | <text x="480" y="32" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="16.129032258064516" opacity="1" fill="#000000">
 3 | delegate-call-in-loop: Welch t test
 4 | </text>
 5 | <text x="27" y="263" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000" transform="rotate(270, 27, 263)">
 6 | Density
 7 | </text>
 8 | <text x="510" y="513" dy="-0.5ex" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 9 | t score
10 | </text>
11 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="86,53 86,472 "/>
12 | <text x="77" y="472" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
13 | 0.0
14 | </text>
15 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,472 86,472 "/>
16 | <text x="77" y="423" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
17 | 0.05
18 | </text>
19 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,423 86,423 "/>
20 | <text x="77" y="373" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
21 | 0.1
22 | </text>
23 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,373 86,373 "/>
24 | <text x="77" y="324" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
25 | 0.15
26 | </text>
27 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,324 86,324 "/>
28 | <text x="77" y="274" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
29 | 0.2
30 | </text>
31 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,274 86,274 "/>
32 | <text x="77" y="224" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
33 | 0.25
34 | </text>
35 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,224 86,224 "/>
36 | <text x="77" y="175" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
37 | 0.3
38 | </text>
39 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,175 86,175 "/>
40 | <text x="77" y="125" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
41 | 0.35
42 | </text>
43 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,125 86,125 "/>
44 | <text x="77" y="75" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
45 | 0.4
46 | </text>
47 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,75 86,75 "/>
48 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="87,473 932,473 "/>
49 | <text x="114" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
50 | -4.0
51 | </text>
52 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="114,473 114,478 "/>
53 | <text x="215" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
54 | -3.0
55 | </text>
56 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="215,473 215,478 "/>
57 | <text x="317" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
58 | -2.0
59 | </text>
60 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="317,473 317,478 "/>
61 | <text x="418" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
62 | -1.0
63 | </text>
64 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="418,473 418,478 "/>
65 | <text x="520" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
66 | 0.0
67 | </text>
68 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="520,473 520,478 "/>
69 | <text x="621" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
70 | 1.0
71 | </text>
72 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="621,473 621,478 "/>
73 | <text x="723" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
74 | 2.0
75 | </text>
76 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="723,473 723,478 "/>
77 | <text x="824" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
78 | 3.0
79 | </text>
80 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="824,473 824,478 "/>
81 | <text x="926" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
82 | 4.0
83 | </text>
84 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="926,473 926,478 "/>
85 | <polygon opacity="0.25" fill="#1F78B4" points="87,472 88,472 90,472 92,472 93,472 95,472 97,472 98,472 100,472 102,472 103,472 105,472 107,472 109,472 110,472 112,472 114,472 115,472 117,472 119,472 120,472 122,472 124,472 125,472 127,472 129,472 131,472 132,472 134,472 136,472 137,472 139,472 141,472 142,472 144,472 146,472 147,472 149,472 151,472 153,472 154,472 156,472 158,472 159,472 161,472 163,472 164,472 166,472 168,472 169,472 171,472 173,472 175,472 176,472 178,472 180,472 181,472 183,472 185,472 186,471 188,471 190,471 191,471 193,471 195,471 197,471 198,471 200,471 202,471 203,470 205,470 207,470 208,470 210,470 212,470 214,469 215,469 217,469 219,469 220,469 222,468 224,468 225,468 227,468 229,467 230,467 232,467 234,466 236,466 237,465 239,465 241,465 242,464 244,463 246,463 247,462 249,462 251,461 252,460 254,460 256,459 258,459 259,458 261,457 263,456 264,456 266,455 268,454 269,454 271,453 273,452 274,451 276,450 278,449 280,448 281,448 283,446 285,445 286,444 288,443 290,442 291,440 293,439 295,437 296,436 298,434 300,432 302,430 303,428 305,426 307,424 308,423 310,421 312,419 313,417 315,415 317,412 318,410 320,408 322,406 324,404 325,402 327,399 329,397 330,395 332,392 334,390 335,387 337,385 339,382 341,380 342,377 344,374 346,372 347,369 349,366 351,364 352,361 354,358 356,355 357,352 359,349 361,346 363,343 364,340 366,337 368,334 369,330 371,327 373,323 374,320 376,316 378,312 379,308 381,304 383,300 385,296 386,293 388,289 390,285 391,281 393,277 395,273 396,270 398,266 400,262 401,259 403,255 405,252 407,249 408,245 410,242 412,239 413,236 415,233 417,229 418,226 420,223 422,220 423,217 425,214 427,211 429,208 430,204 432,201 434,198 435,195 437,191 439,188 440,185 442,181 444,177 445,174 447,170 449,166 451,163 452,159 454,156 456,152 457,149 459,146 461,142 462,139 464,136 466,133 468,130 469,128 471,125 473,123 474,120 476,118 478,116 479,115 481,113 483,112 484,111 486,110 488,110 490,109 491,108 493,108 495,107 496,106 498,105 500,104 501,102 503,101 505,99 506,98 508,96 510,95 512,94 513,93 515,92 517,92 518,92 520,92 522,92 523,93 525,93 527,94 528,95 530,96 532,97 534,98 535,99 537,101 539,102 540,103 542,105 544,106 545,108 547,110 549,112 550,113 552,115 554,117 556,119 557,120 559,122 561,124 562,126 564,128 566,130 567,131 569,133 571,135 573,137 574,139 576,141 578,143 579,146 581,148 583,150 584,153 586,156 588,159 589,162 591,165 593,169 595,172 596,176 598,180 600,184 601,188 603,191 605,195 606,199 608,203 610,206 611,210 613,213 615,217 617,220 618,223 620,226 622,229 623,233 625,236 627,239 628,243 630,246 632,250 633,253 635,257 637,260 639,264 640,268 642,271 644,275 645,279 647,282 649,286 650,290 652,293 654,297 655,301 657,304 659,308 661,311 662,315 664,318 666,321 667,324 669,327 671,330 672,333 674,335 676,338 677,341 679,344 681,346 683,349 684,352 686,355 688,358 689,361 691,364 693,367 694,370 696,373 698,376 700,379 701,381 703,384 705,387 706,390 708,392 710,395 711,398 713,400 715,403 716,405 718,408 720,410 722,413 723,415 725,417 727,419 728,421 730,423 732,425 733,427 735,429 737,431 738,433 740,434 742,436 744,437 745,439 747,440 749,441 750,443 752,444 754,445 755,446 757,447 759,448 760,449 762,450 764,451 766,452 767,453 769,454 771,455 772,456 774,457 776,457 777,458 779,459 781,459 782,460 784,461 786,461 788,462 789,462 791,463 793,464 794,464 796,465 798,465 799,465 801,466 803,466 804,467 806,467 808,468 810,468 811,468 813,468 815,469 816,469 818,469 820,469 821,470 823,470 825,470 827,470 828,470 830,470 832,471 833,471 835,471 837,471 838,471 840,471 842,471 843,471 845,471 847,471 849,471 850,472 852,472 854,472 855,472 857,472 859,472 860,472 862,472 864,472 865,472 867,472 869,472 871,472 872,472 874,472 876,472 877,472 879,472 881,472 882,472 884,472 886,472 887,472 889,472 891,472 893,472 894,472 896,472 898,472 899,472 901,472 903,472 904,472 906,472 908,472 909,472 911,472 913,472 915,472 916,472 918,472 920,472 921,472 923,472 925,472 926,472 928,472 930,472 932,472 932,472 87,472 "/>
86 | <polyline fill="none" opacity="1" stroke="#1F78B4" stroke-width="2" points="933,472 933,53 "/>
87 | <text x="842" y="250" dy="0.76em" text-anchor="start" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
88 | t distribution
89 | </text>
90 | <text x="842" y="265" dy="0.76em" text-anchor="start" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
91 | t statistic
92 | </text>
93 | <rect x="812" y="250" width="20" height="10" opacity="0.25" fill="#1F78B4" stroke="none"/>
94 | <polyline fill="none" opacity="1" stroke="#1F78B4" stroke-width="1" points="812,270 832,270 "/>
95 | </svg>
96 | 
```

--------------------------------------------------------------------------------
/benchmarks/unspecific-solidity-pragma/report/change/t-test.svg:
--------------------------------------------------------------------------------

```
 1 | <svg width="960" height="540" viewBox="0 0 960 540" xmlns="http://www.w3.org/2000/svg">
 2 | <text x="480" y="32" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="16.129032258064516" opacity="1" fill="#000000">
 3 | unspecific-solidity-pragma: Welch t test
 4 | </text>
 5 | <text x="27" y="263" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000" transform="rotate(270, 27, 263)">
 6 | Density
 7 | </text>
 8 | <text x="510" y="513" dy="-0.5ex" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 9 | t score
10 | </text>
11 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="86,53 86,472 "/>
12 | <text x="77" y="472" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
13 | 0.0
14 | </text>
15 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,472 86,472 "/>
16 | <text x="77" y="424" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
17 | 0.05
18 | </text>
19 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,424 86,424 "/>
20 | <text x="77" y="376" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
21 | 0.1
22 | </text>
23 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,376 86,376 "/>
24 | <text x="77" y="327" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
25 | 0.15
26 | </text>
27 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,327 86,327 "/>
28 | <text x="77" y="279" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
29 | 0.2
30 | </text>
31 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,279 86,279 "/>
32 | <text x="77" y="230" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
33 | 0.25
34 | </text>
35 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,230 86,230 "/>
36 | <text x="77" y="182" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
37 | 0.3
38 | </text>
39 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,182 86,182 "/>
40 | <text x="77" y="133" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
41 | 0.35
42 | </text>
43 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,133 86,133 "/>
44 | <text x="77" y="85" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
45 | 0.4
46 | </text>
47 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,85 86,85 "/>
48 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="87,473 932,473 "/>
49 | <text x="153" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
50 | -4.0
51 | </text>
52 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="153,473 153,478 "/>
53 | <text x="243" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
54 | -3.0
55 | </text>
56 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="243,473 243,478 "/>
57 | <text x="333" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
58 | -2.0
59 | </text>
60 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="333,473 333,478 "/>
61 | <text x="423" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
62 | -1.0
63 | </text>
64 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="423,473 423,478 "/>
65 | <text x="513" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
66 | 0.0
67 | </text>
68 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="513,473 513,478 "/>
69 | <text x="603" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
70 | 1.0
71 | </text>
72 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="603,473 603,478 "/>
73 | <text x="693" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
74 | 2.0
75 | </text>
76 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="693,473 693,478 "/>
77 | <text x="783" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
78 | 3.0
79 | </text>
80 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="783,473 783,478 "/>
81 | <text x="873" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
82 | 4.0
83 | </text>
84 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="873,473 873,478 "/>
85 | <polygon opacity="0.25" fill="#1F78B4" points="87,472 88,472 90,472 92,472 93,472 95,472 97,472 98,472 100,472 102,472 103,472 105,472 107,472 109,472 110,472 112,472 114,472 115,472 117,472 119,472 120,472 122,472 124,472 125,472 127,472 129,472 131,472 132,472 134,472 136,472 137,472 139,472 141,472 142,472 144,472 146,472 147,472 149,472 151,472 153,472 154,472 156,472 158,472 159,472 161,472 163,472 164,472 166,472 168,472 169,472 171,472 173,472 175,472 176,472 178,472 180,472 181,472 183,472 185,472 186,472 188,472 190,472 191,472 193,472 195,472 197,472 198,472 200,472 202,472 203,472 205,471 207,471 208,471 210,471 212,471 214,471 215,471 217,471 219,471 220,471 222,471 224,471 225,470 227,470 229,470 230,470 232,469 234,469 236,469 237,469 239,469 241,468 242,468 244,468 246,468 247,467 249,467 251,467 252,467 254,466 256,466 258,466 259,465 261,465 263,465 264,464 266,464 268,463 269,463 271,462 273,462 274,461 276,460 278,460 280,459 281,458 283,458 285,457 286,456 288,455 290,454 291,453 293,452 295,451 296,450 298,449 300,448 302,447 303,445 305,444 307,443 308,442 310,441 312,440 313,438 315,437 317,436 318,434 320,433 322,431 324,429 325,427 327,425 329,423 330,421 332,419 334,417 335,415 337,413 339,411 341,409 342,406 344,404 346,402 347,399 349,396 351,394 352,391 354,388 356,385 357,382 359,378 361,375 363,372 364,369 366,366 368,363 369,360 371,357 373,354 374,351 376,348 378,345 379,342 381,339 383,336 385,333 386,329 388,326 390,322 391,319 393,315 395,311 396,307 398,303 400,298 401,294 403,290 405,285 407,281 408,276 410,271 412,266 413,262 415,257 417,252 418,248 420,243 422,239 423,235 425,231 427,227 429,223 430,219 432,216 434,212 435,208 437,204 439,200 440,196 442,192 444,187 445,183 447,179 449,175 451,171 452,167 454,163 456,159 457,155 459,151 461,148 462,144 464,141 466,138 468,135 469,132 471,129 473,127 474,124 476,122 478,119 479,117 481,115 483,113 484,111 486,109 488,107 490,105 491,103 493,101 495,99 496,97 498,96 500,95 501,94 503,93 505,92 506,92 508,92 510,92 512,92 513,92 515,92 517,93 518,93 520,94 522,95 523,96 525,96 527,97 528,98 530,99 532,100 534,101 535,102 537,103 539,105 540,106 542,108 544,110 545,112 547,115 549,117 550,120 552,123 554,126 556,129 557,132 559,136 561,139 562,142 564,146 566,149 567,153 569,156 571,160 573,164 574,168 576,172 578,176 579,180 581,183 583,187 584,191 586,195 588,199 589,202 591,206 593,210 595,214 596,218 598,222 600,226 601,230 603,234 605,238 606,243 608,247 610,252 611,256 613,261 615,266 617,270 618,275 620,279 622,283 623,287 625,292 627,296 628,300 630,304 632,308 633,311 635,315 637,319 639,323 640,327 642,331 644,335 645,339 647,342 649,346 650,349 652,353 654,356 655,360 657,363 659,366 661,369 662,373 664,376 666,379 667,382 669,384 671,387 672,390 674,393 676,395 677,398 679,400 681,403 683,405 684,407 686,409 688,412 689,414 691,416 693,418 694,420 696,422 698,424 700,426 701,428 703,429 705,431 706,433 708,434 710,436 711,437 713,438 715,440 716,441 718,442 720,443 722,444 723,445 725,446 727,447 728,448 730,449 732,450 733,451 735,452 737,453 738,454 740,455 742,456 744,457 745,457 747,458 749,459 750,460 752,461 754,461 755,462 757,462 759,463 760,463 762,464 764,464 766,464 767,465 769,465 771,465 772,466 774,466 776,466 777,466 779,467 781,467 782,467 784,467 786,468 788,468 789,468 791,468 793,469 794,469 796,469 798,469 799,470 801,470 803,470 804,470 806,471 808,471 810,471 811,471 813,471 815,471 816,471 818,471 820,471 821,471 823,471 825,472 827,472 828,472 830,472 832,472 833,472 835,472 837,472 838,472 840,472 842,472 843,472 845,472 847,472 849,472 850,472 852,472 854,472 855,472 857,472 859,472 860,472 862,472 864,472 865,472 867,472 869,472 871,472 872,472 874,472 876,472 877,472 879,472 881,472 882,472 884,472 886,472 887,472 889,472 891,472 893,472 894,472 896,472 898,472 899,472 901,472 903,472 904,472 906,472 908,472 909,472 911,472 913,472 915,472 916,472 918,472 920,472 921,472 923,472 925,472 926,472 928,472 930,472 932,472 932,472 87,472 "/>
86 | <polyline fill="none" opacity="1" stroke="#1F78B4" stroke-width="2" points="205,472 205,53 "/>
87 | <text x="842" y="250" dy="0.76em" text-anchor="start" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
88 | t distribution
89 | </text>
90 | <text x="842" y="265" dy="0.76em" text-anchor="start" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
91 | t statistic
92 | </text>
93 | <rect x="812" y="250" width="20" height="10" opacity="0.25" fill="#1F78B4" stroke="none"/>
94 | <polyline fill="none" opacity="1" stroke="#1F78B4" stroke-width="1" points="812,270 832,270 "/>
95 | </svg>
96 | 
```

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

```rust
  1 | use crate::context::{
  2 |     macros::{mcp_error, mcp_success},
  3 |     mcp::{
  4 |         MCPToolNamePool, ModelContextProtocolState, ModelContextProtocolTool,
  5 |         node_finder::{render::*, utils::*},
  6 |     },
  7 | };
  8 | use indoc::indoc;
  9 | use regex::Regex;
 10 | use rmcp::{
 11 |     ErrorData as McpError, handler::server::wrapper::Parameters, model::CallToolResult, schemars,
 12 | };
 13 | use serde::Deserialize;
 14 | use std::{collections::BTreeMap, sync::Arc};
 15 | 
 16 | #[derive(Clone)]
 17 | pub struct NodeFinderTool {
 18 |     state: Arc<ModelContextProtocolState>,
 19 | }
 20 | 
 21 | #[derive(Deserialize, schemars::JsonSchema)]
 22 | pub struct NodeFinderPayload {
 23 |     /// Search function nodes by the exact function name
 24 |     #[serde(rename = "search_functions_by_exact_name")]
 25 |     function_name: Option<String>,
 26 |     /// Search modifier nodes by the exact modifier name
 27 |     #[serde(rename = "search_modifiers_by_exact_name")]
 28 |     modifier_name: Option<String>,
 29 |     /// Search contract class nodes by the exact contract class name
 30 |     #[serde(rename = "search_contract_classes_by_exact_name")]
 31 |     contract_class_name: Option<String>,
 32 |     /// Grep for symbols and references by recursively searching through the implementaion of all
 33 |     /// the functions, modifiers, state variables, etc. Input just the bare regex pattern, not
 34 |     /// wrapped in / or quotes. Also do not use super advanced regex features.
 35 |     #[serde(rename = "search_nodes_by_grep")]
 36 |     regex_term: Option<String>,
 37 |     /// Get all the event definitions
 38 |     get_all_events: Option<bool>,
 39 |     /// Get all the error definitions
 40 |     get_all_errors: Option<bool>,
 41 |     /// Optional compilation unit index helps restrict the scope of search to the given compilation
 42 |     /// unit.
 43 |     compilation_unit_index: Option<usize>,
 44 | }
 45 | 
 46 | #[derive(Deserialize, schemars::JsonSchema)]
 47 | pub enum SearchType {
 48 |     SearchFunctionsByName(String),
 49 |     SearchModifiersByName(String),
 50 |     SearchContractsByName(String),
 51 |     SearchNodesByRegex(String),
 52 |     GetAllEvents,
 53 |     GetAllErrors,
 54 | }
 55 | 
 56 | impl SearchType {
 57 |     fn get_search_name(&self) -> Option<String> {
 58 |         match self {
 59 |             SearchType::SearchFunctionsByName(name)
 60 |             | SearchType::SearchModifiersByName(name)
 61 |             | SearchType::SearchContractsByName(name) => Some(name.clone()),
 62 |             SearchType::GetAllEvents
 63 |             | SearchType::GetAllErrors
 64 |             | SearchType::SearchNodesByRegex(_) => None,
 65 |         }
 66 |     }
 67 | }
 68 | 
 69 | impl ModelContextProtocolTool for NodeFinderTool {
 70 |     type Input = NodeFinderPayload;
 71 | 
 72 |     fn new(state: Arc<ModelContextProtocolState>) -> Self {
 73 |         Self { state }
 74 |     }
 75 | 
 76 |     fn name(&self) -> String {
 77 |         MCPToolNamePool::AderynNodeFinder.to_string()
 78 |     }
 79 | 
 80 |     fn description(&self) -> String {
 81 |         indoc! {
 82 |             "Retrieve nodes IDs and compilation unit indexes of nodes matched by either supplying the exact\
 83 |             names of functions, modifiers and contracts or grep them with a regular expression.\
 84 |             Important: Input only 1 search field (chose from functions, modifiers, contracts, events, errors and grep) \
 85 |             Optionally also input 'compilation_unit_index' to limit the search to a specific compilation unit."
 86 |         }
 87 |         .to_string()
 88 |     }
 89 | 
 90 |     fn execute(&self, input: Parameters<Self::Input>) -> Result<CallToolResult, McpError> {
 91 |         let payload = input.0;
 92 | 
 93 |         if let Some(compilation_unit_index) = payload.compilation_unit_index
 94 |             && (compilation_unit_index < 1 || compilation_unit_index > self.state.contexts.len())
 95 |         {
 96 |             return mcp_error!(
 97 |                 "Invalid compilation unit index: {}. Must be in range [1, {}]",
 98 |                 compilation_unit_index,
 99 |                 self.state.contexts.len()
100 |             );
101 |         }
102 | 
103 |         let received_search_opts: Vec<SearchType> = extract_search_options_from_payload(&payload);
104 | 
105 |         if received_search_opts.is_empty() {
106 |             return mcp_error!(
107 |                 "Choose a single search option from contract, function, modifier, errors, events and grep. None received"
108 |             );
109 |         }
110 | 
111 |         if received_search_opts.len() > 1 {
112 |             return mcp_error!(
113 |                 "Choose a single search option from contract, function, modifier, errors, events and grep. Multiple received"
114 |             );
115 |         }
116 | 
117 |         if let Some(Err(regex_error)) = payload.regex_term.map(|regex_term| Regex::new(&regex_term))
118 |         {
119 |             return mcp_error!(
120 |                 "Invalid regex passed. It must be compatible with rust's regex. {}",
121 |                 regex_error
122 |             );
123 |         }
124 | 
125 |         let search_term =
126 |             received_search_opts.first().expect("no checks to ensure 1 received search option");
127 | 
128 |         if let Some(name) = search_term.get_search_name()
129 |             && !name.chars().all(|c| c.is_ascii_alphanumeric() || c == '_')
130 |         {
131 |             return mcp_error!(
132 |                 "To pass a regular expression as a search term, use the search by grep option"
133 |             )
134 |         }
135 | 
136 |         // Nodes whose names exactly match with the input term.
137 |         let mut matching_contracts = vec![];
138 |         let mut matching_functions = vec![];
139 |         let mut matching_modifiers = vec![];
140 | 
141 |         // Nodes whose code snippet matches the grep test.
142 |         let mut grepped_functions = vec![];
143 |         let mut grepped_modifiers = vec![];
144 |         let mut grepped_state_variables = vec![];
145 | 
146 |         let mut events = vec![];
147 |         let mut errors = vec![];
148 | 
149 |         for (i, context) in self.state.as_ref().contexts.iter().enumerate() {
150 |             let should_add;
151 | 
152 |             if let Some(compilation_unit_index) = payload.compilation_unit_index {
153 |                 should_add = i == compilation_unit_index - 1;
154 |             } else {
155 |                 should_add = true;
156 |             }
157 | 
158 |             if should_add {
159 |                 match search_term {
160 |                     SearchType::SearchContractsByName(name)
161 |                     | SearchType::SearchFunctionsByName(name)
162 |                     | SearchType::SearchModifiersByName(name) => {
163 |                         matching_contracts.extend(get_matching_contracts(i + 1, context, name));
164 |                         matching_functions.extend(get_matching_functions(i + 1, context, name));
165 |                         matching_modifiers.extend(get_matching_modifiers(i + 1, context, name));
166 |                     }
167 |                     SearchType::GetAllEvents | SearchType::GetAllErrors => {
168 |                         events.extend(get_all_events(i + 1, context));
169 |                         errors.extend(get_all_errors(i + 1, context));
170 |                     }
171 |                     SearchType::SearchNodesByRegex(term) => {
172 |                         grepped_functions.extend(grep_functions(i + 1, context, term));
173 |                         grepped_modifiers.extend(grep_modifiers(i + 1, context, term));
174 |                         grepped_state_variables.extend(grep_state_variables(i + 1, context, term));
175 |                     }
176 |                 }
177 |             }
178 |         }
179 | 
180 |         match search_term {
181 |             SearchType::SearchContractsByName(name) => {
182 |                 mcp_success!(node_finder_matches(name, matching_contracts, "Contract"))
183 |             }
184 |             SearchType::SearchFunctionsByName(name) => {
185 |                 mcp_success!(node_finder_matches(name, matching_functions, "Function"))
186 |             }
187 |             SearchType::SearchModifiersByName(name) => {
188 |                 mcp_success!(node_finder_matches(name, matching_modifiers, "Modifier"))
189 |             }
190 |             SearchType::GetAllEvents => mcp_success!(node_finder_all(events, "Event")),
191 |             SearchType::GetAllErrors => mcp_success!(node_finder_all(errors, "Error")),
192 |             SearchType::SearchNodesByRegex(term) => {
193 |                 mcp_success!(node_grep_matches(
194 |                     term,
195 |                     grepped_state_variables,
196 |                     grepped_functions,
197 |                     grepped_modifiers
198 |                 ))
199 |             }
200 |         }
201 |     }
202 | }
203 | 
204 | fn extract_search_options_from_payload(payload: &NodeFinderPayload) -> Vec<SearchType> {
205 |     // Keep the string if it's non empty after trimming
206 |     let sanitize = |opt: &Option<String>| opt.as_ref().filter(|s| !s.trim().is_empty()).cloned();
207 | 
208 |     [
209 |         payload.get_all_errors.filter(|&enabled| enabled).map(|_| SearchType::GetAllErrors),
210 |         payload.get_all_events.filter(|&enabled| enabled).map(|_| SearchType::GetAllEvents),
211 |         sanitize(&payload.regex_term).map(SearchType::SearchNodesByRegex),
212 |         sanitize(&payload.contract_class_name).map(SearchType::SearchContractsByName),
213 |         sanitize(&payload.function_name).map(SearchType::SearchFunctionsByName),
214 |         sanitize(&payload.modifier_name).map(SearchType::SearchModifiersByName),
215 |     ]
216 |     .into_iter()
217 |     .flatten()
218 |     .collect()
219 | }
220 | 
221 | fn node_finder_matches(term: &str, nodes: Vec<NodeInfo>, ty: &str) -> NodeFinderMatches {
222 |     NodeFinderMatchesBuilder::default()
223 |         .term(term.to_string())
224 |         .matching_nodes(nodes)
225 |         .node_type(ty.to_string())
226 |         .build()
227 |         .expect("failed to build renderer for node finder")
228 | }
229 | 
230 | fn node_grep_matches(
231 |     term: &str,
232 |     state_vars: Vec<NodeInfo>,
233 |     functions: Vec<NodeInfo>,
234 |     modifiers: Vec<NodeInfo>,
235 | ) -> NodeFinderGrepMatches {
236 |     let mut nodes = BTreeMap::new();
237 | 
238 |     if !state_vars.is_empty() {
239 |         nodes.insert("state variable".to_string(), state_vars);
240 |     }
241 |     if !functions.is_empty() {
242 |         nodes.insert("function".to_string(), functions);
243 |     }
244 |     if !modifiers.is_empty() {
245 |         nodes.insert("modifier".to_string(), modifiers);
246 |     }
247 | 
248 |     NodeFinderGrepMatchesBuilder::default()
249 |         .term(term.to_string())
250 |         .nodes(nodes)
251 |         .build()
252 |         .expect("failed to build node finder grep matches")
253 | }
254 | 
255 | fn node_finder_all(nodes: Vec<NodeInfo>, ty: &str) -> NodeFinderAll {
256 |     NodeFinderAllBuilder::default()
257 |         .nodes(nodes)
258 |         .node_type(ty.to_string())
259 |         .build()
260 |         .expect("failed to build renderer for node finder")
261 | }
262 | 
```

--------------------------------------------------------------------------------
/benchmarks/empty-block/report/change/t-test.svg:
--------------------------------------------------------------------------------

```
  1 | <svg width="960" height="540" viewBox="0 0 960 540" xmlns="http://www.w3.org/2000/svg">
  2 | <text x="480" y="32" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="16.129032258064516" opacity="1" fill="#000000">
  3 | empty-block: Welch t test
  4 | </text>
  5 | <text x="27" y="263" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000" transform="rotate(270, 27, 263)">
  6 | Density
  7 | </text>
  8 | <text x="510" y="513" dy="-0.5ex" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
  9 | t score
 10 | </text>
 11 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="86,53 86,472 "/>
 12 | <text x="77" y="472" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 13 | 0.0
 14 | </text>
 15 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,472 86,472 "/>
 16 | <text x="77" y="424" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 17 | 0.05
 18 | </text>
 19 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,424 86,424 "/>
 20 | <text x="77" y="375" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 21 | 0.1
 22 | </text>
 23 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,375 86,375 "/>
 24 | <text x="77" y="326" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 25 | 0.15
 26 | </text>
 27 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,326 86,326 "/>
 28 | <text x="77" y="278" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 29 | 0.2
 30 | </text>
 31 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,278 86,278 "/>
 32 | <text x="77" y="229" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 33 | 0.25
 34 | </text>
 35 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,229 86,229 "/>
 36 | <text x="77" y="180" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 37 | 0.3
 38 | </text>
 39 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,180 86,180 "/>
 40 | <text x="77" y="131" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 41 | 0.35
 42 | </text>
 43 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,131 86,131 "/>
 44 | <text x="77" y="83" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 45 | 0.4
 46 | </text>
 47 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,83 86,83 "/>
 48 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="87,473 932,473 "/>
 49 | <text x="90" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 50 | -5.0
 51 | </text>
 52 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="90,473 90,478 "/>
 53 | <text x="175" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 54 | -4.0
 55 | </text>
 56 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="175,473 175,478 "/>
 57 | <text x="261" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 58 | -3.0
 59 | </text>
 60 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="261,473 261,478 "/>
 61 | <text x="346" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 62 | -2.0
 63 | </text>
 64 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="346,473 346,478 "/>
 65 | <text x="432" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 66 | -1.0
 67 | </text>
 68 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="432,473 432,478 "/>
 69 | <text x="518" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 70 | 0.0
 71 | </text>
 72 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="518,473 518,478 "/>
 73 | <text x="603" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 74 | 1.0
 75 | </text>
 76 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="603,473 603,478 "/>
 77 | <text x="689" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 78 | 2.0
 79 | </text>
 80 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="689,473 689,478 "/>
 81 | <text x="774" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 82 | 3.0
 83 | </text>
 84 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="774,473 774,478 "/>
 85 | <text x="860" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 86 | 4.0
 87 | </text>
 88 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="860,473 860,478 "/>
 89 | <polygon opacity="0.25" fill="#1F78B4" points="87,472 88,472 90,472 92,472 93,472 95,472 97,472 98,472 100,472 102,472 103,472 105,472 107,472 109,472 110,472 112,472 114,472 115,472 117,472 119,472 120,472 122,472 124,472 125,472 127,472 129,472 131,472 132,472 134,472 136,472 137,472 139,472 141,472 142,472 144,472 146,472 147,472 149,472 151,472 153,472 154,472 156,472 158,472 159,472 161,472 163,472 164,472 166,472 168,472 169,472 171,472 173,472 175,472 176,472 178,472 180,472 181,472 183,472 185,472 186,472 188,472 190,472 191,472 193,472 195,472 197,472 198,472 200,472 202,472 203,472 205,472 207,472 208,472 210,472 212,472 214,472 215,472 217,472 219,472 220,471 222,471 224,471 225,471 227,471 229,471 230,471 232,471 234,471 236,471 237,471 239,471 241,471 242,470 244,470 246,470 247,470 249,470 251,470 252,469 254,469 256,469 258,469 259,469 261,468 263,468 264,468 266,468 268,467 269,467 271,467 273,466 274,466 276,466 278,465 280,465 281,464 283,464 285,463 286,462 288,462 290,461 291,461 293,460 295,459 296,458 298,458 300,457 302,456 303,455 305,454 307,453 308,452 310,451 312,450 313,449 315,448 317,447 318,446 320,445 322,443 324,442 325,440 327,439 329,437 330,436 332,434 334,432 335,431 337,429 339,427 341,425 342,423 344,421 346,419 347,416 349,414 351,412 352,409 354,406 356,403 357,400 359,397 361,394 363,391 364,388 366,385 368,382 369,379 371,376 373,373 374,370 376,367 378,364 379,361 381,358 383,354 385,351 386,347 388,344 390,340 391,337 393,333 395,329 396,325 398,321 400,317 401,313 403,309 405,305 407,301 408,296 410,292 412,288 413,284 415,279 417,275 418,270 420,266 422,261 423,256 425,252 427,247 429,242 430,238 432,233 434,228 435,224 437,219 439,215 440,210 442,206 444,201 445,197 447,192 449,187 451,183 452,178 454,174 456,170 457,165 459,161 461,157 462,154 464,150 466,147 468,144 469,141 471,139 473,136 474,134 476,131 478,129 479,127 481,125 483,122 484,120 486,118 488,116 490,114 491,112 493,110 495,109 496,107 498,106 500,105 501,104 503,103 505,102 506,101 508,100 510,99 512,98 513,96 515,95 517,94 518,93 520,92 522,92 523,92 525,92 527,92 528,93 530,94 532,96 534,98 535,100 537,102 539,104 540,106 542,109 544,111 545,113 547,115 549,118 550,120 552,123 554,125 556,128 557,131 559,134 561,137 562,141 564,144 566,148 567,152 569,155 571,159 573,163 574,167 576,170 578,174 579,177 581,181 583,185 584,188 586,192 588,195 589,199 591,203 593,206 595,210 596,215 598,219 600,223 601,228 603,233 605,237 606,242 608,247 610,252 611,257 613,261 615,266 617,270 618,275 620,279 622,283 623,287 625,292 627,296 628,300 630,303 632,307 633,311 635,315 637,319 639,324 640,328 642,332 644,336 645,340 647,344 649,348 650,352 652,356 654,360 655,364 657,367 659,371 661,374 662,377 664,380 666,383 667,386 669,389 671,392 672,395 674,397 676,400 677,403 679,405 681,407 683,410 684,412 686,414 688,416 689,418 691,421 693,423 694,425 696,427 698,429 700,430 701,432 703,434 705,435 706,437 708,438 710,440 711,441 713,442 715,444 716,445 718,446 720,447 722,449 723,450 725,451 727,452 728,453 730,454 732,455 733,456 735,457 737,458 738,459 740,460 742,460 744,461 745,462 747,462 749,463 750,464 752,464 754,465 755,465 757,465 759,466 760,466 762,467 764,467 766,467 767,468 769,468 771,468 772,468 774,469 776,469 777,469 779,469 781,469 782,470 784,470 786,470 788,470 789,470 791,470 793,470 794,470 796,470 798,471 799,471 801,471 803,471 804,471 806,471 808,471 810,471 811,471 813,471 815,471 816,472 818,472 820,472 821,472 823,472 825,472 827,472 828,472 830,472 832,472 833,472 835,472 837,472 838,472 840,472 842,472 843,472 845,472 847,472 849,472 850,472 852,472 854,472 855,472 857,472 859,472 860,472 862,472 864,472 865,472 867,472 869,472 871,472 872,472 874,472 876,472 877,472 879,472 881,472 882,472 884,472 886,472 887,472 889,472 891,472 893,472 894,472 896,472 898,472 899,472 901,472 903,472 904,472 906,472 908,472 909,472 911,472 913,472 915,472 916,472 918,472 920,472 921,472 923,472 925,472 926,472 928,472 930,472 932,472 932,472 87,472 "/>
 90 | <polyline fill="none" opacity="1" stroke="#1F78B4" stroke-width="2" points="87,472 87,53 "/>
 91 | <text x="842" y="250" dy="0.76em" text-anchor="start" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 92 | t distribution
 93 | </text>
 94 | <text x="842" y="265" dy="0.76em" text-anchor="start" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 95 | t statistic
 96 | </text>
 97 | <rect x="812" y="250" width="20" height="10" opacity="0.25" fill="#1F78B4" stroke="none"/>
 98 | <polyline fill="none" opacity="1" stroke="#1F78B4" stroke-width="1" points="812,270 832,270 "/>
 99 | </svg>
100 | 
```

--------------------------------------------------------------------------------
/benchmarks/solmate-safe-transfer-lib/report/change/t-test.svg:
--------------------------------------------------------------------------------

```
  1 | <svg width="960" height="540" viewBox="0 0 960 540" xmlns="http://www.w3.org/2000/svg">
  2 | <text x="480" y="32" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="16.129032258064516" opacity="1" fill="#000000">
  3 | solmate-safe-transfer-lib: Welch t test
  4 | </text>
  5 | <text x="27" y="263" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000" transform="rotate(270, 27, 263)">
  6 | Density
  7 | </text>
  8 | <text x="510" y="513" dy="-0.5ex" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
  9 | t score
 10 | </text>
 11 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="86,53 86,472 "/>
 12 | <text x="77" y="472" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 13 | 0.0
 14 | </text>
 15 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,472 86,472 "/>
 16 | <text x="77" y="424" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 17 | 0.05
 18 | </text>
 19 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,424 86,424 "/>
 20 | <text x="77" y="375" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 21 | 0.1
 22 | </text>
 23 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,375 86,375 "/>
 24 | <text x="77" y="326" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 25 | 0.15
 26 | </text>
 27 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,326 86,326 "/>
 28 | <text x="77" y="277" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 29 | 0.2
 30 | </text>
 31 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,277 86,277 "/>
 32 | <text x="77" y="228" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 33 | 0.25
 34 | </text>
 35 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,228 86,228 "/>
 36 | <text x="77" y="179" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 37 | 0.3
 38 | </text>
 39 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,179 86,179 "/>
 40 | <text x="77" y="130" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 41 | 0.35
 42 | </text>
 43 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,130 86,130 "/>
 44 | <text x="77" y="81" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 45 | 0.4
 46 | </text>
 47 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,81 86,81 "/>
 48 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="87,473 932,473 "/>
 49 | <text x="99" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 50 | -5.0
 51 | </text>
 52 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="99,473 99,478 "/>
 53 | <text x="189" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 54 | -4.0
 55 | </text>
 56 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="189,473 189,478 "/>
 57 | <text x="278" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 58 | -3.0
 59 | </text>
 60 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="278,473 278,478 "/>
 61 | <text x="368" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 62 | -2.0
 63 | </text>
 64 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="368,473 368,478 "/>
 65 | <text x="458" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 66 | -1.0
 67 | </text>
 68 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="458,473 458,478 "/>
 69 | <text x="547" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 70 | 0.0
 71 | </text>
 72 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="547,473 547,478 "/>
 73 | <text x="637" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 74 | 1.0
 75 | </text>
 76 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="637,473 637,478 "/>
 77 | <text x="727" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 78 | 2.0
 79 | </text>
 80 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="727,473 727,478 "/>
 81 | <text x="816" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 82 | 3.0
 83 | </text>
 84 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="816,473 816,478 "/>
 85 | <text x="906" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 86 | 4.0
 87 | </text>
 88 | <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="906,473 906,478 "/>
 89 | <polygon opacity="0.25" fill="#1F78B4" points="87,472 88,472 90,472 92,472 93,472 95,472 97,472 98,472 100,472 102,472 103,472 105,472 107,472 109,472 110,472 112,472 114,472 115,472 117,472 119,472 120,472 122,472 124,472 125,472 127,472 129,472 131,472 132,472 134,472 136,472 137,472 139,472 141,472 142,472 144,472 146,472 147,472 149,472 151,472 153,472 154,472 156,472 158,472 159,472 161,472 163,472 164,472 166,472 168,472 169,472 171,472 173,472 175,472 176,472 178,472 180,472 181,472 183,472 185,472 186,472 188,472 190,472 191,472 193,472 195,472 197,472 198,472 200,472 202,472 203,472 205,472 207,472 208,472 210,472 212,472 214,472 215,472 217,472 219,472 220,472 222,472 224,472 225,472 227,472 229,472 230,472 232,472 234,472 236,472 237,472 239,472 241,471 242,471 244,471 246,471 247,471 249,471 251,471 252,471 254,470 256,470 258,470 259,470 261,470 263,470 264,470 266,470 268,469 269,469 271,469 273,469 274,469 276,468 278,468 280,468 281,467 283,467 285,467 286,467 288,466 290,466 291,466 293,465 295,465 296,465 298,464 300,464 302,463 303,463 305,462 307,462 308,461 310,461 312,460 313,459 315,459 317,458 318,457 320,457 322,456 324,455 325,454 327,453 329,453 330,451 332,450 334,449 335,448 337,447 339,446 341,444 342,443 344,442 346,440 347,439 349,437 351,436 352,434 354,433 356,431 357,430 359,428 361,426 363,424 364,422 366,420 368,418 369,416 371,414 373,412 374,410 376,407 378,405 379,403 381,401 383,398 385,396 386,394 388,391 390,388 391,386 393,383 395,380 396,377 398,374 400,371 401,367 403,364 405,361 407,357 408,354 410,350 412,346 413,343 415,339 417,335 418,331 420,327 422,323 423,319 425,315 427,311 429,307 430,303 432,298 434,294 435,290 437,286 439,281 440,277 442,273 444,269 445,265 447,261 449,257 451,252 452,248 454,244 456,240 457,236 459,231 461,227 462,222 464,218 466,214 468,209 469,205 471,200 473,196 474,192 476,188 478,184 479,180 481,176 483,172 484,169 486,166 488,162 490,159 491,156 493,153 495,150 496,147 498,143 500,140 501,137 503,133 505,129 506,126 508,122 510,119 512,115 513,112 515,109 517,106 518,103 520,101 522,99 523,97 525,95 527,94 528,93 530,92 532,92 534,92 535,92 537,92 539,92 540,92 542,92 544,93 545,93 547,93 549,93 550,93 552,93 554,93 556,93 557,93 559,94 561,94 562,95 564,96 566,97 567,98 569,99 571,100 573,101 574,102 576,104 578,106 579,108 581,110 583,112 584,115 586,118 588,121 589,125 591,128 593,132 595,135 596,139 598,143 600,146 601,150 603,154 605,157 606,161 608,165 610,169 611,173 613,177 615,181 617,185 618,189 620,193 622,197 623,201 625,206 627,210 628,214 630,218 632,222 633,226 635,230 637,235 639,239 640,243 642,247 644,251 645,256 647,260 649,264 650,269 652,273 654,277 655,282 657,286 659,290 661,294 662,298 664,302 666,306 667,310 669,313 671,317 672,321 674,324 676,328 677,332 679,335 681,339 683,342 684,346 686,349 688,353 689,357 691,360 693,364 694,367 696,371 698,374 700,377 701,380 703,383 705,386 706,389 708,392 710,395 711,397 713,400 715,402 716,404 718,407 720,409 722,411 723,413 725,415 727,417 728,419 730,421 732,423 733,424 735,426 737,428 738,430 740,431 742,433 744,435 745,436 747,438 749,439 750,441 752,442 754,443 755,445 757,446 759,447 760,448 762,449 764,450 766,451 767,452 769,453 771,454 772,454 774,455 776,456 777,457 779,457 781,458 782,459 784,460 786,460 788,461 789,462 791,462 793,463 794,464 796,464 798,465 799,465 801,466 803,466 804,466 806,467 808,467 810,467 811,468 813,468 815,468 816,468 818,468 820,468 821,469 823,469 825,469 827,469 828,469 830,470 832,470 833,470 835,470 837,470 838,470 840,470 842,470 843,471 845,471 847,471 849,471 850,471 852,471 854,471 855,471 857,471 859,471 860,472 862,472 864,472 865,472 867,472 869,472 871,472 872,472 874,472 876,472 877,472 879,472 881,472 882,472 884,472 886,472 887,472 889,472 891,472 893,472 894,472 896,472 898,472 899,472 901,472 903,472 904,472 906,472 908,472 909,472 911,472 913,472 915,472 916,472 918,472 920,472 921,472 923,472 925,472 926,472 928,472 930,472 932,472 932,472 87,472 "/>
 90 | <polyline fill="none" opacity="1" stroke="#1F78B4" stroke-width="2" points="933,472 933,53 "/>
 91 | <text x="842" y="250" dy="0.76em" text-anchor="start" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 92 | t distribution
 93 | </text>
 94 | <text x="842" y="265" dy="0.76em" text-anchor="start" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
 95 | t statistic
 96 | </text>
 97 | <rect x="812" y="250" width="20" height="10" opacity="0.25" fill="#1F78B4" stroke="none"/>
 98 | <polyline fill="none" opacity="1" stroke="#1F78B4" stroke-width="1" points="812,270 832,270 "/>
 99 | </svg>
100 | 
```

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

```rust
  1 | use crate::stats::util::CodeIterator;
  2 | 
  3 | #[derive(Debug)]
  4 | pub struct TokenDescriptor {
  5 |     pub token_type: TokenType,
  6 |     pub start_line: usize,
  7 |     pub end_line: usize,
  8 |     pub content: String,
  9 | }
 10 | 
 11 | #[derive(Debug, Clone, PartialEq)]
 12 | pub enum TokenType {
 13 |     CodeSingleQuotes,
 14 |     CodeDoubleQuotes,
 15 |     CodeOutsideQuotes,
 16 |     MultilineComment,
 17 |     SinglelineComment,
 18 | }
 19 | 
 20 | pub fn tokenize(content: &str) -> Vec<TokenDescriptor> {
 21 |     let mut iter: CodeIterator = content.parse().unwrap();
 22 | 
 23 |     let mut multiline_comment_bytes = vec![];
 24 |     let mut singleline_comment_bytes = vec![];
 25 |     let mut code_bytes_inside_single_quotes = vec![];
 26 |     let mut code_bytes_inside_double_quotes = vec![];
 27 |     let mut code_bytes_outside_quotes = vec![];
 28 | 
 29 |     let mut token_descriptors = vec![];
 30 | 
 31 |     #[allow(clippy::while_let_on_iterator)]
 32 |     while let Some(token) = iter.next() {
 33 |         // Track on which line no the token ends.
 34 |         // (Start by assuming it ends on the same line until we finally hit the end)
 35 |         let mut end = token.line_no;
 36 | 
 37 |         if token.curr == '/' && token.next.is_some_and(|c| c == '*') {
 38 |             multiline_comment_bytes.push('/');
 39 |             multiline_comment_bytes.push('*');
 40 |             iter.next();
 41 |             while let Some(next) = iter.next() {
 42 |                 if next.curr == '*' && next.next.is_some_and(|c| c == '/') {
 43 |                     let multiline_end_line = iter.next().unwrap().line_no;
 44 |                     end = std::cmp::max(end, multiline_end_line);
 45 |                     multiline_comment_bytes.push('*');
 46 |                     multiline_comment_bytes.push('/');
 47 |                     break;
 48 |                 }
 49 |                 multiline_comment_bytes.push(next.curr);
 50 |             }
 51 |         } else if token.curr == '"' {
 52 |             code_bytes_inside_double_quotes.push('"');
 53 |             while let Some(next) = iter.next() {
 54 |                 if next.curr == '"' {
 55 |                     code_bytes_inside_double_quotes.push('"');
 56 |                     end = std::cmp::max(end, next.line_no);
 57 |                     break;
 58 |                 }
 59 |                 code_bytes_inside_double_quotes.push(next.curr);
 60 |                 if next.curr == '\\' && next.next.is_some() {
 61 |                     // escape whatever comes next
 62 |                     iter.next();
 63 |                     code_bytes_inside_double_quotes.push(next.next.unwrap());
 64 |                 }
 65 |             }
 66 |         } else if token.curr == '\'' {
 67 |             code_bytes_inside_single_quotes.push('\'');
 68 |             while let Some(next) = iter.next() {
 69 |                 if next.curr == '\'' {
 70 |                     code_bytes_inside_single_quotes.push('\'');
 71 |                     end = std::cmp::max(end, next.line_no);
 72 |                     break;
 73 |                 }
 74 |                 code_bytes_inside_single_quotes.push(next.curr);
 75 |                 if next.curr == '\\' && next.next.is_some() {
 76 |                     // escape whatever comes next
 77 |                     iter.next();
 78 |                     code_bytes_inside_single_quotes.push(next.next.unwrap());
 79 |                 }
 80 |             }
 81 |         } else if token.curr == '/' && token.next.is_some_and(|c| c == '/') {
 82 |             singleline_comment_bytes.push('/');
 83 |             singleline_comment_bytes.push('/');
 84 |             iter.next();
 85 |             while let Some(next) = iter.next() {
 86 |                 singleline_comment_bytes.push(next.curr);
 87 |                 if next.curr == '\n' {
 88 |                     break;
 89 |                 }
 90 |             }
 91 |         } else {
 92 |             // keep going until the next char is one of the above tokens
 93 |             code_bytes_outside_quotes.push(token.curr);
 94 |             // let staw_away = ['\'', '"', '/'];
 95 | 
 96 |             let staw_away = ['\'', '"', '/'];
 97 | 
 98 |             let mut curr = token.next;
 99 | 
100 |             while let Some(next) = curr {
101 |                 if staw_away.iter().any(|x| x == &next) {
102 |                     break;
103 |                 }
104 |                 let next_token = iter.next().unwrap();
105 |                 end = std::cmp::max(end, next_token.line_no);
106 |                 code_bytes_outside_quotes.push(next_token.curr);
107 |                 curr = next_token.next;
108 |             }
109 |         }
110 | 
111 |         if !multiline_comment_bytes.is_empty() {
112 |             token_descriptors.push(TokenDescriptor {
113 |                 token_type: TokenType::MultilineComment,
114 |                 start_line: token.line_no,
115 |                 end_line: end,
116 |                 content: multiline_comment_bytes.iter().collect(),
117 |             });
118 |         }
119 | 
120 |         if !singleline_comment_bytes.is_empty() {
121 |             token_descriptors.push(TokenDescriptor {
122 |                 token_type: TokenType::SinglelineComment,
123 |                 start_line: token.line_no,
124 |                 end_line: end,
125 |                 content: singleline_comment_bytes.iter().collect(),
126 |             });
127 |         }
128 | 
129 |         if !code_bytes_inside_double_quotes.is_empty() {
130 |             token_descriptors.push(TokenDescriptor {
131 |                 token_type: TokenType::CodeDoubleQuotes,
132 |                 start_line: token.line_no,
133 |                 end_line: end,
134 |                 content: code_bytes_inside_double_quotes.iter().collect(),
135 |             });
136 |         }
137 | 
138 |         if !code_bytes_inside_single_quotes.is_empty() {
139 |             token_descriptors.push(TokenDescriptor {
140 |                 token_type: TokenType::CodeSingleQuotes,
141 |                 start_line: token.line_no,
142 |                 end_line: end,
143 |                 content: code_bytes_inside_single_quotes.iter().collect(),
144 |             });
145 |         }
146 | 
147 |         if !code_bytes_outside_quotes.is_empty() {
148 |             token_descriptors.push(TokenDescriptor {
149 |                 token_type: TokenType::CodeOutsideQuotes,
150 |                 start_line: token.line_no,
151 |                 end_line: end,
152 |                 content: code_bytes_outside_quotes.iter().collect(),
153 |             });
154 |         }
155 | 
156 |         multiline_comment_bytes.clear();
157 |         singleline_comment_bytes.clear();
158 |         code_bytes_inside_single_quotes.clear();
159 |         code_bytes_inside_double_quotes.clear();
160 |         code_bytes_outside_quotes.clear();
161 |     }
162 |     token_descriptors
163 | }
164 | 
165 | #[derive(Debug, Clone)]
166 | pub struct CodeLines {
167 |     pub info_lines: usize,
168 |     pub actual_first_line: isize,
169 |     pub last_line_has_code: bool,
170 | }
171 | 
172 | #[derive(Clone, Debug)]
173 | pub struct TokenInsight {
174 |     pub token_type: TokenType,
175 |     pub start_line: usize,
176 |     pub end_line: usize,
177 |     pub code_lines: CodeLines,
178 |     pub starts_with_newline: bool,
179 |     pub ends_with_newline: bool,
180 | }
181 | 
182 | impl From<&TokenDescriptor> for TokenInsight {
183 |     #[allow(clippy::let_and_return)]
184 |     fn from(value: &TokenDescriptor) -> Self {
185 |         let insight = TokenInsight {
186 |             code_lines: match value.token_type.clone() {
187 |                 TokenType::CodeDoubleQuotes | TokenType::CodeSingleQuotes => CodeLines {
188 |                     info_lines: value.end_line - value.start_line + 1,
189 |                     actual_first_line: 0,
190 |                     last_line_has_code: true,
191 |                 },
192 |                 _ => value.token_type.number_of_lines(&value.content),
193 |             },
194 |             start_line: value.start_line,
195 |             end_line: value.end_line,
196 |             token_type: value.token_type.clone(),
197 |             starts_with_newline: value.content.starts_with('\n'),
198 |             ends_with_newline: value.content.ends_with('\n'),
199 |         };
200 | 
201 |         insight
202 |     }
203 | }
204 | 
205 | impl TokenType {
206 |     pub fn number_of_lines(&self, content: &str) -> CodeLines {
207 |         match self {
208 |             TokenType::CodeOutsideQuotes => {
209 |                 let mut non_blank_lines = 0;
210 |                 let mut actual_first_line = -1;
211 |                 let mut count = 0;
212 |                 let mut last_line_has_code = false;
213 |                 #[allow(clippy::explicit_counter_loop)]
214 |                 for curr in content.split('\n') {
215 |                     if curr.trim() != "" {
216 |                         non_blank_lines += 1;
217 |                         if actual_first_line == -1 {
218 |                             actual_first_line = count;
219 |                         }
220 |                         last_line_has_code = true;
221 |                     } else {
222 |                         last_line_has_code = false;
223 |                     }
224 |                     count += 1;
225 |                 }
226 | 
227 |                 CodeLines { info_lines: non_blank_lines, actual_first_line, last_line_has_code }
228 |             }
229 |             _ => CodeLines {
230 |                 info_lines: 0, // we don't care about these values
231 |                 actual_first_line: -1,
232 |                 last_line_has_code: true,
233 |             },
234 |         }
235 |     }
236 | }
237 | 
238 | impl TokenInsightGroup {
239 |     pub fn total_contribution(&self) -> usize {
240 |         let len = self.token_insights.len();
241 |         let mut total = 0;
242 | 
243 |         for i in 0..len {
244 |             let curr = &self.token_insights[i];
245 |             if curr.code_lines.actual_first_line == -1 {
246 |                 continue;
247 |             }
248 |             total += curr.code_lines.info_lines;
249 |             //todo! do not over count
250 |             if i > 0 {
251 |                 let prev = &self.token_insights[i - 1];
252 |                 if curr.code_lines.actual_first_line == 0
253 |                     && curr.start_line == prev.end_line
254 |                     && prev.code_lines.actual_first_line != -1
255 |                 {
256 |                     total -= 1;
257 |                 }
258 |             }
259 |         }
260 | 
261 |         total
262 |     }
263 | }
264 | 
265 | #[derive(Debug, PartialEq)]
266 | pub enum HighLevelType {
267 |     Code,
268 |     NotCode,
269 | }
270 | 
271 | impl From<TokenType> for HighLevelType {
272 |     fn from(value: TokenType) -> Self {
273 |         match value {
274 |             TokenType::CodeDoubleQuotes
275 |             | TokenType::CodeOutsideQuotes
276 |             | TokenType::CodeSingleQuotes => Self::Code,
277 |             TokenType::MultilineComment | TokenType::SinglelineComment => Self::NotCode,
278 |         }
279 |     }
280 | }
281 | 
282 | #[derive(Debug)]
283 | pub struct TokenInsightGroup {
284 |     pub token_insights: Vec<TokenInsight>,
285 |     pub start_line: usize,
286 |     pub end_line: usize,
287 |     pub token_type: HighLevelType,
288 | }
289 | 
290 | impl TokenInsightGroup {
291 |     pub fn last_token_insight_has_code_in_its_last_line(&self) -> bool {
292 |         self.token_insights.last().is_some_and(|insight| insight.code_lines.last_line_has_code)
293 |     }
294 | }
295 | 
```

--------------------------------------------------------------------------------
/benchmarks/aderyn/report/index.html:
--------------------------------------------------------------------------------

```html
  1 | <!DOCTYPE html>
  2 | <html>
  3 | 
  4 | <head>
  5 |     <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  6 |     <title>aderyn - Criterion.rs</title>
  7 |     <style type="text/css">
  8 |         body {
  9 |             font: 14px Helvetica Neue;
 10 |             text-rendering: optimizelegibility;
 11 |         }
 12 | 
 13 |         .body {
 14 |             width: 960px;
 15 |             margin: auto;
 16 |         }
 17 | 
 18 |         th {
 19 |             font-weight: 200
 20 |         }
 21 | 
 22 |         th,
 23 |         td {
 24 |             padding-right: 3px;
 25 |             padding-bottom: 3px;
 26 |         }
 27 | 
 28 |         a:link {
 29 |             color: #1F78B4;
 30 |             text-decoration: none;
 31 |         }
 32 | 
 33 |         th.ci-bound {
 34 |             opacity: 0.6
 35 |         }
 36 | 
 37 |         td.ci-bound {
 38 |             opacity: 0.5
 39 |         }
 40 | 
 41 |         .stats {
 42 |             width: 80%;
 43 |             margin: auto;
 44 |             display: flex;
 45 |         }
 46 | 
 47 |         .additional_stats {
 48 |             flex: 0 0 60%
 49 |         }
 50 | 
 51 |         .additional_plots {
 52 |             flex: 1
 53 |         }
 54 | 
 55 |         h2 {
 56 |             font-size: 36px;
 57 |             font-weight: 300;
 58 |         }
 59 | 
 60 |         h3 {
 61 |             font-size: 24px;
 62 |             font-weight: 300;
 63 |         }
 64 | 
 65 |         #footer {
 66 |             height: 40px;
 67 |             background: #888;
 68 |             color: white;
 69 |             font-size: larger;
 70 |             font-weight: 300;
 71 |         }
 72 | 
 73 |         #footer a {
 74 |             color: white;
 75 |             text-decoration: underline;
 76 |         }
 77 | 
 78 |         #footer p {
 79 |             text-align: center
 80 |         }
 81 |     </style>
 82 | </head>
 83 | 
 84 | <body>
 85 |     <div class="body">
 86 |         <h2>aderyn</h2>
 87 |         <div class="absolute">
 88 |             <section class="plots">
 89 |                 <table width="100%">
 90 |                     <tbody>
 91 |                         <tr>
 92 |                             <td>
 93 |                                 <a href="pdf.svg">
 94 |                                     <img src="pdf_small.svg" alt="PDF of Slope" width="450" height="300" />
 95 |                                 </a>
 96 |                             </td>
 97 |                             <td>
 98 |                                 <a href="iteration_times.svg">
 99 |                                     <img src="iteration_times_small.svg" alt="Iteration Times" width="450" height="300" />
100 |                                 </a>
101 |                             </td>
102 |                         </tr>
103 |                     </tbody>
104 |                 </table>
105 |             </section>
106 |             <section class="stats">
107 |                 <div class="additional_stats">
108 |                     <h4>Additional Statistics:</h4>
109 |                     <table>
110 |                         <thead>
111 |                             <tr>
112 |                                 <th></th>
113 |                                 <th title="0.95 confidence level" class="ci-bound">Lower bound</th>
114 |                                 <th>Estimate</th>
115 |                                 <th title="0.95 confidence level" class="ci-bound">Upper bound</th>
116 |                             </tr>
117 |                         </thead>
118 |                         <tbody>
119 |                             <tr>
120 |                                 <td>R&#xb2;</td>
121 |                                 <td class="ci-bound">0.0006964</td>
122 |                                 <td>0.0007201</td>
123 |                                 <td class="ci-bound">0.0006908</td>
124 |                             </tr>
125 |                             <tr>
126 |                                 <td>Mean</td>
127 |                                 <td class="ci-bound">110.01 ms</td>
128 |                                 <td>114.67 ms</td>
129 |                                 <td class="ci-bound">119.88 ms</td>
130 |                             </tr>
131 |                             <tr>
132 |                                 <td title="Standard Deviation">Std. Dev.</td>
133 |                                 <td class="ci-bound">18.201 ms</td>
134 |                                 <td>25.380 ms</td>
135 |                                 <td class="ci-bound">32.321 ms</td>
136 |                             </tr>
137 |                             <tr>
138 |                                 <td>Median</td>
139 |                                 <td class="ci-bound">103.04 ms</td>
140 |                                 <td>107.56 ms</td>
141 |                                 <td class="ci-bound">114.96 ms</td>
142 |                             </tr>
143 |                             <tr>
144 |                                 <td title="Median Absolute Deviation">MAD</td>
145 |                                 <td class="ci-bound">14.319 ms</td>
146 |                                 <td>17.426 ms</td>
147 |                                 <td class="ci-bound">23.442 ms</td>
148 |                             </tr>
149 |                         </tbody>
150 |                     </table>
151 |                 </div>
152 |                 <div class="additional_plots">
153 |                     <h4>Additional Plots:</h4>
154 |                     <ul>
155 |                         
156 |                         <li>
157 |                             <a href="typical.svg">Typical</a>
158 |                         </li>
159 |                         <li>
160 |                             <a href="mean.svg">Mean</a>
161 |                         </li>
162 |                         <li>
163 |                             <a href="SD.svg">Std. Dev.</a>
164 |                         </li>
165 |                         <li>
166 |                             <a href="median.svg">Median</a>
167 |                         </li>
168 |                         <li>
169 |                             <a href="MAD.svg">MAD</a>
170 |                         </li>
171 |                     </ul>
172 |                 </div>
173 |             </section>
174 |             <section class="explanation">
175 |                 <h4>Understanding this report:</h4>
176 |                 <p>The plot on the left displays the average time per iteration for this benchmark. The shaded region
177 |                     shows the estimated probability of an iteration taking a certain amount of time, while the line
178 |                     shows the mean. Click on the plot for a larger view showing the outliers.</p>
179 |                 <p>The plot on the right shows the average time per iteration for the samples. Each point 
180 |                     represents one sample.</p>
181 |                 <p>See <a href="https://bheisler.github.io/criterion.rs/book/user_guide/command_line_output.html#additional-statistics">the
182 |                         documentation</a> for more details on the additional statistics.</p>
183 |             </section>
184 |         </div>
185 |         <section class="plots">
186 |             <h3>Change Since Previous Benchmark</h3>
187 |             <div class="relative">
188 |                 <table width="100%">
189 |                     <tbody>
190 |                         <tr>
191 |                             <td>
192 |                                 <a href="both/pdf.svg">
193 |                                     <img src="relative_pdf_small.svg" alt="PDF Comparison" width="450"
194 |                                         height="300" />
195 |                                 </a>
196 |                             </td>
197 |                             <td>
198 |                                 <a href="both/iteration_times.svg">
199 |                                     <img src="relative_iteration_times_small.svg" alt="Iteration Time Comparison" width="450"
200 |                                         height="300" />
201 |                                 </a>
202 |                             </td>
203 |                         </tr>
204 |                     </tbody>
205 |                 </table>
206 |             </div>
207 |         </section>
208 |         <section class="stats">
209 |             <div class="additional_stats">
210 |                 <h4>Additional Statistics:</h4>
211 |                 <table>
212 |                     <thead>
213 |                         <tr>
214 |                             <th></th>
215 |                             <th title="0.95 confidence level" class="ci-bound">Lower bound</th>
216 |                             <th>Estimate</th>
217 |                             <th title="0.95 confidence level" class="ci-bound">Upper bound</th>
218 |                             <th></th>
219 |                         </tr>
220 |                     </thead>
221 |                     <tbody>
222 |                         <tr>
223 |                             <td>Change in time</td>
224 |                             <td class="ci-bound">+18.460%</td>
225 |                             <td>+23.709%</td>
226 |                             <td class="ci-bound">+29.085%</td>
227 |                             <td>(p = 0.00 &lt;
228 |                                 0.05)</td>
229 |                         </tr>
230 |                     </tbody>
231 |                 </table>
232 |                 Performance has regressed.
233 |             </div>
234 |             <div class="additional_plots">
235 |                 <h4>Additional Plots:</h4>
236 |                 <ul>
237 |                     
238 |                     <li>
239 |                         <a href="change/mean.svg">Change in mean</a>
240 |                     </li>
241 |                     <li>
242 |                         <a href="change/median.svg">Change in median</a>
243 |                     </li>
244 |                     <li>
245 |                         <a href="change/t-test.svg">T-Test</a>
246 |                     </li>
247 |                 </ul>
248 |             </div>
249 |         </section>
250 |         <section class="explanation">
251 |             <h4>Understanding this report:</h4>
252 |             <p>The plot on the left shows the probability of the function taking a certain amount of time. The red
253 |                 curve represents the saved measurements from the last time this benchmark was run, while the blue curve
254 |                 shows the measurements from this run. The lines represent the mean time per iteration. Click on the
255 |                 plot for a larger view.</p>
256 |             <p>The plot on the right shows the iteration times for the two measurements. Again, the red dots represent
257 |                 the previous measurement while the blue dots show the current measurement.</p>
258 |             <p>See <a href="https://bheisler.github.io/criterion.rs/book/user_guide/command_line_output.html#change">the
259 |                     documentation</a> for more details on the additional statistics.</p>
260 |         </section>
261 |     </div>
262 |     <div id="footer">
263 |         <p>This report was generated by
264 |             <a href="https://github.com/bheisler/criterion.rs">Criterion.rs</a>, a statistics-driven benchmarking
265 |             library in Rust.</p>
266 |     </div>
267 | </body>
268 | 
269 | </html>
```

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

```rust
  1 | use std::{collections::BTreeMap, error::Error};
  2 | 
  3 | use crate::ast::{ASTNode, NodeID, Visibility};
  4 | 
  5 | use crate::{
  6 |     capture,
  7 |     context::{browser::ExtractFunctionDefinitions, workspace::WorkspaceContext},
  8 |     detect::detector::{IssueDetector, IssueDetectorNamePool, IssueSeverity},
  9 | };
 10 | use eyre::Result;
 11 | 
 12 | #[derive(Default)]
 13 | pub struct IncorrectERC721InterfaceDetector {
 14 |     // Keys are: [0] source file name, [1] line number, [2] character location of node.
 15 |     // Do not add items manually, use `capture!` to add nodes to this BTreeMap.
 16 |     found_instances: BTreeMap<(String, usize, String), NodeID>,
 17 | }
 18 | 
 19 | impl IssueDetector for IncorrectERC721InterfaceDetector {
 20 |     fn detect(&mut self, context: &WorkspaceContext) -> Result<bool, Box<dyn Error>> {
 21 |         // Analyze each contract in context
 22 |         for current_contract in context.contract_definitions() {
 23 |             // Look through it's inheritance hierarchy to determine if it's an ERC721
 24 |             let contract_ids = &current_contract.linearized_base_contracts;
 25 |             let current_contract_is_erc721 = contract_ids.iter().any(|i| {
 26 |                 context.nodes.get(i).is_some_and(|c| {
 27 |                     if let ASTNode::ContractDefinition(contract) = c
 28 |                         && contract.name.contains("ERC721")
 29 |                     {
 30 |                         return true;
 31 |                     }
 32 |                     false
 33 |                 })
 34 |             });
 35 | 
 36 |             if !current_contract_is_erc721 {
 37 |                 continue;
 38 |             }
 39 | 
 40 |             // Now we know that current contract is an ERC721
 41 | 
 42 |             for contract_id in contract_ids {
 43 |                 if let Some(ASTNode::ContractDefinition(contract)) = context.nodes.get(contract_id)
 44 |                 {
 45 |                     let functions = ExtractFunctionDefinitions::from(contract).extracted;
 46 | 
 47 |                     for func in functions {
 48 |                         if (func.visibility != Visibility::Public
 49 |                             && func.visibility != Visibility::External)
 50 |                             || !func.implemented
 51 |                         {
 52 |                             continue;
 53 |                         }
 54 | 
 55 |                         if func.represents_erc721_balance_of() && !func.returns_uint256() {
 56 |                             capture!(self, context, func);
 57 |                         }
 58 | 
 59 |                         if (func.represents_erc721_get_approved()
 60 |                             || func.represents_erc721_owner_of())
 61 |                             && !func.returns_address()
 62 |                         {
 63 |                             capture!(self, context, func);
 64 |                         }
 65 | 
 66 |                         if (func.represents_erc721_safe_transfer_from()
 67 |                             || func.represents_erc721_transfer_from())
 68 |                             && !func.returns_nothing()
 69 |                         {
 70 |                             capture!(self, context, func);
 71 |                         }
 72 | 
 73 |                         if (func.represents_erc721_approve()
 74 |                             || func.represents_erc721_set_approval_for_all())
 75 |                             && !func.returns_nothing()
 76 |                         {
 77 |                             capture!(self, context, func);
 78 |                         }
 79 | 
 80 |                         if func.represents_erc721_is_approved_for_all() && !func.returns_bool() {
 81 |                             capture!(self, context, func);
 82 |                         }
 83 |                     }
 84 |                 }
 85 |             }
 86 |         }
 87 | 
 88 |         Ok(!self.found_instances.is_empty())
 89 |     }
 90 | 
 91 |     fn severity(&self) -> IssueSeverity {
 92 |         IssueSeverity::High
 93 |     }
 94 | 
 95 |     fn title(&self) -> String {
 96 |         String::from("Incorrect ERC721 interface")
 97 |     }
 98 | 
 99 |     fn description(&self) -> String {
100 |         String::from(
101 |             "Incorrect return values for ERC721 functions. A contract compiled with Solidity > 0.4.22 \
102 |             interacting with these functions will fail to execute them, as the return value is missing. Set the \
103 |             appropriate return values and types for the defined ERC721 functions.",
104 |         )
105 |     }
106 | 
107 |     fn instances(&self) -> BTreeMap<(String, usize, String), NodeID> {
108 |         self.found_instances.clone()
109 |     }
110 | 
111 |     fn name(&self) -> String {
112 |         format!("{}", IssueDetectorNamePool::IncorrectERC721Interface)
113 |     }
114 | }
115 | 
116 | mod erc721_matching_function_signature_helper {
117 |     //! This module matches function signature only (name + parameters)
118 |     //! This means, that the return value could be different.
119 | 
120 |     use crate::ast::FunctionDefinition;
121 | 
122 |     struct SignatureMatcher<'a> {
123 |         name: &'a str,
124 |         parameter_types: Vec<&'a str>,
125 |     }
126 | 
127 |     // Helps with checking if a function definition satisfied a signature matcher
128 |     impl SignatureMatcher<'_> {
129 |         fn satisfies(&self, func: &FunctionDefinition) -> bool {
130 |             if func.name != self.name {
131 |                 return false;
132 |             }
133 |             let params = &func.parameters.parameters;
134 |             if params.len() != self.parameter_types.len() {
135 |                 return false;
136 |             }
137 |             #[allow(clippy::needless_range_loop)]
138 |             for idx in 0..params.len() {
139 |                 if let Some(func_param_type) = params[idx].type_descriptions.type_string.as_ref() {
140 |                     let target = &self.parameter_types[idx];
141 |                     if *target == "address" {
142 |                         if func_param_type == "address" || func_param_type == "address payable" {
143 |                             continue;
144 |                         } else {
145 |                             return false;
146 |                         }
147 |                     } else if func_param_type != target {
148 |                         return false;
149 |                     }
150 |                 } else {
151 |                     return false;
152 |                 }
153 |             }
154 |             true
155 |         }
156 |     }
157 | 
158 |     // ERC721 function signature matching
159 |     impl FunctionDefinition {
160 |         pub fn represents_erc721_get_approved(&self) -> bool {
161 |             let satisifer =
162 |                 SignatureMatcher { name: "getApproved", parameter_types: vec!["uint256"] };
163 |             satisifer.satisfies(self)
164 |         }
165 | 
166 |         pub fn represents_erc721_transfer_from(&self) -> bool {
167 |             let satisifer = SignatureMatcher {
168 |                 name: "transferFrom",
169 |                 parameter_types: vec!["address", "address", "uint256"],
170 |             };
171 |             satisifer.satisfies(self)
172 |         }
173 | 
174 |         pub fn represents_erc721_approve(&self) -> bool {
175 |             let satisifer =
176 |                 SignatureMatcher { name: "approve", parameter_types: vec!["address", "uint256"] };
177 |             satisifer.satisfies(self)
178 |         }
179 | 
180 |         pub fn represents_erc721_is_approved_for_all(&self) -> bool {
181 |             let satisifer = SignatureMatcher {
182 |                 name: "isApprovedForAll",
183 |                 parameter_types: vec!["address", "address"],
184 |             };
185 |             satisifer.satisfies(self)
186 |         }
187 | 
188 |         pub fn represents_erc721_balance_of(&self) -> bool {
189 |             let satisifer =
190 |                 SignatureMatcher { name: "balanceOf", parameter_types: vec!["address"] };
191 |             satisifer.satisfies(self)
192 |         }
193 | 
194 |         pub fn represents_erc721_owner_of(&self) -> bool {
195 |             let satisifer = SignatureMatcher { name: "ownerOf", parameter_types: vec!["uint256"] };
196 |             satisifer.satisfies(self)
197 |         }
198 | 
199 |         pub fn represents_erc721_safe_transfer_from(&self) -> bool {
200 |             let type_1_staisfier = SignatureMatcher {
201 |                 name: "safeTransferFrom",
202 |                 parameter_types: vec!["address", "address", "uint256", "bytes"],
203 |             };
204 | 
205 |             let type_2_satisifer = SignatureMatcher {
206 |                 name: "safeTransferFrom",
207 |                 parameter_types: vec!["address", "address", "uint256"],
208 |             };
209 | 
210 |             type_1_staisfier.satisfies(self) || type_2_satisifer.satisfies(self)
211 |         }
212 | 
213 |         pub fn represents_erc721_set_approval_for_all(&self) -> bool {
214 |             let satisfier = SignatureMatcher {
215 |                 name: "setApprovalForAll",
216 |                 parameter_types: vec!["address", "bool"],
217 |             };
218 |             satisfier.satisfies(self)
219 |         }
220 |     }
221 | 
222 |     // Helpers to match return types (bool & uint256)
223 |     impl FunctionDefinition {
224 |         pub fn returns_nothing(&self) -> bool {
225 |             self.return_parameters.parameters.is_empty()
226 |         }
227 | 
228 |         pub fn returns_bool(&self) -> bool {
229 |             let params = &self.return_parameters.parameters;
230 |             params.len() == 1
231 |                 && params[0]
232 |                     .type_descriptions
233 |                     .type_string
234 |                     .as_ref()
235 |                     .is_some_and(|type_string| type_string == "bool")
236 |         }
237 | 
238 |         pub fn returns_uint256(&self) -> bool {
239 |             let params = &self.return_parameters.parameters;
240 |             params.len() == 1
241 |                 && params[0]
242 |                     .type_descriptions
243 |                     .type_string
244 |                     .as_ref()
245 |                     .is_some_and(|type_string| type_string == "uint256")
246 |         }
247 | 
248 |         pub fn returns_address(&self) -> bool {
249 |             let params = &self.return_parameters.parameters;
250 |             params.len() == 1
251 |                 && params[0].type_descriptions.type_string.as_ref().is_some_and(|type_string| {
252 |                     type_string == "address" || type_string == "address payable"
253 |                 })
254 |         }
255 |     }
256 | }
257 | 
258 | #[cfg(test)]
259 | mod incorrect_erc721_tests {
260 | 
261 |     use crate::detect::{
262 |         detector::IssueDetector, high::incorrect_erc721_interface::IncorrectERC721InterfaceDetector,
263 |     };
264 | 
265 |     #[test]
266 | 
267 |     fn test_incorrect_erc721_functions() {
268 |         let context = crate::detect::test_utils::load_solidity_source_unit(
269 |             "../tests/contract-playground/src/IncorrectERC721.sol",
270 |         );
271 | 
272 |         let mut detector = IncorrectERC721InterfaceDetector::default();
273 |         let found = detector.detect(&context).unwrap();
274 | 
275 |         // We capture every faulty method in the IncorrectERC721 contract that has the wrong return
276 |         // type
277 | 
278 |         assert!(found);
279 | 
280 |         assert_eq!(detector.instances().len(), 8);
281 |     }
282 | }
283 | 
```

--------------------------------------------------------------------------------
/aderyn_driver/src/interface/markdown.rs:
--------------------------------------------------------------------------------

```rust
  1 | use std::{
  2 |     collections::{HashMap, HashSet},
  3 |     io::{Result, Write},
  4 |     path::{Path, PathBuf},
  5 | };
  6 | 
  7 | use aderyn_core::{context::workspace::WorkspaceContext, report::*};
  8 | 
  9 | use crate::process::WorkspaceContextWrapper;
 10 | 
 11 | use super::util::{carve_shortest_path, files_details};
 12 | 
 13 | pub fn print_report(
 14 |     writer: &mut Box<dyn Write>,
 15 |     report: &Report,
 16 |     cx_wrapper: &WorkspaceContextWrapper,
 17 |     output_rel_path: String,
 18 |     no_snippets: bool,
 19 | ) -> Result<()> {
 20 |     let (contexts, root_path) = (&cx_wrapper.contexts, &cx_wrapper.root_path);
 21 | 
 22 |     print_title_and_disclaimer(writer.as_mut())?;
 23 |     print_table_of_contents(writer.as_mut(), report)?;
 24 |     print_contract_summary(writer.as_mut(), report, contexts)?;
 25 | 
 26 |     let (high_issues, low_issues) = report.detailed_issues(contexts);
 27 | 
 28 |     let all_issues = vec![
 29 |         (high_issues.issues, "# High Issues\n", "H"),
 30 |         (low_issues.issues, "# Low Issues\n", "L"),
 31 |     ];
 32 | 
 33 |     let file_contents = contexts
 34 |         .iter()
 35 |         .flat_map(|context| context.source_units())
 36 |         .map(|source_unit| {
 37 |             (
 38 |                 source_unit.absolute_path.as_ref().unwrap().to_owned(),
 39 |                 source_unit.source.as_ref().unwrap(),
 40 |             )
 41 |         })
 42 |         .collect::<HashMap<_, _>>();
 43 | 
 44 |     for (issues, heading, severity) in all_issues {
 45 |         let mut counter = 0;
 46 | 
 47 |         if !issues.is_empty() {
 48 |             writeln!(writer, "{}", heading).unwrap();
 49 |             for issue_body in &issues {
 50 |                 counter += 1;
 51 |                 print_issue(
 52 |                     writer,
 53 |                     PrintIssueParams {
 54 |                         issue_body,
 55 |                         severity,
 56 |                         number: counter,
 57 |                         root_path,
 58 |                         output_rel_path: output_rel_path.clone(),
 59 |                         no_snippets,
 60 |                     },
 61 |                     &file_contents,
 62 |                 )?;
 63 |             }
 64 |         }
 65 |     }
 66 | 
 67 |     Ok(())
 68 | }
 69 | 
 70 | struct PrintIssueParams<'a> {
 71 |     issue_body: &'a IssueBody,
 72 |     severity: &'a str,
 73 |     number: i32,
 74 |     root_path: &'a Path,
 75 |     output_rel_path: String,
 76 |     no_snippets: bool,
 77 | }
 78 | 
 79 | fn print_title_and_disclaimer<W: Write>(mut writer: W) -> Result<()> {
 80 |     writeln!(writer, "# Aderyn Analysis Report\n")?;
 81 |     writeln!(
 82 |         writer,
 83 |         "This report was generated by [Aderyn](https://github.com/Cyfrin/aderyn), a static analysis tool \
 84 |             built by [Cyfrin](https://cyfrin.io), a blockchain security company. This report is not a substitute for manual audit or security review. \
 85 |             It should not be relied upon for any purpose other than to assist in the identification of potential security vulnerabilities."
 86 |     )?;
 87 |     Ok(())
 88 | }
 89 | fn print_contract_summary<W: Write>(
 90 |     mut writer: W,
 91 |     report: &Report,
 92 |     contexts: &[WorkspaceContext],
 93 | ) -> Result<()> {
 94 |     let mut all_files_details = FilesDetails::default();
 95 |     for context in contexts {
 96 |         all_files_details = all_files_details + &files_details(context)
 97 |     }
 98 | 
 99 |     let mut all_files_summary = FilesSummary::default();
100 |     for details in &all_files_details.files_details {
101 |         all_files_summary.total_sloc += details.n_sloc;
102 |         all_files_summary.total_source_units += 1;
103 |     }
104 | 
105 |     writeln!(writer, "# Summary\n")?;
106 | 
107 |     // Files Summary
108 |     {
109 |         writeln!(writer, "## Files Summary\n")?;
110 | 
111 |         // Start the markdown table
112 |         writeln!(writer, "| Key | Value |")?;
113 |         writeln!(writer, "| --- | --- |")?;
114 |         writeln!(writer, "| .sol Files | {} |", all_files_summary.total_source_units)?;
115 |         writeln!(writer, "| Total nSLOC | {} |", all_files_summary.total_sloc)?;
116 | 
117 |         writeln!(writer, "\n")?; // Add an extra newline for spacing
118 |     }
119 | 
120 |     // Files Details
121 |     {
122 |         writeln!(writer, "## Files Details\n")?;
123 | 
124 |         // Start the markdown table with the header
125 |         writeln!(writer, "| Filepath | nSLOC |")?;
126 |         writeln!(writer, "| --- | --- |")?;
127 | 
128 |         let mut files_details = all_files_details;
129 |         files_details.files_details.sort_by(|a, b| a.file_path.cmp(&b.file_path));
130 | 
131 |         files_details.files_details.iter().for_each(|detail| {
132 |             writeln!(writer, "| {} | {} |", detail.file_path, detail.n_sloc).unwrap();
133 |         });
134 | 
135 |         writeln!(writer, "| **Total** | **{}** |", all_files_summary.total_sloc)?;
136 |         writeln!(writer, "\n")?; // Add an extra newline for spacing
137 |     }
138 | 
139 |     // Analysis Summary
140 |     {
141 |         let issue_count = report.issue_count();
142 |         writeln!(writer, "## Issue Summary\n")?;
143 | 
144 |         // Start the markdown table
145 |         writeln!(writer, "| Category | No. of Issues |")?;
146 |         writeln!(writer, "| --- | --- |")?;
147 |         writeln!(writer, "| High | {} |", issue_count.high)?;
148 |         writeln!(writer, "| Low | {} |", issue_count.low)?;
149 |         writeln!(writer, "\n")?; // Add an extra newline for spacing
150 |     }
151 | 
152 |     Ok(())
153 | }
154 | 
155 | fn print_table_of_contents<W: Write>(mut writer: W, report: &Report) -> Result<()> {
156 |     fn print_table_of_content<T>(issues: &[Issue], mut w: T, severity: &str)
157 |     where
158 |         T: Write,
159 |     {
160 |         for (index, issue) in issues.iter().enumerate() {
161 |             let issue_title_slug = issue
162 |                 .title
163 |                 .to_lowercase()
164 |                 .replace(' ', "-")
165 |                 .replace(|c: char| !c.is_ascii_alphanumeric() && c != '-', "");
166 |             writeln!(
167 |                 w,
168 |                 "  - [{}-{}: {}](#{}-{}-{})",
169 |                 severity,
170 |                 index + 1,
171 |                 issue.title,
172 |                 severity.to_ascii_lowercase(),
173 |                 index + 1,
174 |                 issue_title_slug
175 |             )
176 |             .unwrap();
177 |         }
178 |     }
179 | 
180 |     fn display<T: Write>(title: &str, issues: &[Issue], mut writer: T, severity: &str) {
181 |         if !issues.is_empty() {
182 |             writeln!(writer, "{}", title).unwrap();
183 |             print_table_of_content(issues, &mut writer, severity);
184 |         }
185 |     }
186 | 
187 |     writeln!(writer, "# Table of Contents\n")?;
188 |     writeln!(writer, "- [Summary](#summary)")?;
189 |     writeln!(writer, "  - [Files Summary](#files-summary)")?;
190 |     writeln!(writer, "  - [Files Details](#files-details)")?;
191 |     writeln!(writer, "  - [Issue Summary](#issue-summary)")?;
192 | 
193 |     let issues = [
194 |         (&report.highs, "- [High Issues](#high-issues)", "H"),
195 |         (&report.lows, "- [Low Issues](#low-issues)", "L"),
196 |     ];
197 | 
198 |     issues.iter().for_each(|rec| {
199 |         display(rec.1, rec.0, &mut writer, rec.2);
200 |     });
201 | 
202 |     writeln!(writer, "\n")?; // Add an extra newline for spacing
203 |     Ok(())
204 | }
205 | 
206 | fn print_issue(
207 |     writer: &mut Box<dyn Write>,
208 |     params: PrintIssueParams,
209 |     file_data: &HashMap<String, &String>,
210 | ) -> Result<()> {
211 |     let is_file = params.root_path.is_file();
212 | 
213 |     writeln!(
214 |         writer,
215 |         "## {}-{}: {}\n\n{}\n", // <a name> is the anchor for the issue title
216 |         params.severity, params.number, params.issue_body.title, params.issue_body.description
217 |     )?;
218 |     let mut line_nos_printed: HashSet<(String, usize)> = HashSet::new();
219 |     writeln!(
220 |         writer,
221 |         "<details><summary>{} Found Instances</summary>\n\n",
222 |         &params.issue_body.instances.len()
223 |     )?;
224 |     for instance in &params.issue_body.instances {
225 |         // If this line number has already been printed for this issue, skip it
226 |         // This occurs when multiple instances of the same issue are found on the same line.
227 |         // We only want to print the line once in the markdown report.
228 |         // Other formats may want this repetition, but not the markdown report.
229 |         if line_nos_printed.contains(&(instance.contract_path.clone(), instance.line_no)) {
230 |             continue;
231 |         }
232 |         line_nos_printed.insert((instance.contract_path.clone(), instance.line_no));
233 | 
234 |         let path = {
235 |             if is_file {
236 |                 String::from(params.root_path.to_str().unwrap())
237 |             } else {
238 |                 // dbg!(&instance.contract_path.clone());
239 |                 // String::from("/".to_string() + &instance.contract_path.clone())
240 | 
241 |                 String::from(
242 |                     params
243 |                         .root_path
244 |                         .join(instance.contract_path.clone())
245 |                         .as_path()
246 |                         .to_str()
247 |                         .unwrap(),
248 |                 )
249 |             }
250 |         };
251 | 
252 |         if params.no_snippets {
253 |             writeln!(
254 |                 writer,
255 |                 "- Found in {} [Line: {}]({}#L{})",
256 |                 instance.contract_path,
257 |                 instance.line_no,
258 |                 carve_shortest_path(
259 |                     std::fs::canonicalize(PathBuf::from(params.output_rel_path.clone())).unwrap(),
260 |                     std::fs::canonicalize(&path).unwrap()
261 |                 )
262 |                 .to_str()
263 |                 .unwrap(),
264 |                 instance.line_no,
265 |             )?;
266 |             continue;
267 |         }
268 | 
269 |         let line = file_data.get(&instance.contract_path).unwrap();
270 | 
271 |         let line_preview = line.split('\n').skip(instance.line_no - 1).take(1).next().unwrap();
272 | 
273 |         if let Some(hint) = instance.hint.as_ref() {
274 |             writeln!(
275 |                 writer,
276 |                 "- Found in {} [Line: {}]({}#L{})\n\n\t{}\n\t```solidity\n\t{}\n\t```\n",
277 |                 instance.contract_path,
278 |                 instance.line_no,
279 |                 carve_shortest_path(
280 |                     std::fs::canonicalize(PathBuf::from(params.output_rel_path.clone())).unwrap(),
281 |                     std::fs::canonicalize(&path).unwrap()
282 |                 )
283 |                 .to_str()
284 |                 .unwrap(),
285 |                 instance.line_no,
286 |                 hint,
287 |                 line_preview,
288 |             )?;
289 |         } else {
290 |             writeln!(
291 |                 writer,
292 |                 "- Found in {} [Line: {}]({}#L{})\n\n\t```solidity\n\t{}\n\t```\n",
293 |                 instance.contract_path,
294 |                 instance.line_no,
295 |                 carve_shortest_path(
296 |                     std::fs::canonicalize(PathBuf::from(params.output_rel_path.clone())).unwrap(),
297 |                     std::fs::canonicalize(&path).unwrap()
298 |                 )
299 |                 .to_str()
300 |                 .unwrap(),
301 |                 instance.line_no,
302 |                 line_preview,
303 |             )?;
304 |         }
305 |     }
306 |     writeln!(writer, "</details>\n")?;
307 |     line_nos_printed.clear();
308 |     writeln!(writer, "\n")?; // Add an extra newline for spacing
309 |     Ok(())
310 | }
311 | 
```
Page 24/103FirstPrevNextLast