#
tokens: 49597/50000 97/1140 files (page 2/103)
lines: on (toggle) GitHub
raw markdown copy reset
This is page 2 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

--------------------------------------------------------------------------------
/reports/empty_report.md:
--------------------------------------------------------------------------------

```markdown
 1 | # Aderyn Analysis Report
 2 | 
 3 | This report was generated by [Aderyn](https://github.com/Cyfrin/aderyn), a static analysis tool built by [Cyfrin](https://cyfrin.io), a blockchain security company. This report is not a substitute for manual audit or security review. It should not be relied upon for any purpose other than to assist in the identification of potential security vulnerabilities.
 4 | # Table of Contents
 5 | 
 6 | - [Summary](#summary)
 7 |   - [Files Summary](#files-summary)
 8 |   - [Files Details](#files-details)
 9 |   - [Issue Summary](#issue-summary)
10 | 
11 | 
12 | # Summary
13 | 
14 | ## Files Summary
15 | 
16 | | Key | Value |
17 | | --- | --- |
18 | | .sol Files | 1 |
19 | | Total nSLOC | 5 |
20 | 
21 | 
22 | ## Files Details
23 | 
24 | | Filepath | nSLOC |
25 | | --- | --- |
26 | | src/IgnoreEverything.sol | 5 |
27 | | **Total** | **5** |
28 | 
29 | 
30 | ## Issue Summary
31 | 
32 | | Category | No. of Issues |
33 | | --- | --- |
34 | | High | 0 |
35 | | Low | 0 |
36 | 
37 | 
38 | 
```

--------------------------------------------------------------------------------
/reports/nft-report-icm.md:
--------------------------------------------------------------------------------

```markdown
 1 | # Aderyn Analysis Report
 2 | 
 3 | This report was generated by [Aderyn](https://github.com/Cyfrin/aderyn), a static analysis tool built by [Cyfrin](https://cyfrin.io), a blockchain security company. This report is not a substitute for manual audit or security review. It should not be relied upon for any purpose other than to assist in the identification of potential security vulnerabilities.
 4 | # Table of Contents
 5 | 
 6 | - [Summary](#summary)
 7 |   - [Files Summary](#files-summary)
 8 |   - [Files Details](#files-details)
 9 |   - [Issue Summary](#issue-summary)
10 | 
11 | 
12 | # Summary
13 | 
14 | ## Files Summary
15 | 
16 | | Key | Value |
17 | | --- | --- |
18 | | .sol Files | 1 |
19 | | Total nSLOC | 5 |
20 | 
21 | 
22 | ## Files Details
23 | 
24 | | Filepath | nSLOC |
25 | | --- | --- |
26 | | src/inner-core-modules/ICM.sol | 5 |
27 | | **Total** | **5** |
28 | 
29 | 
30 | ## Issue Summary
31 | 
32 | | Category | No. of Issues |
33 | | --- | --- |
34 | | High | 0 |
35 | | Low | 0 |
36 | 
37 | 
38 | 
```

--------------------------------------------------------------------------------
/tests/ast/receive_ether.json:
--------------------------------------------------------------------------------

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

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

```rust
 1 | use aderyn_core::{audit_tools, context::workspace::WorkspaceContext};
 2 | use prettytable::*;
 3 | 
 4 | pub fn print_audit_info_tables(
 5 |     contexts: &[WorkspaceContext],
 6 | ) -> Result<(), Box<dyn std::error::Error>> {
 7 |     let tables = audit_tools::prepare_audit_tables(contexts)?;
 8 |     for (title, (table_titles, table_rows)) in tables {
 9 |         let num_instances = table_rows.len();
10 |         let mut table = Table::new();
11 | 
12 |         println!();
13 |         println!("{}:", title);
14 |         table.set_titles(table_titles);
15 | 
16 |         for instance in table_rows {
17 |             table.add_row(instance);
18 |         }
19 | 
20 |         // Set the format of the table
21 |         table.set_format(*format::consts::FORMAT_NO_LINESEP_WITH_TITLE);
22 |         table.printstd();
23 |         if num_instances > 0 {
24 |             println!("Number of instances: {}", num_instances);
25 |         }
26 |     }
27 |     Ok(())
28 | }
29 | 
```

--------------------------------------------------------------------------------
/tests/ast/fallback.json:
--------------------------------------------------------------------------------

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

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

```rust
 1 | use crate::{ast::*, visitor::ast_visitor::*};
 2 | use eyre::Result;
 3 | 
 4 | impl Node for Documentation {
 5 |     fn accept(&self, visitor: &mut impl ASTConstVisitor) -> Result<()> {
 6 |         match self {
 7 |             Documentation::String(_opt_string) => {
 8 |                 // TODO check if this is okay
 9 |                 Ok(())
10 |             }
11 |             Documentation::Structured(opt_structured_documentation) => {
12 |                 if opt_structured_documentation.is_some() {
13 |                     opt_structured_documentation.as_ref().unwrap().accept(visitor)?;
14 |                 }
15 |                 Ok(())
16 |             }
17 |         }
18 |     }
19 | }
20 | 
21 | impl Node for StructuredDocumentation {
22 |     fn accept(&self, visitor: &mut impl ASTConstVisitor) -> Result<()> {
23 |         visitor.visit_structured_documentation(self)?;
24 |         visitor.end_visit_structured_documentation(self)
25 |     }
26 | }
27 | 
```

--------------------------------------------------------------------------------
/tests/ast/fallback_payable.json:
--------------------------------------------------------------------------------

```json
1 | {"absolutePath":"a","exportedSymbols":{"C":[5]},"id":6,"nodeType":"SourceUnit","nodes":[{"abstract":false,"baseContracts":[],"canonicalName":"C","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":5,"linearizedBaseContracts":[5],"name":"C","nameLocation":"9:1:1","nodeType":"ContractDefinition","nodes":[{"body":{"id":3,"nodeType":"Block","src":"34:2:1","statements":[]},"id":4,"implemented":true,"kind":"fallback","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":1,"nodeType":"ParameterList","parameters":[],"src":"22:2:1"},"returnParameters":{"id":2,"nodeType":"ParameterList","parameters":[],"src":"34:0:1"},"scope":5,"src":"14:22:1","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":6,"src":"0:38:1","usedErrors":[]}],"src":"0:39:1"}
2 | 
```

--------------------------------------------------------------------------------
/tests/ast/constructor.json:
--------------------------------------------------------------------------------

```json
1 | {"absolutePath":"a","exportedSymbols":{"C":[5]},"id":6,"nodeType":"SourceUnit","nodes":[{"abstract":false,"baseContracts":[],"canonicalName":"C","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":5,"linearizedBaseContracts":[5],"name":"C","nameLocation":"9:1:1","nodeType":"ContractDefinition","nodes":[{"body":{"id":3,"nodeType":"Block","src":"28:4:1","statements":[]},"id":4,"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":1,"nodeType":"ParameterList","parameters":[],"src":"25:2:1"},"returnParameters":{"id":2,"nodeType":"ParameterList","parameters":[],"src":"28:0:1"},"scope":5,"src":"14:18:1","stateMutability":"nonpayable","virtual":false,"visibility":"public"}],"scope":6,"src":"0:34:1","usedErrors":[]}],"src":"0:35:1"}
2 | 
```

--------------------------------------------------------------------------------
/tests/ast/abstract_contract.json:
--------------------------------------------------------------------------------

```json
1 | {"absolutePath":"a","exportedSymbols":{"C":[5]},"id":6,"nodeType":"SourceUnit","nodes":[{"abstract":true,"baseContracts":[],"canonicalName":"C","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":5,"linearizedBaseContracts":[5],"name":"C","nameLocation":"18:1:1","nodeType":"ContractDefinition","nodes":[{"body":{"id":3,"nodeType":"Block","src":"37:4:1","statements":[]},"id":4,"implemented":true,"kind":"constructor","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":1,"nodeType":"ParameterList","parameters":[],"src":"34:2:1"},"returnParameters":{"id":2,"nodeType":"ParameterList","parameters":[],"src":"37:0:1"},"scope":5,"src":"23:18:1","stateMutability":"nonpayable","virtual":false,"visibility":"internal"}],"scope":6,"src":"0:43:1","usedErrors":[]}],"src":"0:44:1"}
2 | 
```

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

