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(¤t_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 |
```