```rust
 1 | use crate::{ast::*, visitor::ast_visitor::*};
 2 | use eyre::Result;
 3 | 
 4 | impl Node for ImportDirective {
 5 |     fn accept(&self, visitor: &mut impl ASTConstVisitor) -> Result<()> {
 6 |         if visitor.visit_import_directive(self)? {
 7 |             // TODO deviation from solc's structs
 8 |             for symbol_alias in &self.symbol_aliases {
 9 |                 symbol_alias.foreign.accept(visitor)?;
10 |             }
11 |             self.accept_metadata(visitor)?;
12 |         }
13 |         visitor.end_visit_import_directive(self)
14 |     }
15 |     fn accept_metadata(&self, visitor: &mut impl ASTConstVisitor) -> Result<()> {
16 |         let mut symbol_alias_ids = vec![];
17 |         for symbol_alias in &self.symbol_aliases {
18 |             symbol_alias_ids.push(symbol_alias.foreign.id);
19 |         }
20 |         visitor.visit_immediate_children(self.id, symbol_alias_ids)?;
21 |         Ok(())
22 |     }
23 |     macros::accept_id!();
24 | }
25 | 
```

--------------------------------------------------------------------------------
/tests/ast/inheritance_specifier.json:
--------------------------------------------------------------------------------

```json
1 | {"absolutePath":"a","exportedSymbols":{"C1":[1],"C2":[4]},"id":5,"nodeType":"SourceUnit","nodes":[{"abstract":false,"baseContracts":[],"canonicalName":"C1","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":1,"linearizedBaseContracts":[1],"name":"C1","nameLocation":"9:2:1","nodeType":"ContractDefinition","nodes":[],"scope":5,"src":"0:14:1","usedErrors":[]},{"abstract":false,"baseContracts":[{"baseName":{"id":2,"name":"C1","nameLocations":["30:2:1"],"nodeType":"IdentifierPath","referencedDeclaration":1,"src":"30:2:1"},"id":3,"nodeType":"InheritanceSpecifier","src":"30:2:1"}],"canonicalName":"C2","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":4,"linearizedBaseContracts":[4,1],"name":"C2","nameLocation":"24:2:1","nodeType":"ContractDefinition","nodes":[],"scope":5,"src":"15:20:1","usedErrors":[]}],"src":"0:36:1"}
2 | 
```

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

```rust
 1 | use crate::{ast::*, visitor::ast_visitor::*};
 2 | use eyre::Result;
 3 | use macros::accept_id;
 4 | 
 5 | impl Node for EnumValue {
 6 |     fn accept(&self, visitor: &mut impl ASTConstVisitor) -> Result<()> {
 7 |         visitor.visit_enum_value(self)?;
 8 |         visitor.end_visit_enum_value(self)
 9 |     }
10 |     macros::accept_id!();
11 | }
12 | 
13 | impl Node for EnumDefinition {
14 |     fn accept(&self, visitor: &mut impl ASTConstVisitor) -> Result<()> {
15 |         if visitor.visit_enum_definition(self)? {
16 |             list_accept(&self.members, visitor)?;
17 |         }
18 |         self.accept_metadata(visitor)?;
19 |         visitor.end_visit_enum_definition(self)
20 |     }
21 |     fn accept_metadata(&self, visitor: &mut impl ASTConstVisitor) -> Result<()> {
22 |         let member_ids = &self.members.iter().map(|x| x.id).collect::<Vec<_>>().clone();
23 |         visitor.visit_immediate_children(self.id, member_ids.clone())?;
24 |         Ok(())
25 |     }
26 |     accept_id!();
27 | }
28 | 
```

--------------------------------------------------------------------------------
/aderyn_core/src/visitor/macros.rs:
--------------------------------------------------------------------------------

```rust
 1 | macro_rules! generate_visit_methods_for_workspace_context_with_insert_node {
 2 |     ($( $method_name:ident | $node:ident => $map_name:ident | ),* $(,)*) => {
 3 |         $(
 4 |             fn $method_name(&mut self, node: &$node) -> Result<bool> {
 5 |                 self.nodes
 6 |                     .insert(node.id, ASTNode::$node(node.clone()));
 7 |                 self.$map_name.insert(
 8 |                     node.clone(),
 9 |                     NodeContext {
10 |                         source_unit_id: self.last_source_unit_id,
11 |                         contract_definition_id: self.last_contract_definition_id,
12 |                         function_definition_id: self.last_function_definition_id,
13 |                         modifier_definition_id: self.last_modifier_definition_id,
14 |                     },
15 |                 );
16 |                 Ok(true)
17 |             }
18 |         )*
19 |     };
20 | }
21 | 
22 | pub(crate) use generate_visit_methods_for_workspace_context_with_insert_node;
23 | 
```

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

```rust
 1 | use crate::{
 2 |     ast::NodeID,
 3 |     context::workspace::WorkspaceContext,
 4 |     visitor::ast_visitor::{ASTConstVisitor, Node},
 5 | };
 6 | 
 7 | pub trait Peek {
 8 |     /// Peek into the source code of a node
 9 |     fn peek(&self, context: &WorkspaceContext) -> Option<String>;
10 | }
11 | 
12 | #[derive(Default)]
13 | struct NodeIDReceiver {
14 |     id: Option<NodeID>,
15 | }
16 | 
17 | impl ASTConstVisitor for NodeIDReceiver {
18 |     fn visit_node_id(&mut self, node_id: Option<NodeID>) -> eyre::Result<()> {
19 |         self.id = node_id;
20 |         Ok(())
21 |     }
22 | }
23 | 
24 | impl<T: Node + ?Sized> Peek for T {
25 |     fn peek(&self, context: &WorkspaceContext) -> Option<String> {
26 |         // Setup a Node ID receiver
27 |         let mut node_id_receiver = NodeIDReceiver::default();
28 | 
29 |         // Find the ID of the node this method is called upon
30 |         self.accept_id(&mut node_id_receiver).ok()?;
31 |         let current_node_id = node_id_receiver.id?;
32 | 
33 |         context.get_source_code_of_node(current_node_id)
34 |     }
35 | }
36 | 
```

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

```rust
 1 | use askama::Template;
 2 | use derive_builder::Builder;
 3 | use serde::Serialize;
 4 | 
 5 | use crate::ast::NodeID;
 6 | 
 7 | #[derive(Builder, Serialize, Template)]
 8 | #[template(path = "mcp-tool-response/node_summarizer.md")]
 9 | #[builder(pattern = "owned")]
10 | pub struct NodeSummary {
11 |     pub compilation_unit_index: usize,
12 |     pub node_id: NodeID,
13 |     pub filepath: String,
14 |     pub code: String,
15 |     pub containing_contract: Option<NodeInfo>,
16 |     pub containing_modifier: Option<NodeInfo>,
17 |     pub containing_function: Option<NodeInfo>,
18 |     pub containing_callgraphs: Vec<EntrypointCallgraphInfo>,
19 | }
20 | 
21 | #[derive(Default, Serialize, Builder)]
22 | #[builder(pattern = "owned")]
23 | pub struct NodeInfo {
24 |     pub name: String,
25 |     pub node_id: NodeID,
26 | }
27 | 
28 | #[derive(Default, Serialize, Builder)]
29 | #[builder(pattern = "owned")]
30 | pub struct EntrypointCallgraphInfo {
31 |     pub deployable_contract_id: NodeID,
32 |     pub deployable_contract_name: String,
33 |     pub entrypoint_ids: Vec<NodeID>,
34 | }
35 | 
```

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

```json
1 | {"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":5050.236324390194,"upper_bound":5357.877616729643},"point_estimate":5176.442844435567,"standard_error":80.50809087778876},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":4980.42480563654,"upper_bound":5113.374251385947},"point_estimate":5063.566448007774,"standard_error":30.415752958955476},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":165.78741946008148,"upper_bound":282.0308998739026},"point_estimate":226.25540601717648,"standard_error":28.397993442635176},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":5139.373808470248,"upper_bound":5796.281330618601},"point_estimate":5389.070936884581,"standard_error":177.774555037507},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":211.8828666673613,"upper_bound":1296.864422483158},"point_estimate":807.8284728365073,"standard_error":309.7011537447096}}
```

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

```json
1 | {"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":5050.236324390194,"upper_bound":5357.877616729643},"point_estimate":5176.442844435567,"standard_error":80.50809087778876},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":4980.42480563654,"upper_bound":5113.374251385947},"point_estimate":5063.566448007774,"standard_error":30.415752958955476},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":165.78741946008148,"upper_bound":282.0308998739026},"point_estimate":226.25540601717648,"standard_error":28.397993442635176},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":5139.373808470248,"upper_bound":5796.281330618601},"point_estimate":5389.070936884581,"standard_error":177.774555037507},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":211.8828666673613,"upper_bound":1296.864422483158},"point_estimate":807.8284728365073,"standard_error":309.7011537447096}}
```

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

```json
1 | {"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":1596768.9457915858,"upper_bound":1776731.7485619516},"point_estimate":1676691.8242909454,"standard_error":46204.5314422065},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":1510973.875,"upper_bound":1610283.887987013},"point_estimate":1544900.279677113,"standard_error":27089.8782568759},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":146367.04052909018,"upper_bound":252611.15239304234},"point_estimate":199646.00674223632,"standard_error":27161.45815974013},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":1598688.354816894,"upper_bound":1730263.463250756},"point_estimate":1658451.7662834344,"standard_error":33605.350538935396},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":237700.72912069052,"upper_bound":684428.2455180079},"point_estimate":464621.6832968203,"standard_error":123596.98321683449}}
```

--------------------------------------------------------------------------------
/benchmarks/inconsistent-type-names/new/estimates.json:
--------------------------------------------------------------------------------

```json
1 | {"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":1596768.9457915858,"upper_bound":1776731.7485619516},"point_estimate":1676691.8242909454,"standard_error":46204.5314422065},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":1510973.875,"upper_bound":1610283.887987013},"point_estimate":1544900.279677113,"standard_error":27089.8782568759},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":146367.04052909018,"upper_bound":252611.15239304234},"point_estimate":199646.00674223632,"standard_error":27161.45815974013},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":1598688.354816894,"upper_bound":1730263.463250756},"point_estimate":1658451.7662834344,"standard_error":33605.350538935396},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":237700.72912069052,"upper_bound":684428.2455180079},"point_estimate":464621.6832968203,"standard_error":123596.98321683449}}
```

--------------------------------------------------------------------------------
/benchmarks/push-zero-opcode/base/estimates.json:
--------------------------------------------------------------------------------

```json
1 | {"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":42613.91429728536,"upper_bound":43713.90161892534},"point_estimate":43116.182860395806,"standard_error":281.4515474268744},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":41957.47593582888,"upper_bound":43443.757429901634},"point_estimate":43006.31972610723,"standard_error":328.8435162223804},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":1429.1411181077865,"upper_bound":2314.6739932016576},"point_estimate":1791.5812954173246,"standard_error":192.0179623060255},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":41304.1138643215,"upper_bound":43671.80909126871},"point_estimate":42279.28879790964,"standard_error":622.9868396642561},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":1619.958474185393,"upper_bound":3940.052737669384},"point_estimate":2821.02247047013,"standard_error":599.3741985032071}}
```

--------------------------------------------------------------------------------
/benchmarks/push-zero-opcode/new/estimates.json:
--------------------------------------------------------------------------------

```json
1 | {"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":42613.91429728536,"upper_bound":43713.90161892534},"point_estimate":43116.182860395806,"standard_error":281.4515474268744},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":41957.47593582888,"upper_bound":43443.757429901634},"point_estimate":43006.31972610723,"standard_error":328.8435162223804},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":1429.1411181077865,"upper_bound":2314.6739932016576},"point_estimate":1791.5812954173246,"standard_error":192.0179623060255},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":41304.1138643215,"upper_bound":43671.80909126871},"point_estimate":42279.28879790964,"standard_error":622.9868396642561},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":1619.958474185393,"upper_bound":3940.052737669384},"point_estimate":2821.02247047013,"standard_error":599.3741985032071}}
```

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

```rust
 1 | use crate::{
 2 |     ast::*,
 3 |     context::workspace::{ASTNode, WorkspaceContext},
 4 |     visitor::ast_visitor::{ASTConstVisitor, Node},
 5 | };
 6 | 
 7 | pub trait GetImmediateParent {
 8 |     /// Get the parent Chain of an ASTNode
 9 |     fn parent<'a>(&self, context: &'a WorkspaceContext) -> Option<&'a ASTNode>;
10 | }
11 | 
12 | #[derive(Default)]
13 | struct NodeIDReceiver {
14 |     id: Option<NodeID>,
15 | }
16 | 
17 | impl ASTConstVisitor for NodeIDReceiver {
18 |     fn visit_node_id(&mut self, node_id: Option<NodeID>) -> eyre::Result<()> {
19 |         self.id = node_id;
20 |         Ok(())
21 |     }
22 | }
23 | 
24 | impl<T: Node + ?Sized> GetImmediateParent for T {
25 |     fn parent<'a>(&self, context: &'a WorkspaceContext) -> Option<&'a ASTNode> {
26 |         // Setup a Node ID receiver
27 |         let mut node_id_receiver = NodeIDReceiver::default();
28 | 
29 |         // Find the ID of the node this method is called upon
30 |         self.accept_id(&mut node_id_receiver).ok()?;
31 |         let current_node_id = node_id_receiver.id?;
32 | 
33 |         context.get_parent(current_node_id)
34 |     }
35 | }
36 | 
```

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

```rust
 1 | #[allow(clippy::module_inception)]
 2 | pub mod ast;
 3 | pub mod ast_nodes;
 4 | pub mod impls;
 5 | pub mod macros;
 6 | pub mod magic;
 7 | pub mod node_type;
 8 | pub mod yul;
 9 | 
10 | pub use self::{impls::*, magic::*, node_type::*, yul::*};
11 | 
12 | pub use NodeID;
13 | pub use ast::ASTNode;
14 | pub use ast_nodes::*;
15 | 
16 | #[cfg(test)]
17 | mod tests {
18 |     use super::*;
19 |     use std::{fs, path::PathBuf};
20 | 
21 |     #[test]
22 |     fn can_parse_ast() {
23 |         fs::read_dir(PathBuf::from("../tests/ast")).unwrap().for_each(|path| {
24 |             let path = path.unwrap().path();
25 |             let path_str = path.to_string_lossy();
26 | 
27 |             let input = fs::read_to_string(&path).unwrap();
28 |             let result: Result<SourceUnit, _> = serde_json::from_str(&input);
29 |             match result {
30 |                 Err(e) => {
31 |                     println!("... {path_str} fail: {e}");
32 |                     panic!();
33 |                 }
34 |                 Ok(_) => {
35 |                     println!("... {path_str} ok");
36 |                 }
37 |             }
38 |         })
39 |     }
40 | }
41 | 
```

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

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

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

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

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

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

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

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

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

```toml
 1 | [package]
 2 | name = "aderyn_driver"
 3 | version = "0.6.5"
 4 | edition = { workspace = true }
 5 | authors = { workspace = true }
 6 | description = { workspace = true }
 7 | license = { workspace = true }
 8 | repository = { workspace = true }
 9 | homepage = { workspace = true }
10 | 
11 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
12 | 
13 | [dependencies]
14 | aderyn_core = { workspace = true }
15 | rayon = { workspace = true }
16 | serde_json = { workspace = true, features = ["preserve_order"] }
17 | serde = { workspace = true, features = ["derive"] }
18 | serde_repr = { workspace = true }
19 | serde-sarif = { workspace = true }
20 | toml = { workspace = true }
21 | field_access = { workspace = true }
22 | tokio = { workspace = true, features = ["full"] }
23 | tower-lsp = { workspace = true }
24 | dunce = { workspace = true }
25 | prettytable = { workspace = true }
26 | solidity_ast = { workspace = true }
27 | rmcp = { workspace = true }
28 | 
29 | [lints]
30 | workspace = true
31 | 
32 | [dev-dependencies]
33 | criterion = { workspace = true }
34 | 
35 | [[bench]]
36 | name = "detectors"
37 | harness = false
38 | 
```

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

```rust
 1 | use crate::{
 2 |     ast::*,
 3 |     context::workspace::{ASTNode, WorkspaceContext},
 4 |     visitor::ast_visitor::{ASTConstVisitor, Node},
 5 | };
 6 | 
 7 | pub trait GetAncestralLine {
 8 |     /// Get the parent Chain of an ASTNode
 9 |     fn ancestral_line<'a>(&self, context: &'a WorkspaceContext) -> Option<Vec<&'a ASTNode>>;
10 | }
11 | 
12 | #[derive(Default)]
13 | struct NodeIDReceiver {
14 |     id: Option<NodeID>,
15 | }
16 | 
17 | impl ASTConstVisitor for NodeIDReceiver {
18 |     fn visit_node_id(&mut self, node_id: Option<NodeID>) -> eyre::Result<()> {
19 |         self.id = node_id;
20 |         Ok(())
21 |     }
22 | }
23 | 
24 | impl<T: Node + ?Sized> GetAncestralLine for T {
25 |     fn ancestral_line<'a>(&self, context: &'a WorkspaceContext) -> Option<Vec<&'a ASTNode>> {
26 |         // Setup a Node ID receiver
27 |         let mut node_id_receiver = NodeIDReceiver::default();
28 | 
29 |         // Find the ID of the node this method is called upon
30 |         self.accept_id(&mut node_id_receiver).ok()?;
31 |         let current_node_id = node_id_receiver.id?;
32 | 
33 |         Some(context.get_ancestral_line(current_node_id))
34 |     }
35 | }
36 | 
```

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

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

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

```rust
 1 | use askama::Template;
 2 | use derive_builder::Builder;
 3 | use serde::Serialize;
 4 | 
 5 | use crate::{ast::NodeID, context::graph::RawCallGraph};
 6 | 
 7 | #[derive(Builder, Serialize, Template)]
 8 | #[template(path = "mcp-tool-response/callgraph.md")]
 9 | #[builder(pattern = "owned")]
10 | pub struct CallgraphToolResponse {
11 |     pub compilation_unit_index: usize,
12 |     pub contract: ContractData,
13 |     pub entrypoint_function: EntrypointFunctionData,
14 |     pub graph: RawCallGraph, /* NOTE: we do not supply the whole callgraph; only the
15 |                               * subgraph traversed from the entrypoint function */
16 |     pub post_order_nodes: Vec<NodeData>,
17 | }
18 | 
19 | #[derive(Builder, Serialize)]
20 | #[builder(pattern = "owned")]
21 | pub struct ContractData {
22 |     pub name: String,
23 |     pub node_id: NodeID,
24 | }
25 | 
26 | #[derive(Builder, Serialize)]
27 | #[builder(pattern = "owned")]
28 | pub struct EntrypointFunctionData {
29 |     pub name: String,
30 |     pub node_id: NodeID,
31 | }
32 | 
33 | #[derive(Builder, Serialize)]
34 | #[builder(pattern = "owned")]
35 | pub struct NodeData {
36 |     pub name: String,
37 |     pub node_id: NodeID,
38 |     pub called_nodes: Vec<NodeData>,
39 | }
40 | 
```

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

```javascript
 1 | // We require the Hardhat Runtime Environment explicitly here. This is optional
 2 | // but useful for running the script in a standalone fashion through `node <script>`.
 3 | //
 4 | // You can also run a script with `npx hardhat run <script>`. If you do that, Hardhat
 5 | // will compile your contracts, add the Hardhat Runtime Environment's members to the
 6 | // global scope, and execute the script.
 7 | const hre = require("hardhat");
 8 | 
 9 | async function main() {
10 |   const currentTimestampInSeconds = Math.round(Date.now() / 1000);
11 |   const unlockTime = currentTimestampInSeconds + 60;
12 | 
13 |   const lockedAmount = hre.ethers.parseEther("0.001");
14 | 
15 |   const lock = await hre.ethers.deployContract("Lock", [unlockTime], {
16 |     value: lockedAmount,
17 |   });
18 | 
19 |   await lock.waitForDeployment();
20 | 
21 |   console.log(
22 |     `Lock with ${ethers.formatEther(
23 |       lockedAmount
24 |     )}ETH and unlock timestamp ${unlockTime} deployed to ${lock.target}`
25 |   );
26 | }
27 | 
28 | // We recommend this pattern to be able to use async/await everywhere
29 | // and properly handle errors.
30 | main().catch((error) => {
31 |   console.error(error);
32 |   process.exitCode = 1;
33 | });
34 | 
```

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

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

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

```rust
 1 | use xshell::{Shell, cmd};
 2 | 
 3 | pub fn blesspr() -> anyhow::Result<()> {
 4 |     let sh = Shell::new()?;
 5 |     sh.change_dir(env!("CARGO_MANIFEST_DIR"));
 6 |     sh.change_dir("../../");
 7 | 
 8 |     // Run cargo build (sanity test)
 9 |     let cmd = cmd!(sh, "cargo build");
10 |     cmd.run()?;
11 | 
12 |     // Fix clippy
13 |     let cmd = cmd!(sh, "cargo fixclippy");
14 |     cmd.run()?;
15 | 
16 |     // Check clippy
17 |     let cmd = cmd!(sh, "cargo clippy").arg("--").arg("-D").arg("warnings");
18 |     cmd.run()?;
19 | 
20 |     // Fix format
21 |     let cmd = cmd!(sh, "cargo fixfmt");
22 |     cmd.run()?;
23 | 
24 |     // Check fixed format
25 |     let cmd = cmd!(sh, "cargo fmt --all --check");
26 |     cmd.run()?;
27 | 
28 |     // Create reportgen
29 |     let cmd = cmd!(sh, "cargo prep --all --parallel");
30 |     cmd.run()?;
31 | 
32 |     // Create aderyn.toml
33 |     let cmd = cmd!(sh, "cargo tomlgen");
34 |     cmd.run()?;
35 | 
36 |     // Push changes
37 |     let cmd = cmd!(sh, "git add .");
38 |     cmd.run()?;
39 |     let cmd = cmd!(sh, "git commit -am").arg("chore: cargo blesspr");
40 |     cmd.run()?;
41 |     let cmd = cmd!(sh, "git config push.autoSetupRemote true");
42 |     cmd.run()?;
43 |     let cmd = cmd!(sh, "git push");
44 |     cmd.run()?;
45 | 
46 |     Ok(())
47 | }
48 | 
```

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

```rust
 1 | use askama::Template;
 2 | use derive_builder::Builder;
 3 | use serde::Serialize;
 4 | use std::collections::BTreeMap;
 5 | 
 6 | use crate::ast::NodeID;
 7 | 
 8 | pub type RNodeType = String; // To respect RMCP + template schema, chose simple type for output
 9 | 
10 | #[derive(Template, Builder, Serialize)]
11 | #[template(path = "mcp-tool-response/node_finder_search.md")]
12 | #[builder(pattern = "owned")]
13 | pub struct NodeFinderMatches {
14 |     pub term: String,
15 |     pub node_type: RNodeType,
16 |     pub matching_nodes: Vec<NodeInfo>,
17 | }
18 | 
19 | #[derive(Template, Builder, Serialize)]
20 | #[template(path = "mcp-tool-response/node_finder_get_all.md")]
21 | #[builder(pattern = "owned")]
22 | pub struct NodeFinderAll {
23 |     pub node_type: RNodeType,
24 |     pub nodes: Vec<NodeInfo>,
25 | }
26 | 
27 | #[derive(Template, Builder, Serialize)]
28 | #[template(path = "mcp-tool-response/node_finder_grep.md")]
29 | #[builder(pattern = "owned")]
30 | pub struct NodeFinderGrepMatches {
31 |     pub term: String,
32 |     pub nodes: BTreeMap<RNodeType, Vec<NodeInfo>>,
33 | }
34 | 
35 | #[derive(Builder, Serialize)]
36 | #[builder(pattern = "owned")]
37 | pub struct NodeInfo {
38 |     pub name: String,
39 |     pub node_id: NodeID,
40 |     pub compilation_unit_index: usize,
41 | }
42 | 
```

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

```json
 1 | {
 2 |     "absolutePath": "/Users/alexroan/Documents/Cyfrin/aderyn/tests/contract-playground/src/ExperimentalEncoder.sol",
 3 |     "exportedSymbols":
 4 |     {
 5 |       "ExperimentalEncoder":
 6 |       [
 7 |         3
 8 |       ]
 9 |     },
10 |     "id": 4,
11 |     "nodeType": "SourceUnit",
12 |     "nodes":
13 |     [
14 |       {
15 |         "id": 1,
16 |         "literals":
17 |         [
18 |           "solidity",
19 |           "0.6",
20 |           ".0"
21 |         ],
22 |         "nodeType": "PragmaDirective",
23 |         "src": "45:22:0"
24 |       },
25 |       {
26 |         "id": 2,
27 |         "literals":
28 |         [
29 |           "experimental",
30 |           "ABIEncoderV2"
31 |         ],
32 |         "nodeType": "PragmaDirective",
33 |         "src": "68:33:0"
34 |       },
35 |       {
36 |         "abstract": false,
37 |         "baseContracts": [],
38 |         "contractDependencies": [],
39 |         "contractKind": "contract",
40 |         "documentation": null,
41 |         "fullyImplemented": true,
42 |         "id": 3,
43 |         "linearizedBaseContracts":
44 |         [
45 |           3
46 |         ],
47 |         "name": "ExperimentalEncoder",
48 |         "nodeType": "ContractDefinition",
49 |         "nodes": [],
50 |         "scope": 4,
51 |         "src": "103:32:0"
52 |       }
53 |     ],
54 |     "src": "45:90:0"
55 |   }
```

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

```rust
 1 | use crate::{ast::*, visitor::ast_visitor::*};
 2 | use eyre::Result;
 3 | 
 4 | impl Node for VariableDeclaration {
 5 |     fn accept(&self, visitor: &mut impl ASTConstVisitor) -> Result<()> {
 6 |         if visitor.visit_variable_declaration(self)? {
 7 |             if self.type_name.is_some() {
 8 |                 self.type_name.as_ref().unwrap().accept(visitor)?;
 9 |             }
10 |             if self.overrides.is_some() {
11 |                 self.overrides.as_ref().unwrap().accept(visitor)?;
12 |             }
13 |             if self.value.is_some() {
14 |                 self.value.as_ref().unwrap().accept(visitor)?;
15 |             }
16 |         }
17 |         self.accept_metadata(visitor)?;
18 |         visitor.end_visit_variable_declaration(self)
19 |     }
20 |     fn accept_metadata(&self, visitor: &mut impl ASTConstVisitor) -> Result<()> {
21 |         if let Some(overrides) = &self.overrides {
22 |             visitor.visit_immediate_children(self.id, vec![overrides.id])?;
23 |         }
24 |         if let Some(value) = &self.value
25 |             && let Some(value_id) = value.get_node_id()
26 |         {
27 |             visitor.visit_immediate_children(self.id, vec![value_id])?;
28 |         }
29 |         Ok(())
30 |     }
31 |     macros::accept_id!();
32 | }
33 | 
```

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

```rust
 1 | use crate::{
 2 |     ast::*,
 3 |     context::workspace::{ASTNode, WorkspaceContext},
 4 |     visitor::ast_visitor::{ASTConstVisitor, Node},
 5 | };
 6 | 
 7 | pub trait GetClosestAncestorOfTypeX {
 8 |     /// Get the parent Chain of an ASTNode
 9 |     fn closest_ancestor_of_type<'a>(
10 |         &self,
11 |         context: &'a WorkspaceContext,
12 |         node_type: NodeType,
13 |     ) -> Option<&'a ASTNode>;
14 | }
15 | 
16 | #[derive(Default)]
17 | struct NodeIDReceiver {
18 |     id: Option<NodeID>,
19 | }
20 | 
21 | impl ASTConstVisitor for NodeIDReceiver {
22 |     fn visit_node_id(&mut self, node_id: Option<NodeID>) -> eyre::Result<()> {
23 |         self.id = node_id;
24 |         Ok(())
25 |     }
26 | }
27 | 
28 | impl<T: Node + ?Sized> GetClosestAncestorOfTypeX for T {
29 |     fn closest_ancestor_of_type<'a>(
30 |         &self,
31 |         context: &'a WorkspaceContext,
32 |         node_type: NodeType,
33 |     ) -> Option<&'a ASTNode> {
34 |         // Setup a Node ID receiver
35 |         let mut node_id_receiver = NodeIDReceiver::default();
36 | 
37 |         // Find the ID of the node this method is called upon
38 |         self.accept_id(&mut node_id_receiver).ok()?;
39 |         let current_node_id = node_id_receiver.id?;
40 |         context.get_closest_ancestor(current_node_id, node_type)
41 |     }
42 | }
43 | 
```

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

```rust
 1 | use std::path::PathBuf;
 2 | 
 3 | use aderyn_driver::{detector::get_all_issue_detectors, process::PreprocessedConfig};
 4 | 
 5 | use criterion::{Criterion, criterion_group, criterion_main};
 6 | use rayon::iter::{IntoParallelRefIterator, ParallelIterator};
 7 | 
 8 | fn bench_individual_detectors_on_contract_playground(c: &mut Criterion) {
 9 |     let root_path = PathBuf::from("../tests/contract-playground");
10 |     let preprocessed_config =
11 |         PreprocessedConfig { root_path, src: None, include: None, exclude: None };
12 |     let (contexts, _) =
13 |         aderyn_driver::compile::compile_project(preprocessed_config, false, true).unwrap();
14 | 
15 |     for detector in get_all_issue_detectors() {
16 |         c.bench_function(detector.name().as_str(), |b| {
17 |             b.iter(|| {
18 |                 contexts.par_iter().for_each(|context| {
19 |                     let mut d = detector.skeletal_clone();
20 |                     let _ = d.detect(context).unwrap();
21 |                 })
22 |             })
23 |         });
24 |     }
25 | }
26 | 
27 | criterion_group!(
28 |     detectors,                                         // Group name is the first argument
29 |     bench_individual_detectors_on_contract_playground, // Group 1
30 | );
31 | criterion_main!(detectors);
32 | 
```

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

```toml
 1 | [package]
 2 | name = "aderyn"
 3 | version = "0.6.5"
 4 | edition = { workspace = true }
 5 | default-run = "aderyn"
 6 | authors = { workspace = true }
 7 | description = { workspace = true }
 8 | license = { workspace = true }
 9 | repository = { workspace = true }
10 | homepage = { workspace = true }
11 | 
12 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
13 | 
14 | [dependencies]
15 | urlencoding = { workspace = true }
16 | webbrowser = { workspace = true }
17 | indoc = { workspace = true }
18 | aderyn_driver = { workspace = true }
19 | clap = { workspace = true, features = ["derive"] }
20 | reqwest = { workspace = true, features = ["blocking", "json", "rustls-tls"] }
21 | semver = { workspace = true }
22 | serde = { workspace = true, features = ["derive"] }
23 | serde_json = { workspace = true, features = ["preserve_order"] }
24 | strum = { workspace = true, features = ["derive"] }
25 | notify-debouncer-full = { workspace = true }
26 | crossbeam-channel = { workspace = true}
27 | termcolor = { workspace = true }
28 | tokio = { workspace = true, features = ["full"] }
29 | tower-lsp = { workspace = true }
30 | log = { workspace = true }
31 | rmcp = { workspace = true }
32 | axum = { workspace = true }
33 | clap_complete = { workspace = true }
34 | simplelog = "0"
35 | 
36 | [lints]
37 | workspace = true
38 | 
```

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

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

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

```markdown
 1 | ## Node summarizer
 2 | 
 3 | ### Compilation Unit: {{ compilation_unit_index }}
 4 | ### Node ID: {{ node_id }}
 5 | ### Filepath: {{ filepath }}
 6 | 
 7 | {% if let Some(contract) = containing_contract %}
 8 | ### Containing Contract Class: {{ contract.name }} | Node Id: {{ contract.node_id }}
 9 | {% endif %}
10 | 
11 | {% if let Some(function) = containing_function %}
12 | ### Containing Function: {{ function.name }} | Node Id: {{ function.node_id }}
13 | {% endif %}
14 | 
15 | {% if let Some(modifier) = containing_modifier %}
16 | ### Containing Modifier: {{ modifier.name }} | Node Id: {{ modifier.node_id }}
17 | {% endif %}
18 | 
19 | ### Code snippet of the node:
20 | ```solidity
21 | {{ code }}
22 | ```
23 | 
24 | ### Metadata
25 | {% if containing_callgraphs.len() == 0 %}
26 | No metadata present.
27 | {% else %}
28 | In this compilation unit {{ compilation_unit_index }}, Node ID {{ node_id }} appears in the callgraphs of the following entrypoints:
29 | {% for c in containing_callgraphs %}
30 | - Deployable contract `{{ c.deployable_contract_name }}` (node ID: {{ c.deployable_contract_id }}) entrypoints:
31 | {% for e in c.entrypoint_ids %}
32 |     - Entrypoint Node ID {{ e }}
33 | {% endfor %}
34 | 
35 | {% endfor %}
36 | 
37 | You can make use of Aderyn's callgraph tool to further holistically explore the bigger context in which this function is a part of.
38 | {% endif %}
39 | 
```

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

```rust
 1 | use crate::{
 2 |     ast::*,
 3 |     context::{
 4 |         browser::ExtractImmediateChildrenIDs,
 5 |         workspace::{ASTNode, WorkspaceContext},
 6 |     },
 7 |     visitor::ast_visitor::{ASTConstVisitor, Node},
 8 | };
 9 | 
10 | pub trait GetImmediateChildren {
11 |     /// Get the immediate children of an ASTNode
12 |     fn children<'a>(&self, context: &'a WorkspaceContext) -> Option<Vec<&'a ASTNode>>;
13 | }
14 | 
15 | #[derive(Default)]
16 | struct NodeIDReceiver {
17 |     id: Option<NodeID>,
18 | }
19 | 
20 | impl ASTConstVisitor for NodeIDReceiver {
21 |     fn visit_node_id(&mut self, node_id: Option<NodeID>) -> eyre::Result<()> {
22 |         self.id = node_id;
23 |         Ok(())
24 |     }
25 | }
26 | 
27 | impl<T: Node + ?Sized> GetImmediateChildren for T {
28 |     fn children<'a>(&self, context: &'a WorkspaceContext) -> Option<Vec<&'a ASTNode>> {
29 |         // Setup a Node ID receiver
30 |         let mut node_id_receiver = NodeIDReceiver::default();
31 | 
32 |         // Find the ID of the node this method is called upon
33 |         self.accept_id(&mut node_id_receiver).ok()?;
34 |         let current_node_id = node_id_receiver.id?;
35 | 
36 |         let children = ExtractImmediateChildrenIDs::from(context.nodes.get(&current_node_id)?)
37 |             .extracted
38 |             .into_iter()
39 |             .filter_map(|x| context.nodes.get(&x))
40 |             .collect::<Vec<_>>();
41 |         Some(children)
42 |     }
43 | }
44 | 
```

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

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

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

```rust
 1 | use crate::{
 2 |     ast::{Block, UncheckedBlock, macros::accept_id},
 3 |     visitor::ast_visitor::*,
 4 | };
 5 | use eyre::Result;
 6 | 
 7 | impl Node for Block {
 8 |     fn accept(&self, visitor: &mut impl ASTConstVisitor) -> Result<()> {
 9 |         if visitor.visit_block(self)? {
10 |             list_accept(&self.statements, visitor)?;
11 |         }
12 |         self.accept_metadata(visitor)?;
13 |         visitor.end_visit_block(self)
14 |     }
15 | 
16 |     fn accept_metadata(&self, visitor: &mut impl ASTConstVisitor) -> Result<()> {
17 |         let children_ids = self.statements.iter().flat_map(|x| x.get_node_id()).collect::<Vec<_>>();
18 |         visitor.visit_immediate_children(self.id, children_ids)?;
19 |         Ok(())
20 |     }
21 | 
22 |     accept_id!();
23 | }
24 | 
25 | impl Node for UncheckedBlock {
26 |     fn accept(&self, visitor: &mut impl ASTConstVisitor) -> Result<()> {
27 |         if visitor.visit_unchecked_block(self)? {
28 |             list_accept(&self.statements, visitor)?;
29 |         }
30 |         self.accept_metadata(visitor)?;
31 |         visitor.end_visit_unchecked_block(self)
32 |     }
33 | 
34 |     fn accept_metadata(&self, visitor: &mut impl ASTConstVisitor) -> Result<()> {
35 |         let children_ids = self.statements.iter().flat_map(|x| x.get_node_id()).collect::<Vec<_>>();
36 |         visitor.visit_immediate_children(self.id, children_ids)?;
37 |         Ok(())
38 |     }
39 | 
40 |     accept_id!();
41 | }
42 | 
```

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

```rust
 1 | use crate::context::mcp::{MCPToolNamePool, ModelContextProtocolState, ModelContextProtocolTool};
 2 | use indoc::indoc;
 3 | use rmcp::{
 4 |     ErrorData as McpError,
 5 |     handler::server::wrapper::Parameters,
 6 |     model::{CallToolResult, Content},
 7 | };
 8 | use std::sync::Arc;
 9 | 
10 | #[derive(Clone)]
11 | pub struct ToolGuide;
12 | 
13 | impl ModelContextProtocolTool for ToolGuide {
14 |     type Input = rmcp::model::EmptyObject;
15 | 
16 |     fn new(_state: Arc<ModelContextProtocolState>) -> Self {
17 |         Self
18 |     }
19 | 
20 |     fn name(&self) -> String {
21 |         MCPToolNamePool::AderynGetToolGuide.to_string()
22 |     }
23 | 
24 |     fn description(&self) -> String {
25 |         indoc! {
26 |             "MUST be called once at the beginning to have that base knowledge required to \
27 |             solve user's problems. Provides glossary, general approaches to common scenarios, \
28 |             advanced tool calling strategies and tips to leverage Aderyn's MCP tools for \
29 |             high performance and accuracy."
30 |         }
31 |         .to_string()
32 |     }
33 | 
34 |     fn execute(&self, _input: Parameters<Self::Input>) -> Result<CallToolResult, McpError> {
35 |         let response = include_str!(concat!(
36 |             env!("CARGO_MANIFEST_DIR"),
37 |             "/templates/mcp-tool-response/tool_guide.md"
38 |         ));
39 |         Ok(CallToolResult::success(vec![Content::text(response)]))
40 |     }
41 | }
42 | 
```

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

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

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

```toml
 1 | [package]
 2 | name = "aderyn_core"
 3 | version = "0.6.5"
 4 | edition = { workspace = true }
 5 | authors = { workspace = true }
 6 | description = { workspace = true }
 7 | license = { workspace = true }
 8 | repository = { workspace = true }
 9 | homepage = { workspace = true }
10 | 
11 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
12 | 
13 | [dependencies]
14 | eyre = { workspace = true }
15 | ignore = { workspace = true }
16 | phf = { workspace = true, features = ["macros"] }
17 | prettytable = { workspace = true }
18 | rayon = { workspace = true }
19 | semver = { workspace = true }
20 | serde = { workspace = true, features = ["derive"] }
21 | serde_json = { workspace = true, features = ["preserve_order"] }
22 | serde_repr = { workspace = true }
23 | strum = { workspace = true, features = ["derive"] }
24 | num-bigint = { workspace = true }
25 | num-traits = { workspace = true }
26 | lazy-regex = { workspace = true }
27 | derive_more = { workspace = true }
28 | dunce = { workspace = true }
29 | solidity_ast = { workspace = true }
30 | rmcp = { workspace = true }
31 | askama = { workspace = true }
32 | indoc = { workspace = true}
33 | derive_builder = { workspace = true }
34 | log = { workspace = true }
35 | regex = { workspace = true }
36 | 
37 | [dev-dependencies]
38 | petgraph = { workspace = true }
39 | serial_test = { workspace = true }
40 | once_cell = { workspace = true }
41 | 
42 | [lints]
43 | workspace = true
44 | 
45 | [lib]
46 | doctest = false
47 | 
```

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

```rust
 1 | use askama::Template;
 2 | use derive_builder::Builder;
 3 | use serde::Serialize;
 4 | 
 5 | use crate::ast::NodeID;
 6 | 
 7 | #[derive(Builder, Serialize, Template)]
 8 | #[template(path = "mcp-tool-response/contract_surface.md")]
 9 | #[builder(pattern = "owned")]
10 | pub struct ContractSurface {
11 |     pub name: String,
12 |     pub node_id: NodeID,
13 |     pub filepath: String,
14 |     pub compilation_unit_index: usize,
15 |     pub total_state_variables: usize,
16 |     pub reversed_chain: Vec<ContractInfo>,
17 |     pub entrypoints: EntrypointFunctions,
18 | }
19 | 
20 | #[derive(Builder, Serialize, Default)]
21 | #[builder(pattern = "owned")]
22 | pub struct EntrypointFunctions {
23 |     pub external_functions: Vec<FunctionInfo>,
24 |     pub public_functions: Vec<FunctionInfo>,
25 |     pub fallback_function: Option<FunctionInfo>,
26 |     pub receive_function: Option<FunctionInfo>,
27 | }
28 | 
29 | #[derive(Builder, Serialize)]
30 | #[builder(pattern = "owned")]
31 | pub struct ContractInfo {
32 |     pub name: String,
33 |     pub node_id: NodeID,
34 |     pub state_variables: Vec<String>,
35 |     pub filepath: String,
36 | }
37 | 
38 | #[derive(Builder, Serialize)]
39 | #[builder(pattern = "owned")]
40 | pub struct FunctionInfo {
41 |     pub name: String,
42 |     pub node_id: NodeID,
43 |     pub containing_contract: ContainingContract,
44 | }
45 | 
46 | #[derive(Builder, Serialize)]
47 | #[builder(pattern = "owned")]
48 | pub struct ContainingContract {
49 |     pub name: String,
50 |     pub node_id: NodeID,
51 | }
52 | 
```

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

```rust
 1 | use crate::ast::{ImportDirective, SourceUnit, SourceUnitNode};
 2 | use eyre::{Result, eyre};
 3 | use std::io;
 4 | 
 5 | impl SourceUnit {
 6 |     pub fn source_line(&self, src: &str) -> Result<usize> {
 7 |         let source = match self.source.as_ref() {
 8 |             Some(source) => source.as_str(),
 9 |             _ => return Err(eyre!("not found")),
10 |         };
11 | 
12 |         let values: Vec<Option<usize>> = src
13 |             .split(':')
14 |             .map(|token| {
15 |                 if token.is_empty() {
16 |                     None
17 |                 } else {
18 |                     token
19 |                         .parse()
20 |                         .map_err(|error| io::Error::new(io::ErrorKind::InvalidData, error))
21 |                         .ok()
22 |                 }
23 |             })
24 |             .collect();
25 | 
26 |         let index = values.first().and_then(|&value| value).ok_or_else(|| eyre!("not found"))?;
27 | 
28 |         if index > source.len() {
29 |             return Err(eyre!("index out of bounds"));
30 |         }
31 | 
32 |         Ok(source[..index].chars().filter(|&c| c == '\n').count() + 1)
33 |     }
34 | 
35 |     pub fn import_directives(&self) -> Vec<&ImportDirective> {
36 |         self.nodes
37 |             .iter()
38 |             .filter_map(|n| {
39 |                 let SourceUnitNode::ImportDirective(node) = n else {
40 |                     return None;
41 |                 };
42 |                 Some(node)
43 |             })
44 |             .collect()
45 |     }
46 | }
47 | 
```

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

```rust
 1 | use crate::{audit::auditor::get_auditor_detectors, context::workspace::WorkspaceContext};
 2 | use eyre::Result;
 3 | use prettytable::Row;
 4 | use rayon::iter::{IntoParallelRefMutIterator, ParallelIterator};
 5 | use std::{
 6 |     collections::{BTreeMap, btree_map::Entry},
 7 |     error::Error,
 8 | };
 9 | 
10 | pub type AT = Vec<(String, (Row, Vec<Row>))>;
11 | 
12 | pub fn prepare_audit_tables(contexts: &[WorkspaceContext]) -> Result<AT, Box<dyn Error>> {
13 |     let audit_detectors_with_output = get_auditor_detectors()
14 |         .par_iter_mut()
15 |         .flat_map(|detector| {
16 |             // Keys -> detector's title
17 |             // Value -> (table titles, table rows)
18 |             let mut grouped_instances: BTreeMap<String, (Row, Vec<Row>)> = BTreeMap::new();
19 | 
20 |             for context in contexts {
21 |                 let mut d = detector.skeletal_clone();
22 |                 if let Ok(found) = d.detect(context)
23 |                     && found
24 |                 {
25 |                     match grouped_instances.entry(d.title()) {
26 |                         Entry::Occupied(o) => o.into_mut().1.extend(d.table_rows()),
27 |                         Entry::Vacant(v) => {
28 |                             v.insert((d.table_titles(), d.table_rows()));
29 |                         }
30 |                     };
31 |                 }
32 |             }
33 | 
34 |             grouped_instances
35 |         })
36 |         .collect::<Vec<_>>();
37 | 
38 |     Ok(audit_detectors_with_output)
39 | }
40 | 
```

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

```rust
 1 | use std::str::FromStr;
 2 | 
 3 | pub struct CodeIterator {
 4 |     pub content: Vec<char>,
 5 |     pub curr_pos: usize,
 6 |     pub line_no: usize,
 7 | }
 8 | 
 9 | pub struct StatefulToken {
10 |     pub curr: char,
11 |     pub next: Option<char>,
12 |     pub line_no: usize,
13 | }
14 | 
15 | impl Iterator for CodeIterator {
16 |     type Item = StatefulToken;
17 | 
18 |     fn next(&mut self) -> Option<Self::Item> {
19 |         let curr_pos = self.curr_pos;
20 |         self.curr_pos += 1;
21 |         let result = {
22 |             if curr_pos < self.content.len() - 1 {
23 |                 Some(StatefulToken {
24 |                     curr: self.content[curr_pos],
25 |                     next: Some(self.content[curr_pos + 1]),
26 |                     line_no: self.line_no,
27 |                 })
28 |             } else if curr_pos < self.content.len() {
29 |                 Some(StatefulToken {
30 |                     curr: self.content[curr_pos],
31 |                     next: None,
32 |                     line_no: self.line_no,
33 |                 })
34 |             } else {
35 |                 None
36 |             }
37 |         };
38 | 
39 |         if let Some(ref c) = result
40 |             && c.curr == '\n'
41 |         {
42 |             self.line_no += 1;
43 |         }
44 | 
45 |         result
46 |     }
47 | }
48 | 
49 | impl FromStr for CodeIterator {
50 |     type Err = usize;
51 | 
52 |     fn from_str(code: &str) -> Result<Self, <Self as FromStr>::Err> {
53 |         Ok(CodeIterator { content: code.chars().collect::<Vec<_>>(), curr_pos: 0, line_no: 1 })
54 |     }
55 | }
56 | 
```

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

```rust
 1 | use crate::{detect::helpers::is_constant_boolean, issue_detector};
 2 | use eyre::Result;
 3 | 
 4 | issue_detector! {
 5 |     BooleanEqualityDetector;
 6 | 
 7 |     severity: Low,
 8 |     title: "Boolean equality is not required",
 9 |     desc: "If `x` is a boolean, use `if(x)` and `if(!x)` instead of `if(x == true)` or `if(x == false)`.",
10 |     name: BooleanEquality,
11 | 
12 |     |context| {
13 |         for binary_operation in context.binary_operations() {
14 |             if binary_operation.operator == "=="
15 |                 && [
16 |                     binary_operation.left_expression.as_ref(),
17 |                     binary_operation.right_expression.as_ref(),
18 |                 ]
19 |                 .iter()
20 |                 .any(|&operand| is_constant_boolean(context, operand))
21 |             {
22 |                 grab!(binary_operation);
23 |             }
24 |         }
25 |     }
26 | 
27 | }
28 | 
29 | #[cfg(test)]
30 | mod boolean_equality_tests {
31 | 
32 |     use crate::detect::{detector::IssueDetector, low::boolean_equality::BooleanEqualityDetector};
33 | 
34 |     #[test]
35 | 
36 |     fn test_boolean_equality_by_loading_contract_directly() {
37 |         let context = crate::detect::test_utils::load_solidity_source_unit(
38 |             "../tests/contract-playground/src/BooleanEquality.sol",
39 |         );
40 | 
41 |         let mut detector = BooleanEqualityDetector::default();
42 |         let found = detector.detect(&context).unwrap();
43 |         assert!(found);
44 |         assert_eq!(detector.instances().len(), 4);
45 |     }
46 | }
47 | 
```

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

```rust
 1 | use crate::ast::*;
 2 | use std::fmt::Display;
 3 | 
 4 | impl Display for ModifierDefinition {
 5 |     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
 6 |         f.write_str("modifier")?;
 7 | 
 8 |         if !self.name.is_empty() {
 9 |             f.write_fmt(format_args!(" {}", self.name))?;
10 |         }
11 | 
12 |         f.write_fmt(format_args!("{}", self.parameters))?;
13 | 
14 |         if self.visibility != Visibility::Internal {
15 |             f.write_fmt(format_args!("{} {}", self.parameters, self.visibility))?;
16 |         }
17 | 
18 |         if self.is_virtual {
19 |             f.write_fmt(format_args!(" virtual"))?;
20 |         }
21 | 
22 |         if let Some(overrides) = self.overrides.as_ref() {
23 |             f.write_fmt(format_args!(" {overrides}"))?;
24 |         }
25 | 
26 |         if let Some(body) = self.body.as_ref() {
27 |             f.write_fmt(format_args!(" {}", body))?;
28 |         }
29 | 
30 |         Ok(())
31 |     }
32 | }
33 | 
34 | impl Display for ModifierInvocation {
35 |     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
36 |         f.write_fmt(format_args!("{:?}", self.modifier_name))?;
37 | 
38 |         if let Some(arguments) = self.arguments.as_ref() {
39 |             f.write_str("(")?;
40 | 
41 |             for (i, argument) in arguments.iter().enumerate() {
42 |                 if i > 0 {
43 |                     f.write_str(", ")?;
44 |                 }
45 | 
46 |                 f.write_fmt(format_args!("{argument}"))?;
47 |             }
48 | 
49 |             f.write_str(")")?;
50 |         }
51 | 
52 |         Ok(())
53 |     }
54 | }
55 | 
```

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

```toml
 1 | [workspace]
 2 | members = ["cargo:."]
 3 | 
 4 | # Config for 'dist'
 5 | [dist]
 6 | # The preferred dist version to use in CI (Cargo.toml SemVer syntax)
 7 | cargo-dist-version = "0.28.0"
 8 | # CI backends to support
 9 | ci = "github"
10 | # The installers to generate for each app
11 | installers = ["shell", "npm", "homebrew"]
12 | # A GitHub repo to push Homebrew formulas to
13 | tap = "cyfrin/homebrew-tap"
14 | # Target platforms to build apps for (Rust target-triple syntax)
15 | targets = ["aarch64-apple-darwin", "aarch64-unknown-linux-gnu", "x86_64-apple-darwin", "x86_64-unknown-linux-gnu"]
16 | # A namespace to use when publishing this package to the npm registry
17 | npm-scope = "@cyfrin"
18 | # Path that installers should place binaries in
19 | install-path = "CARGO_HOME"
20 | # Publish jobs to run in CI
21 | publish-jobs = ["homebrew", "npm"]
22 | # Whether to install an updater program
23 | install-updater = true
24 | 
25 | [dist.github-custom-runners]
26 | global = "ubuntu-latest"
27 | 
28 | [dist.github-custom-runners.x86_64-unknown-linux-gnu]
29 | runner = "ubuntu-latest"
30 | container = { image = "quay.io/pypa/manylinux_2_28_x86_64", host = "x86_64-unknown-linux-musl" }
31 | 
32 | [dist.github-custom-runners.x86_64-unknown-linux-musl]
33 | runner = "ubuntu-latest"
34 | container = { image = "quay.io/pypa/musllinux_1_2_x86_64", host = "x86_64-unknown-linux-musl" }
35 | 
36 | [dist.github-custom-runners.aarch64-unknown-linux-gnu]
37 | runner = "ubuntu-latest"
38 | container = { image = "quay.io/pypa/manylinux_2_28_x86_64", host = "x86_64-unknown-linux-musl" }
39 | 
```

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

```
 1 | for group in &token_insight_groups {
 2 |    if group.token_type == HighLevelType::Code {
 3 |        println!(
 4 |            "{}-{} Size:{} Contrib:{}",
 5 |            group.start_line,
 6 |            group.end_line,
 7 |            group.token_insights.len(),
 8 |            group.total_contribution(),
 9 |        );
10 |        if group.total_contribution() == 37 {
11 |            for i in &group.token_insights {
12 |                println!(
13 |                    "{:?} - {:?} - {} - {} - {}",
14 |                    i.token_type,
15 |                    i.code_lines.info_lines,
16 |                    i.starts_with_newline,
17 |                    i.start_line,
18 |                    i.end_line
19 |                );
20 |            }
21 |        }
22 |    }
23 | }
24 | 
25 | 
26 | if value.token_type != TokenType::MultilineComment
27 |     && value.token_type != TokenType::SinglelineComment
28 |     && insight.start_line == 3
29 |     || insight.end_line == 3
30 | {
31 |     print!(
32 |         "{:?}, {}-{}\n",
33 |         value.token_type.clone(),
34 |         value.start_line,
35 |         value.end_line
36 |     );
37 |     println!("{}", value.content.clone());
38 | 
39 |     println!(
40 |         "Lines {}/{}/{}\n----------------------",
41 |         insight.code_lines.info_lines,
42 |         insight.code_lines.actual_first_line,
43 |         insight.code_lines.last_line_has_code
44 |     );
45 | }
46 | 
47 | starts in the same line, overcounted !
48 | println!(
49 |     "cutting for {} {} {} {} {}",
50 |     curr.start_line,
51 |     prev.end_line,
52 |     curr.code_lines.info_lines,
53 |     prev.code_lines.info_lines,
54 |     prev.code_lines.actual_first_line,
55 | );
56 | 
```

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

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