This is page 2 of 94. Use http://codebase.md/cyfrin/aderyn?page={x} to view the full context.
# Directory Structure
```
├── .cargo
│ └── config.toml
├── .git-blame-ignore-revs
├── .gitattributes
├── .github
│ ├── images
│ │ ├── aderyn_logo.png
│ │ ├── poweredbycyfrinblack.png
│ │ └── poweredbycyfrinblue.png
│ ├── ISSUE_TEMPLATE
│ │ ├── bug_report.md
│ │ ├── false_positive_issue.md
│ │ └── feature_request.md
│ └── workflows
│ ├── cargo.yml
│ ├── dependencies.yml
│ ├── release.yml
│ ├── reports.yml
│ └── toml.yml
├── .gitignore
├── .gitmodules
├── .vscode
│ └── settings.json
├── aderyn
│ ├── Cargo.toml
│ ├── oranda.json
│ ├── README.md
│ ├── src
│ │ ├── birdsong.rs
│ │ ├── completions.rs
│ │ ├── lib.rs
│ │ ├── lsp.rs
│ │ ├── main.rs
│ │ ├── mcp.rs
│ │ └── panic.rs
│ └── templates
│ └── aderyn.toml
├── aderyn_core
│ ├── .gitignore
│ ├── Cargo.toml
│ ├── README.md
│ ├── src
│ │ ├── ast
│ │ │ ├── ast_nodes.rs
│ │ │ ├── ast.rs
│ │ │ ├── impls
│ │ │ │ ├── ctx
│ │ │ │ │ ├── utils.rs
│ │ │ │ │ └── workspace.rs
│ │ │ │ ├── ctx.rs
│ │ │ │ ├── disp
│ │ │ │ │ ├── blocks.rs
│ │ │ │ │ ├── contracts.rs
│ │ │ │ │ ├── enumerations.rs
│ │ │ │ │ ├── errors.rs
│ │ │ │ │ ├── events.rs
│ │ │ │ │ ├── expressions.rs
│ │ │ │ │ ├── functions.rs
│ │ │ │ │ ├── identifiers.rs
│ │ │ │ │ ├── literals.rs
│ │ │ │ │ ├── modifiers.rs
│ │ │ │ │ ├── statements.rs
│ │ │ │ │ ├── structures.rs
│ │ │ │ │ ├── types.rs
│ │ │ │ │ ├── user_defined_value_types.rs
│ │ │ │ │ ├── using_for_directives.rs
│ │ │ │ │ └── variables.rs
│ │ │ │ ├── disp.rs
│ │ │ │ ├── node
│ │ │ │ │ ├── blocks.rs
│ │ │ │ │ ├── contracts.rs
│ │ │ │ │ ├── documentation.rs
│ │ │ │ │ ├── enumerations.rs
│ │ │ │ │ ├── errors.rs
│ │ │ │ │ ├── events.rs
│ │ │ │ │ ├── expressions.rs
│ │ │ │ │ ├── functions.rs
│ │ │ │ │ ├── identifiers.rs
│ │ │ │ │ ├── import_directives.rs
│ │ │ │ │ ├── literals.rs
│ │ │ │ │ ├── modifiers.rs
│ │ │ │ │ ├── pragma_directives.rs
│ │ │ │ │ ├── source_units.rs
│ │ │ │ │ ├── statements.rs
│ │ │ │ │ ├── structures.rs
│ │ │ │ │ ├── types.rs
│ │ │ │ │ ├── user_defined_value_types.rs
│ │ │ │ │ ├── using_for_directives.rs
│ │ │ │ │ └── variables.rs
│ │ │ │ ├── node.rs
│ │ │ │ ├── own
│ │ │ │ │ ├── hashing.rs
│ │ │ │ │ ├── node_id.rs
│ │ │ │ │ ├── source_units.rs
│ │ │ │ │ └── utils.rs
│ │ │ │ └── own.rs
│ │ │ ├── impls.rs
│ │ │ ├── macros.rs
│ │ │ ├── magic.rs
│ │ │ ├── node_type.rs
│ │ │ └── yul.rs
│ │ ├── ast.rs
│ │ ├── audit
│ │ │ ├── attack_surface.rs
│ │ │ ├── auditor.rs
│ │ │ ├── entrypoint.rs
│ │ │ └── public_functions_no_sender.rs
│ │ ├── audit.rs
│ │ ├── context
│ │ │ ├── browser
│ │ │ │ ├── ancestral_line.rs
│ │ │ │ ├── closest_ancestor.rs
│ │ │ │ ├── external_calls.rs
│ │ │ │ ├── extractor.rs
│ │ │ │ ├── immediate_children.rs
│ │ │ │ ├── location.rs
│ │ │ │ ├── macros.rs
│ │ │ │ ├── parent.rs
│ │ │ │ ├── peek_over.rs
│ │ │ │ ├── peek_under.rs
│ │ │ │ ├── peek.rs
│ │ │ │ ├── siblings.rs
│ │ │ │ ├── sort_nodes.rs
│ │ │ │ └── storage_vars.rs
│ │ │ ├── browser.rs
│ │ │ ├── capturable.rs
│ │ │ ├── flow
│ │ │ │ ├── display.rs
│ │ │ │ ├── error.rs
│ │ │ │ ├── kind.rs
│ │ │ │ ├── primitives.rs
│ │ │ │ ├── reducibles.rs
│ │ │ │ ├── tests.rs
│ │ │ │ ├── utils.rs
│ │ │ │ ├── visualizer.rs
│ │ │ │ └── voids.rs
│ │ │ ├── flow.rs
│ │ │ ├── graph
│ │ │ │ ├── callgraph
│ │ │ │ │ ├── legacy.rs
│ │ │ │ │ ├── new.rs
│ │ │ │ │ ├── tests.rs
│ │ │ │ │ ├── utils.rs
│ │ │ │ │ └── visit.rs
│ │ │ │ ├── callgraph.rs
│ │ │ │ ├── preprocess
│ │ │ │ │ ├── legacy.rs
│ │ │ │ │ └── new.rs
│ │ │ │ ├── preprocess.rs
│ │ │ │ ├── traits.rs
│ │ │ │ └── utils.rs
│ │ │ ├── graph.rs
│ │ │ ├── macros.rs
│ │ │ ├── mcp
│ │ │ │ ├── callgraph
│ │ │ │ │ ├── render.rs
│ │ │ │ │ ├── tool.rs
│ │ │ │ │ └── utils.rs
│ │ │ │ ├── callgraph.rs
│ │ │ │ ├── contract_surface
│ │ │ │ │ ├── render.rs
│ │ │ │ │ ├── tool.rs
│ │ │ │ │ └── util.rs
│ │ │ │ ├── contract_surface.rs
│ │ │ │ ├── list_contracts
│ │ │ │ │ ├── render.rs
│ │ │ │ │ └── tool.rs
│ │ │ │ ├── list_contracts.rs
│ │ │ │ ├── node_finder
│ │ │ │ │ ├── render.rs
│ │ │ │ │ ├── tool.rs
│ │ │ │ │ └── utils.rs
│ │ │ │ ├── node_finder.rs
│ │ │ │ ├── node_summarizer
│ │ │ │ │ ├── render.rs
│ │ │ │ │ ├── tool.rs
│ │ │ │ │ └── utils.rs
│ │ │ │ ├── node_summarizer.rs
│ │ │ │ ├── project_overview
│ │ │ │ │ ├── render.rs
│ │ │ │ │ └── tool.rs
│ │ │ │ ├── project_overview.rs
│ │ │ │ ├── tool_guide
│ │ │ │ │ └── tool.rs
│ │ │ │ └── tool_guide.rs
│ │ │ ├── mcp.rs
│ │ │ ├── router
│ │ │ │ ├── external_calls.rs
│ │ │ │ ├── internal_calls.rs
│ │ │ │ ├── modifier_calls.rs
│ │ │ │ └── tests.rs
│ │ │ ├── router.rs
│ │ │ └── workspace.rs
│ │ ├── context.rs
│ │ ├── detect
│ │ │ ├── detector.rs
│ │ │ ├── entrypoint.rs
│ │ │ ├── helpers.rs
│ │ │ ├── high
│ │ │ │ ├── _template.rs
│ │ │ │ ├── abi_encode_packed_hash_collision.rs
│ │ │ │ ├── arbitrary_transfer_from.rs
│ │ │ │ ├── const_func_changes_state.rs
│ │ │ │ ├── contract_locks_ether.rs
│ │ │ │ ├── dangerous_unary_operator.rs
│ │ │ │ ├── delegate_call_unchecked_address.rs
│ │ │ │ ├── delete_nested_mapping.rs
│ │ │ │ ├── dynamic_array_length_assignment.rs
│ │ │ │ ├── enumerable_loop_removal.rs
│ │ │ │ ├── eth_send_unchecked_address.rs
│ │ │ │ ├── experimental_encoder.rs
│ │ │ │ ├── function_selector_collision.rs
│ │ │ │ ├── incorrect_caret_operator.rs
│ │ │ │ ├── incorrect_erc20_interface.rs
│ │ │ │ ├── incorrect_erc721_interface.rs
│ │ │ │ ├── incorrect_shift_order.rs
│ │ │ │ ├── misused_boolean.rs
│ │ │ │ ├── msg_value_in_loops.rs
│ │ │ │ ├── multiple_constructors.rs
│ │ │ │ ├── nested_struct_in_mapping.rs
│ │ │ │ ├── out_of_order_retryable.rs
│ │ │ │ ├── pre_declared_variable_usage.rs
│ │ │ │ ├── reentrancy_state_change.rs
│ │ │ │ ├── reused_contract_name.rs
│ │ │ │ ├── rtlo.rs
│ │ │ │ ├── selfdestruct.rs
│ │ │ │ ├── signed_integer_storage_array.rs
│ │ │ │ ├── state_variable_shadowing.rs
│ │ │ │ ├── storage_array_memory_edit.rs
│ │ │ │ ├── strict_equality_contract_balance.rs
│ │ │ │ ├── tautological_compare.rs
│ │ │ │ ├── tautology_or_contradiction.rs
│ │ │ │ ├── tx_origin_used_for_auth.rs
│ │ │ │ ├── unchecked_low_level_call.rs
│ │ │ │ ├── unchecked_send.rs
│ │ │ │ ├── unprotected_initializer.rs
│ │ │ │ ├── unsafe_casting.rs
│ │ │ │ ├── weak_randomness.rs
│ │ │ │ └── yul_return.rs
│ │ │ ├── high.rs
│ │ │ ├── low
│ │ │ │ ├── _template.rs
│ │ │ │ ├── assert_state_change.rs
│ │ │ │ ├── block_timestamp_deadline.rs
│ │ │ │ ├── boolean_equality.rs
│ │ │ │ ├── builtin_symbol_shadowing.rs
│ │ │ │ ├── centralization_risk.rs
│ │ │ │ ├── constant_function_contains_assembly.rs
│ │ │ │ ├── costly_loop.rs
│ │ │ │ ├── dead_code.rs
│ │ │ │ ├── delegatecall_in_loop.rs
│ │ │ │ ├── deprecated_oz_function.rs
│ │ │ │ ├── division_before_multiplication.rs
│ │ │ │ ├── ecrecover.rs
│ │ │ │ ├── empty_block.rs
│ │ │ │ ├── empty_require_revert.rs
│ │ │ │ ├── function_initializing_state.rs
│ │ │ │ ├── function_pointer_in_constructor.rs
│ │ │ │ ├── inconsistent_type_names.rs
│ │ │ │ ├── incorrect_modifier.rs
│ │ │ │ ├── internal_function_used_once.rs
│ │ │ │ ├── large_numeric_literal.rs
│ │ │ │ ├── literal_instead_of_constant.rs
│ │ │ │ ├── local_variable_shadowing.rs
│ │ │ │ ├── missing_inheritance.rs
│ │ │ │ ├── modifier_used_only_once.rs
│ │ │ │ ├── multiple_placeholders.rs
│ │ │ │ ├── non_reentrant_not_first.rs
│ │ │ │ ├── push_0_opcode.rs
│ │ │ │ ├── redundant_statement.rs
│ │ │ │ ├── require_revert_in_loop.rs
│ │ │ │ ├── return_bomb.rs
│ │ │ │ ├── solmate_safe_transfer_lib.rs
│ │ │ │ ├── state_change_without_event.rs
│ │ │ │ ├── state_no_address_check.rs
│ │ │ │ ├── state_variable_could_be_constant.rs
│ │ │ │ ├── state_variable_could_be_immutable.rs
│ │ │ │ ├── state_variable_read_external.rs
│ │ │ │ ├── storage_array_length_not_cached.rs
│ │ │ │ ├── todo.rs
│ │ │ │ ├── unchecked_return.rs
│ │ │ │ ├── uninitialized_local_variable.rs
│ │ │ │ ├── unsafe_erc20_operation.rs
│ │ │ │ ├── unsafe_oz_erc721_mint.rs
│ │ │ │ ├── unspecific_solidity_pragma.rs
│ │ │ │ ├── unused_error.rs
│ │ │ │ ├── unused_import.rs
│ │ │ │ ├── unused_public_function.rs
│ │ │ │ ├── unused_state_variable.rs
│ │ │ │ └── void_constructor.rs
│ │ │ ├── low.rs
│ │ │ └── test_utils.rs
│ │ ├── detect.rs
│ │ ├── lib.rs
│ │ ├── stats
│ │ │ ├── cloc.rs
│ │ │ ├── dbg_tips.txt
│ │ │ ├── ignore.rs
│ │ │ ├── token.rs
│ │ │ └── util.rs
│ │ ├── stats.rs
│ │ ├── test_utils
│ │ │ └── load_source_unit.rs
│ │ ├── test_utils.rs
│ │ ├── visitor
│ │ │ ├── ast_visitor.rs
│ │ │ ├── macros.rs
│ │ │ └── workspace_visitor.rs
│ │ └── visitor.rs
│ ├── templates
│ │ └── mcp-tool-response
│ │ ├── callgraph.md
│ │ ├── contract_surface.md
│ │ ├── list_contracts.md
│ │ ├── node_finder_get_all.md
│ │ ├── node_finder_grep.md
│ │ ├── node_finder_search.md
│ │ ├── node_summarizer.md
│ │ ├── project_overview.md
│ │ └── tool_guide.md
│ └── tests
│ ├── common
│ │ ├── ancestral_line.rs
│ │ ├── closest_ancestor.rs
│ │ ├── immediate_children.rs
│ │ ├── immediate_parent.rs
│ │ ├── mod.rs
│ │ ├── new_ast_nodes.rs
│ │ ├── peek_over.rs
│ │ └── sibling.rs
│ └── traversal.rs
├── aderyn_driver
│ ├── .gitignore
│ ├── benches
│ │ └── detectors.rs
│ ├── Cargo.toml
│ ├── README.md
│ ├── src
│ │ ├── compile.rs
│ │ ├── config.rs
│ │ ├── display.rs
│ │ ├── driver.rs
│ │ ├── interface
│ │ │ ├── json.rs
│ │ │ ├── lsp.rs
│ │ │ ├── markdown.rs
│ │ │ ├── mod.rs
│ │ │ ├── sarif.rs
│ │ │ ├── tables.rs
│ │ │ └── util.rs
│ │ ├── lib.rs
│ │ ├── mcp.rs
│ │ ├── process.rs
│ │ └── runner.rs
│ └── tests
│ └── astgen.rs
├── bacon.toml
├── benchmarks
│ ├── aderyn
│ │ ├── base
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ ├── change
│ │ │ └── estimates.json
│ │ ├── new
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ └── report
│ │ ├── both
│ │ │ ├── iteration_times.svg
│ │ │ └── pdf.svg
│ │ ├── change
│ │ │ ├── mean.svg
│ │ │ ├── median.svg
│ │ │ └── t-test.svg
│ │ ├── index.html
│ │ ├── iteration_times_small.svg
│ │ ├── iteration_times.svg
│ │ ├── MAD.svg
│ │ ├── mean.svg
│ │ ├── median.svg
│ │ ├── pdf_small.svg
│ │ ├── pdf.svg
│ │ ├── relative_iteration_times_small.svg
│ │ ├── relative_pdf_small.svg
│ │ ├── SD.svg
│ │ └── typical.svg
│ ├── arbitrary-transfer-from
│ │ ├── base
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ ├── change
│ │ │ └── estimates.json
│ │ ├── new
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ └── report
│ │ ├── both
│ │ │ ├── pdf.svg
│ │ │ └── regression.svg
│ │ ├── change
│ │ │ ├── mean.svg
│ │ │ ├── median.svg
│ │ │ └── t-test.svg
│ │ ├── index.html
│ │ ├── MAD.svg
│ │ ├── mean.svg
│ │ ├── median.svg
│ │ ├── pdf_small.svg
│ │ ├── pdf.svg
│ │ ├── regression_small.svg
│ │ ├── regression.svg
│ │ ├── relative_pdf_small.svg
│ │ ├── relative_regression_small.svg
│ │ ├── SD.svg
│ │ ├── slope.svg
│ │ └── typical.svg
│ ├── avoid-abi-encode-packed
│ │ ├── base
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ ├── change
│ │ │ └── estimates.json
│ │ ├── new
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ └── report
│ │ ├── both
│ │ │ ├── pdf.svg
│ │ │ └── regression.svg
│ │ ├── change
│ │ │ ├── mean.svg
│ │ │ ├── median.svg
│ │ │ └── t-test.svg
│ │ ├── index.html
│ │ ├── MAD.svg
│ │ ├── mean.svg
│ │ ├── median.svg
│ │ ├── pdf_small.svg
│ │ ├── pdf.svg
│ │ ├── regression_small.svg
│ │ ├── regression.svg
│ │ ├── relative_pdf_small.svg
│ │ ├── relative_regression_small.svg
│ │ ├── SD.svg
│ │ ├── slope.svg
│ │ └── typical.svg
│ ├── block-timestamp-deadline
│ │ ├── base
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ ├── change
│ │ │ └── estimates.json
│ │ ├── new
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ └── report
│ │ ├── both
│ │ │ ├── pdf.svg
│ │ │ └── regression.svg
│ │ ├── change
│ │ │ ├── mean.svg
│ │ │ ├── median.svg
│ │ │ └── t-test.svg
│ │ ├── index.html
│ │ ├── MAD.svg
│ │ ├── mean.svg
│ │ ├── median.svg
│ │ ├── pdf_small.svg
│ │ ├── pdf.svg
│ │ ├── regression_small.svg
│ │ ├── regression.svg
│ │ ├── relative_pdf_small.svg
│ │ ├── relative_regression_small.svg
│ │ ├── SD.svg
│ │ ├── slope.svg
│ │ └── typical.svg
│ ├── centralization-risk
│ │ ├── base
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ ├── change
│ │ │ └── estimates.json
│ │ ├── new
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ └── report
│ │ ├── both
│ │ │ ├── pdf.svg
│ │ │ └── regression.svg
│ │ ├── change
│ │ │ ├── mean.svg
│ │ │ ├── median.svg
│ │ │ └── t-test.svg
│ │ ├── index.html
│ │ ├── MAD.svg
│ │ ├── mean.svg
│ │ ├── median.svg
│ │ ├── pdf_small.svg
│ │ ├── pdf.svg
│ │ ├── regression_small.svg
│ │ ├── regression.svg
│ │ ├── relative_pdf_small.svg
│ │ ├── relative_regression_small.svg
│ │ ├── SD.svg
│ │ ├── slope.svg
│ │ └── typical.svg
│ ├── constants-instead-of-literals
│ │ ├── base
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ ├── change
│ │ │ └── estimates.json
│ │ ├── new
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ └── report
│ │ ├── both
│ │ │ ├── pdf.svg
│ │ │ └── regression.svg
│ │ ├── change
│ │ │ ├── mean.svg
│ │ │ ├── median.svg
│ │ │ └── t-test.svg
│ │ ├── index.html
│ │ ├── MAD.svg
│ │ ├── mean.svg
│ │ ├── median.svg
│ │ ├── pdf_small.svg
│ │ ├── pdf.svg
│ │ ├── regression_small.svg
│ │ ├── regression.svg
│ │ ├── relative_pdf_small.svg
│ │ ├── relative_regression_small.svg
│ │ ├── SD.svg
│ │ ├── slope.svg
│ │ └── typical.svg
│ ├── delegate-call-in-loop
│ │ ├── base
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ ├── change
│ │ │ └── estimates.json
│ │ ├── new
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ └── report
│ │ ├── both
│ │ │ ├── pdf.svg
│ │ │ └── regression.svg
│ │ ├── change
│ │ │ ├── mean.svg
│ │ │ ├── median.svg
│ │ │ └── t-test.svg
│ │ ├── index.html
│ │ ├── MAD.svg
│ │ ├── mean.svg
│ │ ├── median.svg
│ │ ├── pdf_small.svg
│ │ ├── pdf.svg
│ │ ├── regression_small.svg
│ │ ├── regression.svg
│ │ ├── relative_pdf_small.svg
│ │ ├── relative_regression_small.svg
│ │ ├── SD.svg
│ │ ├── slope.svg
│ │ └── typical.svg
│ ├── deprecated-oz-functions
│ │ ├── base
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ ├── change
│ │ │ └── estimates.json
│ │ ├── new
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ └── report
│ │ ├── both
│ │ │ ├── pdf.svg
│ │ │ └── regression.svg
│ │ ├── change
│ │ │ ├── mean.svg
│ │ │ ├── median.svg
│ │ │ └── t-test.svg
│ │ ├── index.html
│ │ ├── MAD.svg
│ │ ├── mean.svg
│ │ ├── median.svg
│ │ ├── pdf_small.svg
│ │ ├── pdf.svg
│ │ ├── regression_small.svg
│ │ ├── regression.svg
│ │ ├── relative_pdf_small.svg
│ │ ├── relative_regression_small.svg
│ │ ├── SD.svg
│ │ ├── slope.svg
│ │ └── typical.svg
│ ├── ecrecover
│ │ ├── base
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ ├── change
│ │ │ └── estimates.json
│ │ ├── new
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ └── report
│ │ ├── both
│ │ │ ├── pdf.svg
│ │ │ └── regression.svg
│ │ ├── change
│ │ │ ├── mean.svg
│ │ │ ├── median.svg
│ │ │ └── t-test.svg
│ │ ├── index.html
│ │ ├── MAD.svg
│ │ ├── mean.svg
│ │ ├── median.svg
│ │ ├── pdf_small.svg
│ │ ├── pdf.svg
│ │ ├── regression_small.svg
│ │ ├── regression.svg
│ │ ├── relative_pdf_small.svg
│ │ ├── relative_regression_small.svg
│ │ ├── SD.svg
│ │ ├── slope.svg
│ │ └── typical.svg
│ ├── empty-block
│ │ ├── base
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ ├── change
│ │ │ └── estimates.json
│ │ ├── new
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ └── report
│ │ ├── both
│ │ │ ├── pdf.svg
│ │ │ └── regression.svg
│ │ ├── change
│ │ │ ├── mean.svg
│ │ │ ├── median.svg
│ │ │ └── t-test.svg
│ │ ├── index.html
│ │ ├── MAD.svg
│ │ ├── mean.svg
│ │ ├── median.svg
│ │ ├── pdf_small.svg
│ │ ├── pdf.svg
│ │ ├── regression_small.svg
│ │ ├── regression.svg
│ │ ├── relative_pdf_small.svg
│ │ ├── relative_regression_small.svg
│ │ ├── SD.svg
│ │ ├── slope.svg
│ │ └── typical.svg
│ ├── hello_world
│ │ ├── base
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ ├── new
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ └── report
│ │ ├── index.html
│ │ ├── MAD.svg
│ │ ├── mean.svg
│ │ ├── median.svg
│ │ ├── pdf_small.svg
│ │ ├── pdf.svg
│ │ ├── regression_small.svg
│ │ ├── regression.svg
│ │ ├── SD.svg
│ │ ├── slope.svg
│ │ └── typical.svg
│ ├── inconsistent-type-names
│ │ ├── base
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ ├── change
│ │ │ └── estimates.json
│ │ ├── new
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ └── report
│ │ ├── both
│ │ │ ├── pdf.svg
│ │ │ └── regression.svg
│ │ ├── change
│ │ │ ├── mean.svg
│ │ │ ├── median.svg
│ │ │ └── t-test.svg
│ │ ├── index.html
│ │ ├── MAD.svg
│ │ ├── mean.svg
│ │ ├── median.svg
│ │ ├── pdf_small.svg
│ │ ├── pdf.svg
│ │ ├── regression_small.svg
│ │ ├── regression.svg
│ │ ├── relative_pdf_small.svg
│ │ ├── relative_regression_small.svg
│ │ ├── SD.svg
│ │ ├── slope.svg
│ │ └── typical.svg
│ ├── large-numeric-literal
│ │ ├── base
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ ├── change
│ │ │ └── estimates.json
│ │ ├── new
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ └── report
│ │ ├── both
│ │ │ ├── pdf.svg
│ │ │ └── regression.svg
│ │ ├── change
│ │ │ ├── mean.svg
│ │ │ ├── median.svg
│ │ │ └── t-test.svg
│ │ ├── index.html
│ │ ├── MAD.svg
│ │ ├── mean.svg
│ │ ├── median.svg
│ │ ├── pdf_small.svg
│ │ ├── pdf.svg
│ │ ├── regression_small.svg
│ │ ├── regression.svg
│ │ ├── relative_pdf_small.svg
│ │ ├── relative_regression_small.svg
│ │ ├── SD.svg
│ │ ├── slope.svg
│ │ └── typical.svg
│ ├── non-reentrant-before-others
│ │ ├── base
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ ├── change
│ │ │ └── estimates.json
│ │ ├── new
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ └── report
│ │ ├── both
│ │ │ ├── pdf.svg
│ │ │ └── regression.svg
│ │ ├── change
│ │ │ ├── mean.svg
│ │ │ ├── median.svg
│ │ │ └── t-test.svg
│ │ ├── index.html
│ │ ├── MAD.svg
│ │ ├── mean.svg
│ │ ├── median.svg
│ │ ├── pdf_small.svg
│ │ ├── pdf.svg
│ │ ├── regression_small.svg
│ │ ├── regression.svg
│ │ ├── relative_pdf_small.svg
│ │ ├── relative_regression_small.svg
│ │ ├── SD.svg
│ │ ├── slope.svg
│ │ └── typical.svg
│ ├── push-zero-opcode
│ │ ├── base
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ ├── change
│ │ │ └── estimates.json
│ │ ├── new
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ └── report
│ │ ├── both
│ │ │ ├── pdf.svg
│ │ │ └── regression.svg
│ │ ├── change
│ │ │ ├── mean.svg
│ │ │ ├── median.svg
│ │ │ └── t-test.svg
│ │ ├── index.html
│ │ ├── MAD.svg
│ │ ├── mean.svg
│ │ ├── median.svg
│ │ ├── pdf_small.svg
│ │ ├── pdf.svg
│ │ ├── regression_small.svg
│ │ ├── regression.svg
│ │ ├── relative_pdf_small.svg
│ │ ├── relative_regression_small.svg
│ │ ├── SD.svg
│ │ ├── slope.svg
│ │ └── typical.svg
│ ├── report
│ │ └── index.html
│ ├── require-with-string
│ │ ├── base
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ ├── change
│ │ │ └── estimates.json
│ │ ├── new
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ └── report
│ │ ├── both
│ │ │ ├── pdf.svg
│ │ │ └── regression.svg
│ │ ├── change
│ │ │ ├── mean.svg
│ │ │ ├── median.svg
│ │ │ └── t-test.svg
│ │ ├── index.html
│ │ ├── MAD.svg
│ │ ├── mean.svg
│ │ ├── median.svg
│ │ ├── pdf_small.svg
│ │ ├── pdf.svg
│ │ ├── regression_small.svg
│ │ ├── regression.svg
│ │ ├── relative_pdf_small.svg
│ │ ├── relative_regression_small.svg
│ │ ├── SD.svg
│ │ ├── slope.svg
│ │ └── typical.svg
│ ├── solmate-safe-transfer-lib
│ │ ├── base
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ ├── change
│ │ │ └── estimates.json
│ │ ├── new
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ └── report
│ │ ├── both
│ │ │ ├── pdf.svg
│ │ │ └── regression.svg
│ │ ├── change
│ │ │ ├── mean.svg
│ │ │ ├── median.svg
│ │ │ └── t-test.svg
│ │ ├── index.html
│ │ ├── MAD.svg
│ │ ├── mean.svg
│ │ ├── median.svg
│ │ ├── pdf_small.svg
│ │ ├── pdf.svg
│ │ ├── regression_small.svg
│ │ ├── regression.svg
│ │ ├── relative_pdf_small.svg
│ │ ├── relative_regression_small.svg
│ │ ├── SD.svg
│ │ ├── slope.svg
│ │ └── typical.svg
│ ├── unindexed-events
│ │ ├── base
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ ├── change
│ │ │ └── estimates.json
│ │ ├── new
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ └── report
│ │ ├── both
│ │ │ ├── pdf.svg
│ │ │ └── regression.svg
│ │ ├── change
│ │ │ ├── mean.svg
│ │ │ ├── median.svg
│ │ │ └── t-test.svg
│ │ ├── index.html
│ │ ├── MAD.svg
│ │ ├── mean.svg
│ │ ├── median.svg
│ │ ├── pdf_small.svg
│ │ ├── pdf.svg
│ │ ├── regression_small.svg
│ │ ├── regression.svg
│ │ ├── relative_pdf_small.svg
│ │ ├── relative_regression_small.svg
│ │ ├── SD.svg
│ │ ├── slope.svg
│ │ └── typical.svg
│ ├── unprotected-initializer
│ │ ├── base
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ ├── change
│ │ │ └── estimates.json
│ │ ├── new
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ └── report
│ │ ├── both
│ │ │ ├── pdf.svg
│ │ │ └── regression.svg
│ │ ├── change
│ │ │ ├── mean.svg
│ │ │ ├── median.svg
│ │ │ └── t-test.svg
│ │ ├── index.html
│ │ ├── MAD.svg
│ │ ├── mean.svg
│ │ ├── median.svg
│ │ ├── pdf_small.svg
│ │ ├── pdf.svg
│ │ ├── regression_small.svg
│ │ ├── regression.svg
│ │ ├── relative_pdf_small.svg
│ │ ├── relative_regression_small.svg
│ │ ├── SD.svg
│ │ ├── slope.svg
│ │ └── typical.svg
│ ├── unsafe-erc20-functions
│ │ ├── base
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ ├── change
│ │ │ └── estimates.json
│ │ ├── new
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ └── report
│ │ ├── both
│ │ │ ├── pdf.svg
│ │ │ └── regression.svg
│ │ ├── change
│ │ │ ├── mean.svg
│ │ │ ├── median.svg
│ │ │ └── t-test.svg
│ │ ├── index.html
│ │ ├── MAD.svg
│ │ ├── mean.svg
│ │ ├── median.svg
│ │ ├── pdf_small.svg
│ │ ├── pdf.svg
│ │ ├── regression_small.svg
│ │ ├── regression.svg
│ │ ├── relative_pdf_small.svg
│ │ ├── relative_regression_small.svg
│ │ ├── SD.svg
│ │ ├── slope.svg
│ │ └── typical.svg
│ ├── unsafe-oz-erc721-mint
│ │ ├── base
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ ├── change
│ │ │ └── estimates.json
│ │ ├── new
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ └── report
│ │ ├── both
│ │ │ ├── pdf.svg
│ │ │ └── regression.svg
│ │ ├── change
│ │ │ ├── mean.svg
│ │ │ ├── median.svg
│ │ │ └── t-test.svg
│ │ ├── index.html
│ │ ├── MAD.svg
│ │ ├── mean.svg
│ │ ├── median.svg
│ │ ├── pdf_small.svg
│ │ ├── pdf.svg
│ │ ├── regression_small.svg
│ │ ├── regression.svg
│ │ ├── relative_pdf_small.svg
│ │ ├── relative_regression_small.svg
│ │ ├── SD.svg
│ │ ├── slope.svg
│ │ └── typical.svg
│ ├── unspecific-solidity-pragma
│ │ ├── base
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ ├── change
│ │ │ └── estimates.json
│ │ ├── new
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ └── report
│ │ ├── both
│ │ │ ├── pdf.svg
│ │ │ └── regression.svg
│ │ ├── change
│ │ │ ├── mean.svg
│ │ │ ├── median.svg
│ │ │ └── t-test.svg
│ │ ├── index.html
│ │ ├── MAD.svg
│ │ ├── mean.svg
│ │ ├── median.svg
│ │ ├── pdf_small.svg
│ │ ├── pdf.svg
│ │ ├── regression_small.svg
│ │ ├── regression.svg
│ │ ├── relative_pdf_small.svg
│ │ ├── relative_regression_small.svg
│ │ ├── SD.svg
│ │ ├── slope.svg
│ │ └── typical.svg
│ ├── useless-internal-function
│ │ ├── base
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ ├── change
│ │ │ └── estimates.json
│ │ ├── new
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ └── report
│ │ ├── both
│ │ │ ├── pdf.svg
│ │ │ └── regression.svg
│ │ ├── change
│ │ │ ├── mean.svg
│ │ │ ├── median.svg
│ │ │ └── t-test.svg
│ │ ├── index.html
│ │ ├── MAD.svg
│ │ ├── mean.svg
│ │ ├── median.svg
│ │ ├── pdf_small.svg
│ │ ├── pdf.svg
│ │ ├── regression_small.svg
│ │ ├── regression.svg
│ │ ├── relative_pdf_small.svg
│ │ ├── relative_regression_small.svg
│ │ ├── SD.svg
│ │ ├── slope.svg
│ │ └── typical.svg
│ ├── useless-modifier
│ │ ├── base
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ ├── change
│ │ │ └── estimates.json
│ │ ├── new
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ └── report
│ │ ├── both
│ │ │ ├── pdf.svg
│ │ │ └── regression.svg
│ │ ├── change
│ │ │ ├── mean.svg
│ │ │ ├── median.svg
│ │ │ └── t-test.svg
│ │ ├── index.html
│ │ ├── MAD.svg
│ │ ├── mean.svg
│ │ ├── median.svg
│ │ ├── pdf_small.svg
│ │ ├── pdf.svg
│ │ ├── regression_small.svg
│ │ ├── regression.svg
│ │ ├── relative_pdf_small.svg
│ │ ├── relative_regression_small.svg
│ │ ├── SD.svg
│ │ ├── slope.svg
│ │ └── typical.svg
│ ├── useless-public-function
│ │ ├── base
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ ├── change
│ │ │ └── estimates.json
│ │ ├── new
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ └── report
│ │ ├── both
│ │ │ ├── pdf.svg
│ │ │ └── regression.svg
│ │ ├── change
│ │ │ ├── mean.svg
│ │ │ ├── median.svg
│ │ │ └── t-test.svg
│ │ ├── index.html
│ │ ├── MAD.svg
│ │ ├── mean.svg
│ │ ├── median.svg
│ │ ├── pdf_small.svg
│ │ ├── pdf.svg
│ │ ├── regression_small.svg
│ │ ├── regression.svg
│ │ ├── relative_pdf_small.svg
│ │ ├── relative_regression_small.svg
│ │ ├── SD.svg
│ │ ├── slope.svg
│ │ └── typical.svg
│ └── zero-address-check
│ ├── base
│ │ ├── benchmark.json
│ │ ├── estimates.json
│ │ ├── sample.json
│ │ └── tukey.json
│ ├── change
│ │ └── estimates.json
│ ├── new
│ │ ├── benchmark.json
│ │ ├── estimates.json
│ │ ├── sample.json
│ │ └── tukey.json
│ └── report
│ ├── both
│ │ ├── pdf.svg
│ │ └── regression.svg
│ ├── change
│ │ ├── mean.svg
│ │ ├── median.svg
│ │ └── t-test.svg
│ ├── index.html
│ ├── MAD.svg
│ ├── mean.svg
│ ├── median.svg
│ ├── pdf_small.svg
│ ├── pdf.svg
│ ├── regression_small.svg
│ ├── regression.svg
│ ├── relative_pdf_small.svg
│ ├── relative_regression_small.svg
│ ├── SD.svg
│ ├── slope.svg
│ └── typical.svg
├── Cargo.lock
├── Cargo.toml
├── cli
│ ├── benchmarks.sh
│ └── reportgen.sh
├── CODEOWNERS
├── CONTRIBUTING.md
├── cyfrinup
│ ├── dynamic_script
│ └── why.md
├── deny.toml
├── dist-workspace.toml
├── funding.json
├── LICENSE
├── Makefile
├── package-lock.json
├── package.json
├── README.md
├── RELEASE_CHECKLIST.md
├── reports
│ ├── adhoc-sol-files-highs-only-report.json
│ ├── adhoc-sol-files-report.md
│ ├── ccip-functions-report.md
│ ├── empty_report.md
│ ├── hardhat-playground-report.md
│ ├── nft-report-icm.md
│ ├── nft-report.md
│ ├── prb-math-report.md
│ ├── report.json
│ ├── report.md
│ ├── report.sarif
│ ├── sablier-aderyn-toml-nested-root.md
│ ├── templegold-report.md
│ └── uniswap_profile.md
├── rust-toolchain.toml
├── rustfmt.toml
├── tests
│ ├── adhoc-sol-files
│ │ ├── aderyn.toml
│ │ ├── Counter.sol
│ │ ├── DemoASTNodes.sol
│ │ ├── Helper.sol
│ │ ├── InconsistentUints.sol
│ │ ├── inheritance
│ │ │ ├── ExtendedInheritance.sol
│ │ │ ├── IContractInheritance.sol
│ │ │ └── InheritanceBase.sol
│ │ ├── InternalFunctions.sol
│ │ ├── lib
│ │ │ └── ThisShouldBeExcluded.sol
│ │ ├── multiple-versions
│ │ │ ├── 0.4
│ │ │ │ ├── A.sol
│ │ │ │ └── B.sol
│ │ │ ├── 0.5
│ │ │ │ ├── A.sol
│ │ │ │ └── B.sol
│ │ │ ├── 0.6
│ │ │ │ ├── A.sol
│ │ │ │ └── B.sol
│ │ │ ├── 0.7
│ │ │ │ ├── A.sol
│ │ │ │ └── B.sol
│ │ │ └── 0.8
│ │ │ ├── A.sol
│ │ │ └── B.sol
│ │ ├── OnceModifierExample.sol
│ │ └── StateVariables.sol
│ ├── ast
│ │ ├── abstract_contract.json
│ │ ├── address_payable.json
│ │ ├── array_type_name.json
│ │ ├── ast-erc4626.json
│ │ ├── base_constructor_call.json
│ │ ├── bit_not.json
│ │ ├── call.json
│ │ ├── constructor.json
│ │ ├── contract_dep_order.json
│ │ ├── do_while.json
│ │ ├── documentation_1.json
│ │ ├── documentation_2.json
│ │ ├── documentation_3.json
│ │ ├── documentation_local_variable.json
│ │ ├── documentation_on_statements.json
│ │ ├── documentation_triple.json
│ │ ├── empty_block.json
│ │ ├── enum_value_declaration.json
│ │ ├── enum_value.json
│ │ ├── event_definition.json
│ │ ├── experimental_encoder_pragma.json
│ │ ├── fallback_and_reveice_ether.json
│ │ ├── fallback_payable.json
│ │ ├── fallback.json
│ │ ├── function_type.json
│ │ ├── function.json
│ │ ├── global_enum.json
│ │ ├── global_struct.json
│ │ ├── inheritance_specifier.json
│ │ ├── leave.json
│ │ ├── license.json
│ │ ├── long_type_name_binary_operation.json
│ │ ├── long_type_name_identifier.json
│ │ ├── loop.json
│ │ ├── mappings.json
│ │ ├── modifier_definition.json
│ │ ├── modifier_invocation.json
│ │ ├── mutability.json
│ │ ├── nested_functions.json
│ │ ├── non_utf8.json
│ │ ├── override.json
│ │ ├── placeholder_statement.json
│ │ ├── receive_ether.json
│ │ ├── short_type_name_ref.json
│ │ ├── short_type_name.json
│ │ ├── slot_offset.json
│ │ ├── smoke.json
│ │ ├── source_location.json
│ │ ├── string.json
│ │ ├── stringlit.json
│ │ ├── switch_default.json
│ │ ├── switch.json
│ │ ├── try_catch.json
│ │ ├── two_base_functions.json
│ │ ├── unicode.json
│ │ ├── used_errors.json
│ │ ├── userDefinedValueType.json
│ │ ├── using_for_directive.json
│ │ ├── var_access.json
│ │ └── yul_hex_literal.json
│ ├── contract-playground
│ │ ├── .github
│ │ │ └── workflows
│ │ │ └── test.yml
│ │ ├── .gitignore
│ │ ├── dot
│ │ │ └── .gitkeep
│ │ ├── foundry.toml
│ │ ├── README.md
│ │ ├── script
│ │ │ └── Counter.s.sol
│ │ ├── src
│ │ │ ├── AbstractContract.sol
│ │ │ ├── AderynIgnoreCustomDetectors.sol
│ │ │ ├── AdminContract.sol
│ │ │ ├── ArbitraryTransferFrom.sol
│ │ │ ├── AssemblyExample.sol
│ │ │ ├── AssertStateChange.sol
│ │ │ ├── auditor_mode
│ │ │ │ ├── ExternalCalls.sol
│ │ │ │ └── PublicFunctionsWithoutSenderCheck.sol
│ │ │ ├── BooleanEquality.sol
│ │ │ ├── BuiltinSymbolShadow.sol
│ │ │ ├── CacheArrayLength.sol
│ │ │ ├── CallGraphTests.sol
│ │ │ ├── Casting.sol
│ │ │ ├── cloc
│ │ │ │ ├── AnotherHeavilyCommentedContract.sol
│ │ │ │ ├── EmptyContractFile.sol
│ │ │ │ └── HeavilyCommentedContract.sol
│ │ │ ├── CompilerBugStorageSignedIntegerArray.sol
│ │ │ ├── ConstantFuncsAssembly.sol
│ │ │ ├── ConstantsLiterals.sol
│ │ │ ├── ConstFuncChangeState.sol
│ │ │ ├── ContractLocksEther.sol
│ │ │ ├── ContractWithTodo.sol
│ │ │ ├── control_flow
│ │ │ │ └── SimpleProgram.sol
│ │ │ ├── CostlyOperationsInsideLoops.sol
│ │ │ ├── Counter.sol
│ │ │ ├── CrazyPragma.sol
│ │ │ ├── DangerousStrictEquality1.sol
│ │ │ ├── DangerousStrictEquality2.sol
│ │ │ ├── DangerousUnaryOperator.sol
│ │ │ ├── DeadCode.sol
│ │ │ ├── DelegateCallWithoutAddressCheck.sol
│ │ │ ├── DeletionNestedMappingStructureContract.sol
│ │ │ ├── DeprecatedOZFunctions.sol
│ │ │ ├── DivisionBeforeMultiplication.sol
│ │ │ ├── DynamicArrayLengthAssignment.sol
│ │ │ ├── EmitAfterExternalCall.sol
│ │ │ ├── EmptyBlocks.sol
│ │ │ ├── EnumerableSetIteration.sol
│ │ │ ├── eth2
│ │ │ │ └── DepositContract.sol
│ │ │ ├── ExperimentalEncoder.sol
│ │ │ ├── ExternalCalls.sol
│ │ │ ├── FunctionInitializingState.sol
│ │ │ ├── FunctionPointers.sol
│ │ │ ├── FunctionSignatureCollision.sol
│ │ │ ├── HugeConstants.sol
│ │ │ ├── IgnoreEverything.sol
│ │ │ ├── InconsistentUints.sol
│ │ │ ├── IncorrectCaretOperator.sol
│ │ │ ├── IncorrectERC20.sol
│ │ │ ├── IncorrectERC721.sol
│ │ │ ├── IncorrectModifier.sol
│ │ │ ├── IncorrectShift.sol
│ │ │ ├── inheritance
│ │ │ │ ├── ExtendedInheritance.sol
│ │ │ │ ├── IContractInheritance.sol
│ │ │ │ └── InheritanceBase.sol
│ │ │ ├── InternalFunctions.sol
│ │ │ ├── KeccakContract.sol
│ │ │ ├── LocalVariableShadow.sol
│ │ │ ├── MissingInheritance.sol
│ │ │ ├── MisusedBoolean.sol
│ │ │ ├── MsgValueInLoop.sol
│ │ │ ├── MultipleConstructorSchemes.sol
│ │ │ ├── MultiplePlaceholders.sol
│ │ │ ├── nested
│ │ │ │ ├── 1
│ │ │ │ │ └── Nested.sol
│ │ │ │ └── 2
│ │ │ │ └── Nested.sol
│ │ │ ├── nested_mappings
│ │ │ │ ├── LaterVersion.sol
│ │ │ │ └── NestedMappings.sol
│ │ │ ├── OnceModifierExample.sol
│ │ │ ├── OnlyLibrary.sol
│ │ │ ├── OutOfOrderRetryable.sol
│ │ │ ├── parent_chain
│ │ │ │ └── ParentChainContract.sol
│ │ │ ├── PragmaRange.sol
│ │ │ ├── PreDeclaredVarUsage.sol
│ │ │ ├── PublicFunction.sol
│ │ │ ├── PublicVariableReadInExternalContext.sol
│ │ │ ├── RedundantStatements.sol
│ │ │ ├── ReturnBomb.sol
│ │ │ ├── reused_contract_name
│ │ │ │ ├── ContractA.sol
│ │ │ │ └── ContractB.sol
│ │ │ ├── RevertsAndRequriesInLoops.sol
│ │ │ ├── router
│ │ │ │ ├── ExternalCalls.sol
│ │ │ │ ├── FallbackAndReceiveOverrides.sol
│ │ │ │ ├── InternalCalls.sol
│ │ │ │ ├── ModifierCalls.sol
│ │ │ │ └── VarOverridesFunction.sol
│ │ │ ├── RTLO.sol
│ │ │ ├── SendEtherNoChecks.sol
│ │ │ ├── SendEtherNoChecksLibImport.sol
│ │ │ ├── StateChangeAfterExternalCall.sol
│ │ │ ├── StateShadowing.sol
│ │ │ ├── StateVariableCouldBeDeclaredConstant.sol
│ │ │ ├── StateVariableCouldBeDeclaredImmutable.sol
│ │ │ ├── StateVariables.sol
│ │ │ ├── StateVariablesChangesWithoutEvents.sol
│ │ │ ├── StateVariablesManipulation.sol
│ │ │ ├── StorageConditionals.sol
│ │ │ ├── StorageParameters.sol
│ │ │ ├── T11sTranferer.sol
│ │ │ ├── TautologicalCompare.sol
│ │ │ ├── TautologyOrContradiction.sol
│ │ │ ├── TestERC20.sol
│ │ │ ├── TransientKeyword.sol
│ │ │ ├── Trump.sol
│ │ │ ├── TxOriginUsedForAuth.sol
│ │ │ ├── U2.sol
│ │ │ ├── U3.sol
│ │ │ ├── U4.sol
│ │ │ ├── U5.sol
│ │ │ ├── UncheckedCalls.sol
│ │ │ ├── UncheckedReturn.sol
│ │ │ ├── UncheckedSend.sol
│ │ │ ├── UninitializedLocalVariables.sol
│ │ │ ├── UninitializedStateVariable.sol
│ │ │ ├── uniswap
│ │ │ │ ├── UniswapV2Swapper.sol
│ │ │ │ └── UniswapV3Swapper.sol
│ │ │ ├── UnprotectedInitialize.sol
│ │ │ ├── UnsafeERC721Mint.sol
│ │ │ ├── UnusedError.sol
│ │ │ ├── UnusedImport.sol
│ │ │ ├── UnusedStateVariables.sol
│ │ │ ├── UsingSelfdestruct.sol
│ │ │ ├── VoidConstructor.sol
│ │ │ ├── WeakRandomness.sol
│ │ │ ├── WrongOrderOfLayout.sol
│ │ │ ├── YulReturn.sol
│ │ │ └── ZeroAddressCheck.sol
│ │ └── test
│ │ └── Counter.t.sol
│ ├── foundry-nft-f23
│ │ ├── .github
│ │ │ └── workflows
│ │ │ └── test.yml
│ │ ├── .gitignore
│ │ ├── foundry.lock
│ │ ├── foundry.toml
│ │ ├── README.md
│ │ ├── remappings.txt
│ │ └── src
│ │ ├── BasicNft.sol
│ │ ├── F1.sol
│ │ ├── F2.sol
│ │ ├── Initializer.sol
│ │ └── inner-core-modules
│ │ └── ICM.sol
│ ├── foundry-nft-f23-icm
│ │ ├── .github
│ │ │ └── workflows
│ │ │ └── test.yml
│ │ ├── .gitignore
│ │ ├── aderyn.toml
│ │ ├── foundry.toml
│ │ ├── README.md
│ │ ├── remappings.txt
│ │ └── src
│ │ ├── BasicNft.sol
│ │ ├── F1.sol
│ │ ├── F2.sol
│ │ ├── Initializer.sol
│ │ └── inner-core-modules
│ │ └── ICM.sol
│ ├── hardhat-js-playground
│ │ ├── .gitignore
│ │ ├── artifacts
│ │ │ ├── build-info
│ │ │ │ └── cee6fe9a9a2f03f7ff10a27ab2746af6.json
│ │ │ └── contracts
│ │ │ ├── Counter.sol
│ │ │ │ ├── Counter.dbg.json
│ │ │ │ └── Counter.json
│ │ │ ├── ExtendedInheritance.sol
│ │ │ │ ├── ExtendedInheritance.dbg.json
│ │ │ │ └── ExtendedInheritance.json
│ │ │ ├── IContractInheritance.sol
│ │ │ │ ├── IContractInheritance.dbg.json
│ │ │ │ └── IContractInheritance.json
│ │ │ ├── InheritanceBase.sol
│ │ │ │ ├── InheritanceBase.dbg.json
│ │ │ │ └── InheritanceBase.json
│ │ │ ├── KeccakContract.sol
│ │ │ │ ├── KeccakContract.dbg.json
│ │ │ │ └── KeccakContract.json
│ │ │ ├── Lock.sol
│ │ │ │ ├── Lock.dbg.json
│ │ │ │ └── Lock.json
│ │ │ └── StateVariables.sol
│ │ │ ├── StateVariables.dbg.json
│ │ │ └── StateVariables.json
│ │ ├── contracts
│ │ │ ├── Counter.sol
│ │ │ ├── ExtendedInheritance.sol
│ │ │ ├── IContractInheritance.sol
│ │ │ ├── InheritanceBase.sol
│ │ │ ├── KeccakContract.sol
│ │ │ ├── Lock.sol
│ │ │ └── StateVariables.sol
│ │ ├── hardhat.config.js
│ │ ├── package.json
│ │ ├── README.md
│ │ ├── scripts
│ │ │ └── deploy.js
│ │ ├── test
│ │ │ └── Lock.js
│ │ └── yarn.lock
│ ├── no-sol-files
│ │ ├── extra
│ │ │ └── HelloAgain.md
│ │ ├── Hello.txt
│ │ └── Hello.yul
│ └── toml
│ ├── nested_project1
│ │ ├── aderyn.toml
│ │ ├── folder1
│ │ │ └── hardhat.config.ts
│ │ ├── folder2
│ │ │ └── hardhat.config.ts
│ │ └── folder3
│ │ └── file.txt
│ └── nested_project2
│ ├── aderyn.toml
│ ├── folder1
│ │ └── foundry.toml
│ └── folder2
│ └── file1.txt
├── tools
│ └── xtask
│ ├── Cargo.toml
│ └── src
│ ├── blesspr.rs
│ ├── cut_release.rs
│ ├── flags.rs
│ ├── main.rs
│ ├── reportgen.rs
│ └── tomlgen.rs
└── typos.toml
```
# Files
--------------------------------------------------------------------------------
/benchmarks/unspecific-solidity-pragma/base/estimates.json:
--------------------------------------------------------------------------------
```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":16587.094771438966,"upper_bound":16857.32975464398},"point_estimate":16719.532949636607,"standard_error":68.86085825163204},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":16599.775702475148,"upper_bound":17113.219463753725},"point_estimate":16713.92115303983,"standard_error":101.33154228218},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":541.8638457157243,"upper_bound":802.7861053189785},"point_estimate":708.0666648794518,"standard_error":59.06149488983156},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":16089.374554265001,"upper_bound":16303.002270459601},"point_estimate":16187.91407630259,"standard_error":54.516956696773526},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":565.3284790961482,"upper_bound":821.302077321748},"point_estimate":691.3088063746786,"standard_error":66.25367868067993}}
```
--------------------------------------------------------------------------------
/benchmarks/unspecific-solidity-pragma/new/estimates.json:
--------------------------------------------------------------------------------
```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":16587.094771438966,"upper_bound":16857.32975464398},"point_estimate":16719.532949636607,"standard_error":68.86085825163204},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":16599.775702475148,"upper_bound":17113.219463753725},"point_estimate":16713.92115303983,"standard_error":101.33154228218},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":541.8638457157243,"upper_bound":802.7861053189785},"point_estimate":708.0666648794518,"standard_error":59.06149488983156},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":16089.374554265001,"upper_bound":16303.002270459601},"point_estimate":16187.91407630259,"standard_error":54.516956696773526},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":565.3284790961482,"upper_bound":821.302077321748},"point_estimate":691.3088063746786,"standard_error":66.25367868067993}}
```
--------------------------------------------------------------------------------
/benchmarks/arbitrary-transfer-from/base/estimates.json:
--------------------------------------------------------------------------------
```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":60730.4537551632,"upper_bound":62773.80829111178},"point_estimate":61639.571281831384,"standard_error":526.8375943968578},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":60756.724731182796,"upper_bound":62110.36923076923},"point_estimate":61974.48681657849,"standard_error":348.10410555000414},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":1357.0804106828684,"upper_bound":3819.3975480037075},"point_estimate":2417.255023667641,"standard_error":618.421304252327},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":58348.00997297766,"upper_bound":59530.71548877345},"point_estimate":58900.58618294665,"standard_error":302.3527794913396},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":2590.843023460305,"upper_bound":7892.2232144866375},"point_estimate":5291.754217872908,"standard_error":1460.4985574551965}}
```
--------------------------------------------------------------------------------
/benchmarks/arbitrary-transfer-from/new/estimates.json:
--------------------------------------------------------------------------------
```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":60730.4537551632,"upper_bound":62773.80829111178},"point_estimate":61639.571281831384,"standard_error":526.8375943968578},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":60756.724731182796,"upper_bound":62110.36923076923},"point_estimate":61974.48681657849,"standard_error":348.10410555000414},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":1357.0804106828684,"upper_bound":3819.3975480037075},"point_estimate":2417.255023667641,"standard_error":618.421304252327},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":58348.00997297766,"upper_bound":59530.71548877345},"point_estimate":58900.58618294665,"standard_error":302.3527794913396},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":2590.843023460305,"upper_bound":7892.2232144866375},"point_estimate":5291.754217872908,"standard_error":1460.4985574551965}}
```
--------------------------------------------------------------------------------
/benchmarks/unprotected-initializer/base/estimates.json:
--------------------------------------------------------------------------------
```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":32956.51396678968,"upper_bound":33890.64726950043},"point_estimate":33392.94594025474,"standard_error":237.67153378243583},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":32510.2208994709,"upper_bound":33427.144982993195},"point_estimate":32987.31313511757,"standard_error":244.484249430916},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":1114.521205643404,"upper_bound":2103.765838230395},"point_estimate":1543.0277491780398,"standard_error":266.5800423724992},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":32142.605570103566,"upper_bound":33251.40853618999},"point_estimate":32661.521296628598,"standard_error":283.74787120501304},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":1605.7252950223742,"upper_bound":3276.983183487452},"point_estimate":2384.147414048643,"standard_error":476.4075075620204}}
```
--------------------------------------------------------------------------------
/benchmarks/unprotected-initializer/new/estimates.json:
--------------------------------------------------------------------------------
```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":32956.51396678968,"upper_bound":33890.64726950043},"point_estimate":33392.94594025474,"standard_error":237.67153378243583},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":32510.2208994709,"upper_bound":33427.144982993195},"point_estimate":32987.31313511757,"standard_error":244.484249430916},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":1114.521205643404,"upper_bound":2103.765838230395},"point_estimate":1543.0277491780398,"standard_error":266.5800423724992},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":32142.605570103566,"upper_bound":33251.40853618999},"point_estimate":32661.521296628598,"standard_error":283.74787120501304},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":1605.7252950223742,"upper_bound":3276.983183487452},"point_estimate":2384.147414048643,"standard_error":476.4075075620204}}
```
--------------------------------------------------------------------------------
/benchmarks/deprecated-oz-functions/base/estimates.json:
--------------------------------------------------------------------------------
```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":265733.7071161058,"upper_bound":285339.5708761706},"point_estimate":274325.5023694791,"standard_error":5047.357163083142},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":257836.31666666668,"upper_bound":263832.72754329},"point_estimate":261299.82083333333,"standard_error":1665.2589482251567},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":7565.81246255501,"upper_bound":13842.193363114497},"point_estimate":10740.059748868056,"standard_error":1654.9417269018718},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":258894.72927172697,"upper_bound":272760.3983989089},"point_estimate":264763.4113802276,"standard_error":3577.7544561904174},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":21131.15684148712,"upper_bound":74900.87715555987},"point_estimate":50666.13917440051,"standard_error":14113.111864285083}}
```
--------------------------------------------------------------------------------
/benchmarks/deprecated-oz-functions/new/estimates.json:
--------------------------------------------------------------------------------
```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":265733.7071161058,"upper_bound":285339.5708761706},"point_estimate":274325.5023694791,"standard_error":5047.357163083142},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":257836.31666666668,"upper_bound":263832.72754329},"point_estimate":261299.82083333333,"standard_error":1665.2589482251567},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":7565.81246255501,"upper_bound":13842.193363114497},"point_estimate":10740.059748868056,"standard_error":1654.9417269018718},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":258894.72927172697,"upper_bound":272760.3983989089},"point_estimate":264763.4113802276,"standard_error":3577.7544561904174},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":21131.15684148712,"upper_bound":74900.87715555987},"point_estimate":50666.13917440051,"standard_error":14113.111864285083}}
```
--------------------------------------------------------------------------------
/benchmarks/block-timestamp-deadline/base/estimates.json:
--------------------------------------------------------------------------------
```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":279898.45355240104,"upper_bound":285823.50073771604},"point_estimate":282684.0430670172,"standard_error":1513.7558113658854},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":277529.13363387977,"upper_bound":281160.40625},"point_estimate":279193.08004385966,"standard_error":840.9267593947927},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":5879.855868003058,"upper_bound":11737.923160333063},"point_estimate":9470.890235429482,"standard_error":1605.4003220038455},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":280647.06572356925,"upper_bound":289548.7001414823},"point_estimate":284324.2276932171,"standard_error":2355.730168853032},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":10283.026583079984,"upper_bound":19906.354660412526},"point_estimate":15213.622694849431,"standard_error":2511.5840567966434}}
```
--------------------------------------------------------------------------------
/benchmarks/block-timestamp-deadline/new/estimates.json:
--------------------------------------------------------------------------------
```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":279898.45355240104,"upper_bound":285823.50073771604},"point_estimate":282684.0430670172,"standard_error":1513.7558113658854},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":277529.13363387977,"upper_bound":281160.40625},"point_estimate":279193.08004385966,"standard_error":840.9267593947927},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":5879.855868003058,"upper_bound":11737.923160333063},"point_estimate":9470.890235429482,"standard_error":1605.4003220038455},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":280647.06572356925,"upper_bound":289548.7001414823},"point_estimate":284324.2276932171,"standard_error":2355.730168853032},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":10283.026583079984,"upper_bound":19906.354660412526},"point_estimate":15213.622694849431,"standard_error":2511.5840567966434}}
```
--------------------------------------------------------------------------------
/benchmarks/large-numeric-literal/base/estimates.json:
--------------------------------------------------------------------------------
```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":56488.917196728085,"upper_bound":58171.246473140265},"point_estimate":57270.78698503835,"standard_error":431.2787879276012},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":55303.25911764706,"upper_bound":55884.882352941175},"point_estimate":55557.532295271056,"standard_error":173.18479893917683},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":694.3959810142628,"upper_bound":1433.9255386945008},"point_estimate":946.4199589935279,"standard_error":207.21667627339127},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":55607.7777292027,"upper_bound":56669.344514577584},"point_estimate":56087.348573092604,"standard_error":271.3141395564874},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":2842.870964632955,"upper_bound":5642.540377152117},"point_estimate":4330.023714140909,"standard_error":719.601099694424}}
```
--------------------------------------------------------------------------------
/benchmarks/large-numeric-literal/new/estimates.json:
--------------------------------------------------------------------------------
```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":56488.917196728085,"upper_bound":58171.246473140265},"point_estimate":57270.78698503835,"standard_error":431.2787879276012},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":55303.25911764706,"upper_bound":55884.882352941175},"point_estimate":55557.532295271056,"standard_error":173.18479893917683},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":694.3959810142628,"upper_bound":1433.9255386945008},"point_estimate":946.4199589935279,"standard_error":207.21667627339127},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":55607.7777292027,"upper_bound":56669.344514577584},"point_estimate":56087.348573092604,"standard_error":271.3141395564874},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":2842.870964632955,"upper_bound":5642.540377152117},"point_estimate":4330.023714140909,"standard_error":719.601099694424}}
```
--------------------------------------------------------------------------------
/benchmarks/solmate-safe-transfer-lib/base/estimates.json:
--------------------------------------------------------------------------------
```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":3311.6972790343307,"upper_bound":3371.1711894786176},"point_estimate":3338.336430722957,"standard_error":15.221550824220303},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":3297.424758259468,"upper_bound":3328.0568392425466},"point_estimate":3317.0699169153036,"standard_error":7.204354309845005},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":49.50991261878111,"upper_bound":83.61646080249584},"point_estimate":68.05713672844935,"standard_error":8.584128062325856},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":3294.6786228133583,"upper_bound":3343.672495687908},"point_estimate":3316.012264170805,"standard_error":12.624473034876091},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":72.92013570722494,"upper_bound":222.06590434702846},"point_estimate":152.9411402763156,"standard_error":38.5923559202989}}
```
--------------------------------------------------------------------------------
/benchmarks/solmate-safe-transfer-lib/new/estimates.json:
--------------------------------------------------------------------------------
```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":3311.6972790343307,"upper_bound":3371.1711894786176},"point_estimate":3338.336430722957,"standard_error":15.221550824220303},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":3297.424758259468,"upper_bound":3328.0568392425466},"point_estimate":3317.0699169153036,"standard_error":7.204354309845005},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":49.50991261878111,"upper_bound":83.61646080249584},"point_estimate":68.05713672844935,"standard_error":8.584128062325856},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":3294.6786228133583,"upper_bound":3343.672495687908},"point_estimate":3316.012264170805,"standard_error":12.624473034876091},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":72.92013570722494,"upper_bound":222.06590434702846},"point_estimate":152.9411402763156,"standard_error":38.5923559202989}}
```
--------------------------------------------------------------------------------
/benchmarks/unindexed-events/base/estimates.json:
--------------------------------------------------------------------------------
```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":28379.194772675724,"upper_bound":29003.56567100412},"point_estimate":28669.331910669003,"standard_error":159.37770729092256},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":28184.554466479465,"upper_bound":28400.397054303277},"point_estimate":28322.17613445378,"standard_error":53.48480776694323},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":455.96554006288727,"upper_bound":967.8730328168199},"point_estimate":606.3190873307054,"standard_error":128.0775392708642},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":28444.62474410856,"upper_bound":28766.3127984945},"point_estimate":28600.14350600604,"standard_error":81.91977226539862},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":975.8385045334253,"upper_bound":2142.6094429513673},"point_estimate":1604.2963863149935,"standard_error":298.7682971316091}}
```
--------------------------------------------------------------------------------
/benchmarks/unindexed-events/new/estimates.json:
--------------------------------------------------------------------------------
```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":28379.194772675724,"upper_bound":29003.56567100412},"point_estimate":28669.331910669003,"standard_error":159.37770729092256},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":28184.554466479465,"upper_bound":28400.397054303277},"point_estimate":28322.17613445378,"standard_error":53.48480776694323},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":455.96554006288727,"upper_bound":967.8730328168199},"point_estimate":606.3190873307054,"standard_error":128.0775392708642},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":28444.62474410856,"upper_bound":28766.3127984945},"point_estimate":28600.14350600604,"standard_error":81.91977226539862},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":975.8385045334253,"upper_bound":2142.6094429513673},"point_estimate":1604.2963863149935,"standard_error":298.7682971316091}}
```
--------------------------------------------------------------------------------
/benchmarks/unsafe-erc20-functions/base/estimates.json:
--------------------------------------------------------------------------------
```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":43135.73088684764,"upper_bound":45109.860378657824},"point_estimate":44036.06056347855,"standard_error":504.8607125723059},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":42418.97321428571,"upper_bound":43342.49107323616},"point_estimate":42901.581805098685,"standard_error":221.38919320880007},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":1326.681304915258,"upper_bound":2514.526393202903},"point_estimate":1671.3823009411808,"standard_error":311.0201957876835},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":43742.29214200489,"upper_bound":45370.86500428879},"point_estimate":44481.423454755924,"standard_error":416.3881995461573},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":2910.0601684052267,"upper_bound":6991.039610554622},"point_estimate":5071.395064143015,"standard_error":1055.5158731820607}}
```
--------------------------------------------------------------------------------
/benchmarks/unsafe-erc20-functions/new/estimates.json:
--------------------------------------------------------------------------------
```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":43135.73088684764,"upper_bound":45109.860378657824},"point_estimate":44036.06056347855,"standard_error":504.8607125723059},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":42418.97321428571,"upper_bound":43342.49107323616},"point_estimate":42901.581805098685,"standard_error":221.38919320880007},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":1326.681304915258,"upper_bound":2514.526393202903},"point_estimate":1671.3823009411808,"standard_error":311.0201957876835},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":43742.29214200489,"upper_bound":45370.86500428879},"point_estimate":44481.423454755924,"standard_error":416.3881995461573},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":2910.0601684052267,"upper_bound":6991.039610554622},"point_estimate":5071.395064143015,"standard_error":1055.5158731820607}}
```
--------------------------------------------------------------------------------
/benchmarks/unsafe-oz-erc721-mint/base/estimates.json:
--------------------------------------------------------------------------------
```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":294903.2241787214,"upper_bound":304704.40878046595},"point_estimate":299901.15344844694,"standard_error":2498.3735898628943},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":302074.25925925927,"upper_bound":315405.8788067553},"point_estimate":308509.4277210884,"standard_error":4824.830053910656},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":9061.537996310311,"upper_bound":25855.766858665607},"point_estimate":16607.759640867676,"standard_error":4720.989680383483},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":273383.9910147162,"upper_bound":286168.5667219525},"point_estimate":279288.25096645486,"standard_error":3262.9223347164743},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":21588.461845106016,"upper_bound":27885.08340636392},"point_estimate":25072.090523980274,"standard_error":1603.45582068141}}
```
--------------------------------------------------------------------------------
/benchmarks/unsafe-oz-erc721-mint/new/estimates.json:
--------------------------------------------------------------------------------
```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":294903.2241787214,"upper_bound":304704.40878046595},"point_estimate":299901.15344844694,"standard_error":2498.3735898628943},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":302074.25925925927,"upper_bound":315405.8788067553},"point_estimate":308509.4277210884,"standard_error":4824.830053910656},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":9061.537996310311,"upper_bound":25855.766858665607},"point_estimate":16607.759640867676,"standard_error":4720.989680383483},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":273383.9910147162,"upper_bound":286168.5667219525},"point_estimate":279288.25096645486,"standard_error":3262.9223347164743},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":21588.461845106016,"upper_bound":27885.08340636392},"point_estimate":25072.090523980274,"standard_error":1603.45582068141}}
```
--------------------------------------------------------------------------------
/benchmarks/useless-public-function/base/estimates.json:
--------------------------------------------------------------------------------
```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":463972.07750612614,"upper_bound":475901.6333889815},"point_estimate":469424.9983716089,"standard_error":3056.136343559275},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":456651.3703703704,"upper_bound":464734.3703703704},"point_estimate":460092.26430491556,"standard_error":1991.4633367922931},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":7471.463368198058,"upper_bound":15427.300728383376},"point_estimate":12023.070467108666,"standard_error":2004.2158451496318},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":462496.4287641224,"upper_bound":481940.13991861057},"point_estimate":471348.5915472144,"standard_error":5005.309438766497},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":17939.559263426214,"upper_bound":42545.19884528616},"point_estimate":30771.396782632975,"standard_error":6391.861916178918}}
```
--------------------------------------------------------------------------------
/benchmarks/useless-public-function/new/estimates.json:
--------------------------------------------------------------------------------
```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":463972.07750612614,"upper_bound":475901.6333889815},"point_estimate":469424.9983716089,"standard_error":3056.136343559275},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":456651.3703703704,"upper_bound":464734.3703703704},"point_estimate":460092.26430491556,"standard_error":1991.4633367922931},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":7471.463368198058,"upper_bound":15427.300728383376},"point_estimate":12023.070467108666,"standard_error":2004.2158451496318},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":462496.4287641224,"upper_bound":481940.13991861057},"point_estimate":471348.5915472144,"standard_error":5005.309438766497},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":17939.559263426214,"upper_bound":42545.19884528616},"point_estimate":30771.396782632975,"standard_error":6391.861916178918}}
```
--------------------------------------------------------------------------------
/aderyn_core/src/context/browser/parent.rs:
--------------------------------------------------------------------------------
```rust
use crate::{
ast::*,
context::workspace::{ASTNode, WorkspaceContext},
visitor::ast_visitor::{ASTConstVisitor, Node},
};
pub trait GetImmediateParent {
/// Get the parent Chain of an ASTNode
fn parent<'a>(&self, context: &'a WorkspaceContext) -> Option<&'a ASTNode>;
}
#[derive(Default)]
struct NodeIDReceiver {
id: Option<NodeID>,
}
impl ASTConstVisitor for NodeIDReceiver {
fn visit_node_id(&mut self, node_id: Option<NodeID>) -> eyre::Result<()> {
self.id = node_id;
Ok(())
}
}
impl<T: Node + ?Sized> GetImmediateParent for T {
fn parent<'a>(&self, context: &'a WorkspaceContext) -> Option<&'a ASTNode> {
// Setup a Node ID receiver
let mut node_id_receiver = NodeIDReceiver::default();
// Find the ID of the node this method is called upon
self.accept_id(&mut node_id_receiver).ok()?;
let current_node_id = node_id_receiver.id?;
context.get_parent(current_node_id)
}
}
```
--------------------------------------------------------------------------------
/benchmarks/avoid-abi-encode-packed/base/estimates.json:
--------------------------------------------------------------------------------
```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":14297.596213039305,"upper_bound":14590.72372580063},"point_estimate":14423.671184607407,"standard_error":75.61817271183786},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":14200.590660225444,"upper_bound":14399.774128838813},"point_estimate":14311.262919045526,"standard_error":55.4287088827779},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":253.8930074482189,"upper_bound":369.22510823188844},"point_estimate":336.78359526590634,"standard_error":31.10597964561998},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":14186.068796992065,"upper_bound":14330.386919091428},"point_estimate":14252.957706174251,"standard_error":36.943125097472794},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":298.1699648317815,"upper_bound":1165.36643042032},"point_estimate":759.8137754347297,"standard_error":237.18537163989262}}
```
--------------------------------------------------------------------------------
/benchmarks/avoid-abi-encode-packed/new/estimates.json:
--------------------------------------------------------------------------------
```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":14297.596213039305,"upper_bound":14590.72372580063},"point_estimate":14423.671184607407,"standard_error":75.61817271183786},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":14200.590660225444,"upper_bound":14399.774128838813},"point_estimate":14311.262919045526,"standard_error":55.4287088827779},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":253.8930074482189,"upper_bound":369.22510823188844},"point_estimate":336.78359526590634,"standard_error":31.10597964561998},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":14186.068796992065,"upper_bound":14330.386919091428},"point_estimate":14252.957706174251,"standard_error":36.943125097472794},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":298.1699648317815,"upper_bound":1165.36643042032},"point_estimate":759.8137754347297,"standard_error":237.18537163989262}}
```
--------------------------------------------------------------------------------
/benchmarks/delegate-call-in-loop/base/estimates.json:
--------------------------------------------------------------------------------
```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":11317.531552697299,"upper_bound":11557.55335895296},"point_estimate":11420.820673946073,"standard_error":61.90251254003519},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":11271.866026520347,"upper_bound":11363.6508356429},"point_estimate":11320.046846051288,"standard_error":26.321598517967498},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":139.05976318396694,"upper_bound":280.2788666160328},"point_estimate":192.5370064341102,"standard_error":36.60032637796171},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":11251.171697687723,"upper_bound":11360.875523447947},"point_estimate":11303.283011637814,"standard_error":27.968974887486404},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":283.9041849862997,"upper_bound":947.3560169670028},"point_estimate":619.7119327742987,"standard_error":194.91680457455266}}
```
--------------------------------------------------------------------------------
/benchmarks/delegate-call-in-loop/new/estimates.json:
--------------------------------------------------------------------------------
```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":11317.531552697299,"upper_bound":11557.55335895296},"point_estimate":11420.820673946073,"standard_error":61.90251254003519},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":11271.866026520347,"upper_bound":11363.6508356429},"point_estimate":11320.046846051288,"standard_error":26.321598517967498},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":139.05976318396694,"upper_bound":280.2788666160328},"point_estimate":192.5370064341102,"standard_error":36.60032637796171},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":11251.171697687723,"upper_bound":11360.875523447947},"point_estimate":11303.283011637814,"standard_error":27.968974887486404},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":283.9041849862997,"upper_bound":947.3560169670028},"point_estimate":619.7119327742987,"standard_error":194.91680457455266}}
```
--------------------------------------------------------------------------------
/benchmarks/hello_world/base/estimates.json:
--------------------------------------------------------------------------------
```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":1990.5024672163513,"upper_bound":2041.4207042830833},"point_estimate":2016.1337569972934,"standard_error":13.018202314016898},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":2016.262962962963,"upper_bound":2074.5326052548276},"point_estimate":2054.9008847134983,"standard_error":13.847205922551058},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":70.98977636145113,"upper_bound":141.04349120472418},"point_estimate":93.22178843829728,"standard_error":19.57811530966335},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":2051.565669841538,"upper_bound":2079.909133969329},"point_estimate":2066.890316599377,"standard_error":7.19296191320424},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":106.72562228740786,"upper_bound":152.3868446298647},"point_estimate":130.03476611427345,"standard_error":11.711099024116715}}
```
--------------------------------------------------------------------------------
/benchmarks/hello_world/new/estimates.json:
--------------------------------------------------------------------------------
```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":1990.5024672163513,"upper_bound":2041.4207042830833},"point_estimate":2016.1337569972934,"standard_error":13.018202314016898},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":2016.262962962963,"upper_bound":2074.5326052548276},"point_estimate":2054.9008847134983,"standard_error":13.847205922551058},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":70.98977636145113,"upper_bound":141.04349120472418},"point_estimate":93.22178843829728,"standard_error":19.57811530966335},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":2051.565669841538,"upper_bound":2079.909133969329},"point_estimate":2066.890316599377,"standard_error":7.19296191320424},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":106.72562228740786,"upper_bound":152.3868446298647},"point_estimate":130.03476611427345,"standard_error":11.711099024116715}}
```
--------------------------------------------------------------------------------
/benchmarks/non-reentrant-before-others/base/estimates.json:
--------------------------------------------------------------------------------
```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":3322.5901875259556,"upper_bound":3382.9243872076604},"point_estimate":3351.8070669908925,"standard_error":15.395438731982445},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":3325.803886054422,"upper_bound":3350.3777777777777},"point_estimate":3332.4556463869003,"standard_error":8.822199605080531},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":126.94651365841104,"upper_bound":177.515832873222},"point_estimate":137.51268333788235,"standard_error":12.671807909205786},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":3223.856311342474,"upper_bound":3284.73115833569},"point_estimate":3248.68749900779,"standard_error":15.757958615002043},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":122.36910606348108,"upper_bound":194.6174156811443},"point_estimate":155.70919144510964,"standard_error":19.432280989654892}}
```
--------------------------------------------------------------------------------
/benchmarks/non-reentrant-before-others/new/estimates.json:
--------------------------------------------------------------------------------
```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":3322.5901875259556,"upper_bound":3382.9243872076604},"point_estimate":3351.8070669908925,"standard_error":15.395438731982445},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":3325.803886054422,"upper_bound":3350.3777777777777},"point_estimate":3332.4556463869003,"standard_error":8.822199605080531},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":126.94651365841104,"upper_bound":177.515832873222},"point_estimate":137.51268333788235,"standard_error":12.671807909205786},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":3223.856311342474,"upper_bound":3284.73115833569},"point_estimate":3248.68749900779,"standard_error":15.757958615002043},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":122.36910606348108,"upper_bound":194.6174156811443},"point_estimate":155.70919144510964,"standard_error":19.432280989654892}}
```
--------------------------------------------------------------------------------
/benchmarks/zero-address-check/base/estimates.json:
--------------------------------------------------------------------------------
```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":451995.4420425037,"upper_bound":461634.68251033005},"point_estimate":456440.5390063259,"standard_error":2475.102133375628},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":449300.98148148146,"upper_bound":458732.1446540881},"point_estimate":455347.38947236806,"standard_error":2723.078067242322},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":10086.580192368845,"upper_bound":18491.984752273067},"point_estimate":14327.086477660478,"standard_error":2142.7706290702745},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":441768.682521572,"upper_bound":451386.46928608115},"point_estimate":445693.494827841,"standard_error":2492.9257292673647},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":15212.945298576593,"upper_bound":33120.257635551425},"point_estimate":24845.737973970296,"standard_error":4574.097569937255}}
```
--------------------------------------------------------------------------------
/benchmarks/zero-address-check/new/estimates.json:
--------------------------------------------------------------------------------
```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":451995.4420425037,"upper_bound":461634.68251033005},"point_estimate":456440.5390063259,"standard_error":2475.102133375628},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":449300.98148148146,"upper_bound":458732.1446540881},"point_estimate":455347.38947236806,"standard_error":2723.078067242322},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":10086.580192368845,"upper_bound":18491.984752273067},"point_estimate":14327.086477660478,"standard_error":2142.7706290702745},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":441768.682521572,"upper_bound":451386.46928608115},"point_estimate":445693.494827841,"standard_error":2492.9257292673647},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":15212.945298576593,"upper_bound":33120.257635551425},"point_estimate":24845.737973970296,"standard_error":4574.097569937255}}
```
--------------------------------------------------------------------------------
/benchmarks/centralization-risk/base/estimates.json:
--------------------------------------------------------------------------------
```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":12372.374617854519,"upper_bound":12619.486572524716},"point_estimate":12489.649853276607,"standard_error":63.240928499767314},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":12290.345218348588,"upper_bound":12394.337995337995},"point_estimate":12358.265004748337,"standard_error":26.193443236324235},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":300.9612468565089,"upper_bound":522.8619103271549},"point_estimate":426.53281455309894,"standard_error":58.23177658001444},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":12314.160152802557,"upper_bound":12575.382758805858},"point_estimate":12437.146804666689,"standard_error":66.5564127415918},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":453.2169484515177,"upper_bound":793.9342080363158},"point_estimate":635.9854085086872,"standard_error":87.38389042666547}}
```
--------------------------------------------------------------------------------
/benchmarks/centralization-risk/new/estimates.json:
--------------------------------------------------------------------------------
```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":12372.374617854519,"upper_bound":12619.486572524716},"point_estimate":12489.649853276607,"standard_error":63.240928499767314},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":12290.345218348588,"upper_bound":12394.337995337995},"point_estimate":12358.265004748337,"standard_error":26.193443236324235},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":300.9612468565089,"upper_bound":522.8619103271549},"point_estimate":426.53281455309894,"standard_error":58.23177658001444},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":12314.160152802557,"upper_bound":12575.382758805858},"point_estimate":12437.146804666689,"standard_error":66.5564127415918},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":453.2169484515177,"upper_bound":793.9342080363158},"point_estimate":635.9854085086872,"standard_error":87.38389042666547}}
```
--------------------------------------------------------------------------------
/benchmarks/empty-block/base/estimates.json:
--------------------------------------------------------------------------------
```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":50533.16358888091,"upper_bound":51450.14978755689},"point_estimate":50946.209565332814,"standard_error":234.98335259097047},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":50729.82546196997,"upper_bound":51334.665789473685},"point_estimate":50844.152909526725,"standard_error":163.41421723431705},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":1034.1704880433142,"upper_bound":1905.7715843832787},"point_estimate":1695.360602335409,"standard_error":243.3138392571441},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":49275.203576429274,"upper_bound":49852.45854080629},"point_estimate":49543.87925225358,"standard_error":147.51751609672135},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":1377.4820103403795,"upper_bound":3506.3580874236704},"point_estimate":2376.360430428133,"standard_error":650.7950415698192}}
```
--------------------------------------------------------------------------------
/benchmarks/empty-block/new/estimates.json:
--------------------------------------------------------------------------------
```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":50533.16358888091,"upper_bound":51450.14978755689},"point_estimate":50946.209565332814,"standard_error":234.98335259097047},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":50729.82546196997,"upper_bound":51334.665789473685},"point_estimate":50844.152909526725,"standard_error":163.41421723431705},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":1034.1704880433142,"upper_bound":1905.7715843832787},"point_estimate":1695.360602335409,"standard_error":243.3138392571441},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":49275.203576429274,"upper_bound":49852.45854080629},"point_estimate":49543.87925225358,"standard_error":147.51751609672135},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":1377.4820103403795,"upper_bound":3506.3580874236704},"point_estimate":2376.360430428133,"standard_error":650.7950415698192}}
```
--------------------------------------------------------------------------------
/benchmarks/useless-internal-function/base/estimates.json:
--------------------------------------------------------------------------------
```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":16323.15695839365,"upper_bound":17297.204694680422},"point_estimate":16764.820471726438,"standard_error":250.23893020662274},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":15885.949298241962,"upper_bound":16172.240597878495},"point_estimate":16001.404049076573,"standard_error":62.84183384782749},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":413.44735368144666,"upper_bound":851.5695395196134},"point_estimate":621.2082947934725,"standard_error":113.25508968657967},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":15839.2947516214,"upper_bound":16357.034371950269},"point_estimate":16070.118434156115,"standard_error":132.3748666775448},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":1382.958090353464,"upper_bound":3533.4556810635277},"point_estimate":2516.2695680378306,"standard_error":559.9168779283513}}
```
--------------------------------------------------------------------------------
/benchmarks/useless-internal-function/new/estimates.json:
--------------------------------------------------------------------------------
```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":16323.15695839365,"upper_bound":17297.204694680422},"point_estimate":16764.820471726438,"standard_error":250.23893020662274},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":15885.949298241962,"upper_bound":16172.240597878495},"point_estimate":16001.404049076573,"standard_error":62.84183384782749},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":413.44735368144666,"upper_bound":851.5695395196134},"point_estimate":621.2082947934725,"standard_error":113.25508968657967},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":15839.2947516214,"upper_bound":16357.034371950269},"point_estimate":16070.118434156115,"standard_error":132.3748666775448},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":1382.958090353464,"upper_bound":3533.4556810635277},"point_estimate":2516.2695680378306,"standard_error":559.9168779283513}}
```
--------------------------------------------------------------------------------
/benchmarks/useless-modifier/base/estimates.json:
--------------------------------------------------------------------------------
```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":24890.392985268707,"upper_bound":25376.256507907085},"point_estimate":25115.514275304075,"standard_error":123.88540540202386},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":24918.771750805587,"upper_bound":25299.200657894737},"point_estimate":25070.688624971517,"standard_error":79.88582200010565},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":791.4809423165412,"upper_bound":1217.9365650214322},"point_estimate":1069.7808216325957,"standard_error":88.3933701708139},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":24183.076533337047,"upper_bound":24519.28786642646},"point_estimate":24338.39109276442,"standard_error":85.74327074177101},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":826.0996733526902,"upper_bound":1738.6591832176698},"point_estimate":1244.5965098191525,"standard_error":268.5402379780004}}
```
--------------------------------------------------------------------------------
/benchmarks/useless-modifier/new/estimates.json:
--------------------------------------------------------------------------------
```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":24890.392985268707,"upper_bound":25376.256507907085},"point_estimate":25115.514275304075,"standard_error":123.88540540202386},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":24918.771750805587,"upper_bound":25299.200657894737},"point_estimate":25070.688624971517,"standard_error":79.88582200010565},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":791.4809423165412,"upper_bound":1217.9365650214322},"point_estimate":1069.7808216325957,"standard_error":88.3933701708139},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":24183.076533337047,"upper_bound":24519.28786642646},"point_estimate":24338.39109276442,"standard_error":85.74327074177101},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":826.0996733526902,"upper_bound":1738.6591832176698},"point_estimate":1244.5965098191525,"standard_error":268.5402379780004}}
```
--------------------------------------------------------------------------------
/aderyn_core/src/ast.rs:
--------------------------------------------------------------------------------
```rust
#[allow(clippy::module_inception)]
pub mod ast;
pub mod ast_nodes;
pub mod impls;
pub mod macros;
pub mod magic;
pub mod node_type;
pub mod yul;
pub use self::{impls::*, magic::*, node_type::*, yul::*};
pub use NodeID;
pub use ast::ASTNode;
pub use ast_nodes::*;
#[cfg(test)]
mod tests {
use super::*;
use std::{fs, path::PathBuf};
#[test]
fn can_parse_ast() {
fs::read_dir(PathBuf::from("../tests/ast")).unwrap().for_each(|path| {
let path = path.unwrap().path();
let path_str = path.to_string_lossy();
let input = fs::read_to_string(&path).unwrap();
let result: Result<SourceUnit, _> = serde_json::from_str(&input);
match result {
Err(e) => {
println!("... {path_str} fail: {e}");
panic!();
}
Ok(_) => {
println!("... {path_str} ok");
}
}
})
}
}
```
--------------------------------------------------------------------------------
/benchmarks/constants-instead-of-literals/base/estimates.json:
--------------------------------------------------------------------------------
```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":1401902.449762742,"upper_bound":1448003.7899469824},"point_estimate":1423830.5967314192,"standard_error":11773.749065616623},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":1365183.7078651686,"upper_bound":1413049.6585365853},"point_estimate":1389140.1451612902,"standard_error":10284.598623806376},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":49759.90151879116,"upper_bound":101889.80376694661},"point_estimate":78705.98880958748,"standard_error":12996.527288313679},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":1356109.468468325,"upper_bound":1395929.2580106677},"point_estimate":1375029.6743401804,"standard_error":10141.747681460844},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":87051.80083928232,"upper_bound":145819.9374635297},"point_estimate":118061.82256568909,"standard_error":15073.154898587543}}
```
--------------------------------------------------------------------------------
/benchmarks/constants-instead-of-literals/new/estimates.json:
--------------------------------------------------------------------------------
```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":1401902.449762742,"upper_bound":1448003.7899469824},"point_estimate":1423830.5967314192,"standard_error":11773.749065616623},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":1365183.7078651686,"upper_bound":1413049.6585365853},"point_estimate":1389140.1451612902,"standard_error":10284.598623806376},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":49759.90151879116,"upper_bound":101889.80376694661},"point_estimate":78705.98880958748,"standard_error":12996.527288313679},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":1356109.468468325,"upper_bound":1395929.2580106677},"point_estimate":1375029.6743401804,"standard_error":10141.747681460844},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":87051.80083928232,"upper_bound":145819.9374635297},"point_estimate":118061.82256568909,"standard_error":15073.154898587543}}
```
--------------------------------------------------------------------------------
/benchmarks/require-with-string/base/estimates.json:
--------------------------------------------------------------------------------
```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":28956.949865992745,"upper_bound":30117.413610837426},"point_estimate":29509.890228235443,"standard_error":296.3940361871848},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":28433.689768489457,"upper_bound":29807.52380952381},"point_estimate":29594.924080547113,"standard_error":434.46289629476524},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":2135.777686986213,"upper_bound":3223.606532769543},"point_estimate":2443.3580578978126,"standard_error":316.70331032207014},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":27201.276110624487,"upper_bound":28158.714578203526},"point_estimate":27603.811002132195,"standard_error":246.06182886271637},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":2047.6133958730954,"upper_bound":3800.1738173378676},"point_estimate":2978.1139838090185,"standard_error":441.9733971004103}}
```
--------------------------------------------------------------------------------
/benchmarks/require-with-string/new/estimates.json:
--------------------------------------------------------------------------------
```json
{"mean":{"confidence_interval":{"confidence_level":0.95,"lower_bound":28956.949865992745,"upper_bound":30117.413610837426},"point_estimate":29509.890228235443,"standard_error":296.3940361871848},"median":{"confidence_interval":{"confidence_level":0.95,"lower_bound":28433.689768489457,"upper_bound":29807.52380952381},"point_estimate":29594.924080547113,"standard_error":434.46289629476524},"median_abs_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":2135.777686986213,"upper_bound":3223.606532769543},"point_estimate":2443.3580578978126,"standard_error":316.70331032207014},"slope":{"confidence_interval":{"confidence_level":0.95,"lower_bound":27201.276110624487,"upper_bound":28158.714578203526},"point_estimate":27603.811002132195,"standard_error":246.06182886271637},"std_dev":{"confidence_interval":{"confidence_level":0.95,"lower_bound":2047.6133958730954,"upper_bound":3800.1738173378676},"point_estimate":2978.1139838090185,"standard_error":441.9733971004103}}
```
--------------------------------------------------------------------------------
/aderyn_driver/Cargo.toml:
--------------------------------------------------------------------------------
```toml
[package]
name = "aderyn_driver"
version = "0.6.5"
edition = { workspace = true }
authors = { workspace = true }
description = { workspace = true }
license = { workspace = true }
repository = { workspace = true }
homepage = { workspace = true }
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
aderyn_core = { workspace = true }
rayon = { workspace = true }
serde_json = { workspace = true, features = ["preserve_order"] }
serde = { workspace = true, features = ["derive"] }
serde_repr = { workspace = true }
serde-sarif = { workspace = true }
toml = { workspace = true }
field_access = { workspace = true }
tokio = { workspace = true, features = ["full"] }
tower-lsp = { workspace = true }
dunce = { workspace = true }
prettytable = { workspace = true }
solidity_ast = { workspace = true }
rmcp = { workspace = true }
[lints]
workspace = true
[dev-dependencies]
criterion = { workspace = true }
[[bench]]
name = "detectors"
harness = false
```
--------------------------------------------------------------------------------
/aderyn_core/src/context/browser/ancestral_line.rs:
--------------------------------------------------------------------------------
```rust
use crate::{
ast::*,
context::workspace::{ASTNode, WorkspaceContext},
visitor::ast_visitor::{ASTConstVisitor, Node},
};
pub trait GetAncestralLine {
/// Get the parent Chain of an ASTNode
fn ancestral_line<'a>(&self, context: &'a WorkspaceContext) -> Option<Vec<&'a ASTNode>>;
}
#[derive(Default)]
struct NodeIDReceiver {
id: Option<NodeID>,
}
impl ASTConstVisitor for NodeIDReceiver {
fn visit_node_id(&mut self, node_id: Option<NodeID>) -> eyre::Result<()> {
self.id = node_id;
Ok(())
}
}
impl<T: Node + ?Sized> GetAncestralLine for T {
fn ancestral_line<'a>(&self, context: &'a WorkspaceContext) -> Option<Vec<&'a ASTNode>> {
// Setup a Node ID receiver
let mut node_id_receiver = NodeIDReceiver::default();
// Find the ID of the node this method is called upon
self.accept_id(&mut node_id_receiver).ok()?;
let current_node_id = node_id_receiver.id?;
Some(context.get_ancestral_line(current_node_id))
}
}
```
--------------------------------------------------------------------------------
/tests/ast/array_type_name.json:
--------------------------------------------------------------------------------
```json
{"absolutePath":"a","exportedSymbols":{"C":[4]},"id":5,"nodeType":"SourceUnit","nodes":[{"abstract":false,"baseContracts":[],"canonicalName":"C","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":4,"linearizedBaseContracts":[4],"name":"C","nameLocation":"9:1:1","nodeType":"ContractDefinition","nodes":[{"constant":false,"id":3,"mutability":"mutable","name":"i","nameLocation":"20:1:1","nodeType":"VariableDeclaration","scope":4,"src":"13:8:1","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage","typeString":"uint256[]"},"typeName":{"baseType":{"id":1,"name":"uint","nodeType":"ElementaryTypeName","src":"13:4:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":2,"nodeType":"ArrayTypeName","src":"13:6:1","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"scope":5,"src":"0:24:1","usedErrors":[]}],"src":"0:25:1"}
```
--------------------------------------------------------------------------------
/aderyn_core/src/context/mcp/callgraph/render.rs:
--------------------------------------------------------------------------------
```rust
use askama::Template;
use derive_builder::Builder;
use serde::Serialize;
use crate::{ast::NodeID, context::graph::RawCallGraph};
#[derive(Builder, Serialize, Template)]
#[template(path = "mcp-tool-response/callgraph.md")]
#[builder(pattern = "owned")]
pub struct CallgraphToolResponse {
pub compilation_unit_index: usize,
pub contract: ContractData,
pub entrypoint_function: EntrypointFunctionData,
pub graph: RawCallGraph, /* NOTE: we do not supply the whole callgraph; only the
* subgraph traversed from the entrypoint function */
pub post_order_nodes: Vec<NodeData>,
}
#[derive(Builder, Serialize)]
#[builder(pattern = "owned")]
pub struct ContractData {
pub name: String,
pub node_id: NodeID,
}
#[derive(Builder, Serialize)]
#[builder(pattern = "owned")]
pub struct EntrypointFunctionData {
pub name: String,
pub node_id: NodeID,
}
#[derive(Builder, Serialize)]
#[builder(pattern = "owned")]
pub struct NodeData {
pub name: String,
pub node_id: NodeID,
pub called_nodes: Vec<NodeData>,
}
```
--------------------------------------------------------------------------------
/tests/hardhat-js-playground/scripts/deploy.js:
--------------------------------------------------------------------------------
```javascript
// We require the Hardhat Runtime Environment explicitly here. This is optional
// but useful for running the script in a standalone fashion through `node <script>`.
//
// You can also run a script with `npx hardhat run <script>`. If you do that, Hardhat
// will compile your contracts, add the Hardhat Runtime Environment's members to the
// global scope, and execute the script.
const hre = require("hardhat");
async function main() {
const currentTimestampInSeconds = Math.round(Date.now() / 1000);
const unlockTime = currentTimestampInSeconds + 60;
const lockedAmount = hre.ethers.parseEther("0.001");
const lock = await hre.ethers.deployContract("Lock", [unlockTime], {
value: lockedAmount,
});
await lock.waitForDeployment();
console.log(
`Lock with ${ethers.formatEther(
lockedAmount
)}ETH and unlock timestamp ${unlockTime} deployed to ${lock.target}`
);
}
// We recommend this pattern to be able to use async/await everywhere
// and properly handle errors.
main().catch((error) => {
console.error(error);
process.exitCode = 1;
});
```
--------------------------------------------------------------------------------
/tests/ast/empty_block.json:
--------------------------------------------------------------------------------
```json
{"absolutePath":"a","exportedSymbols":{"C":[6]},"id":7,"nodeType":"SourceUnit","nodes":[{"abstract":false,"baseContracts":[],"canonicalName":"C","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":6,"linearizedBaseContracts":[6],"name":"C","nameLocation":"9:1:1","nodeType":"ContractDefinition","nodes":[{"body":{"id":4,"nodeType":"Block","src":"42:31:1","statements":[{"AST":{"nodeType":"YulBlock","src":"61:6:1","statements":[{"nodeType":"YulBlock","src":"63:2:1","statements":[]}]},"evmVersion":"london","externalReferences":[],"id":3,"nodeType":"InlineAssembly","src":"52:15:1"}]},"functionSelector":"e2179b8e","id":5,"implemented":true,"kind":"function","modifiers":[],"name":"g","nameLocation":"26:1:1","nodeType":"FunctionDefinition","parameters":{"id":1,"nodeType":"ParameterList","parameters":[],"src":"27:2:1"},"returnParameters":{"id":2,"nodeType":"ParameterList","parameters":[],"src":"42:0:1"},"scope":6,"src":"17:56:1","stateMutability":"view","virtual":false,"visibility":"public"}],"scope":7,"src":"0:75:1","usedErrors":[]}],"src":"0:76:1"}
```
--------------------------------------------------------------------------------
/tools/xtask/src/blesspr.rs:
--------------------------------------------------------------------------------
```rust
use xshell::{Shell, cmd};
pub fn blesspr() -> anyhow::Result<()> {
let sh = Shell::new()?;
sh.change_dir(env!("CARGO_MANIFEST_DIR"));
sh.change_dir("../../");
// Run cargo build (sanity test)
let cmd = cmd!(sh, "cargo build");
cmd.run()?;
// Fix clippy
let cmd = cmd!(sh, "cargo fixclippy");
cmd.run()?;
// Check clippy
let cmd = cmd!(sh, "cargo clippy").arg("--").arg("-D").arg("warnings");
cmd.run()?;
// Fix format
let cmd = cmd!(sh, "cargo fixfmt");
cmd.run()?;
// Check fixed format
let cmd = cmd!(sh, "cargo fmt --all --check");
cmd.run()?;
// Create reportgen
let cmd = cmd!(sh, "cargo prep --all --parallel");
cmd.run()?;
// Create aderyn.toml
let cmd = cmd!(sh, "cargo tomlgen");
cmd.run()?;
// Push changes
let cmd = cmd!(sh, "git add .");
cmd.run()?;
let cmd = cmd!(sh, "git commit -am").arg("chore: cargo blesspr");
cmd.run()?;
let cmd = cmd!(sh, "git config push.autoSetupRemote true");
cmd.run()?;
let cmd = cmd!(sh, "git push");
cmd.run()?;
Ok(())
}
```
--------------------------------------------------------------------------------
/aderyn_core/src/context/mcp/node_finder/render.rs:
--------------------------------------------------------------------------------
```rust
use askama::Template;
use derive_builder::Builder;
use serde::Serialize;
use std::collections::BTreeMap;
use crate::ast::NodeID;
pub type RNodeType = String; // To respect RMCP + template schema, chose simple type for output
#[derive(Template, Builder, Serialize)]
#[template(path = "mcp-tool-response/node_finder_search.md")]
#[builder(pattern = "owned")]
pub struct NodeFinderMatches {
pub term: String,
pub node_type: RNodeType,
pub matching_nodes: Vec<NodeInfo>,
}
#[derive(Template, Builder, Serialize)]
#[template(path = "mcp-tool-response/node_finder_get_all.md")]
#[builder(pattern = "owned")]
pub struct NodeFinderAll {
pub node_type: RNodeType,
pub nodes: Vec<NodeInfo>,
}
#[derive(Template, Builder, Serialize)]
#[template(path = "mcp-tool-response/node_finder_grep.md")]
#[builder(pattern = "owned")]
pub struct NodeFinderGrepMatches {
pub term: String,
pub nodes: BTreeMap<RNodeType, Vec<NodeInfo>>,
}
#[derive(Builder, Serialize)]
#[builder(pattern = "owned")]
pub struct NodeInfo {
pub name: String,
pub node_id: NodeID,
pub compilation_unit_index: usize,
}
```
--------------------------------------------------------------------------------
/tests/ast/experimental_encoder_pragma.json:
--------------------------------------------------------------------------------
```json
{
"absolutePath": "/Users/alexroan/Documents/Cyfrin/aderyn/tests/contract-playground/src/ExperimentalEncoder.sol",
"exportedSymbols":
{
"ExperimentalEncoder":
[
3
]
},
"id": 4,
"nodeType": "SourceUnit",
"nodes":
[
{
"id": 1,
"literals":
[
"solidity",
"0.6",
".0"
],
"nodeType": "PragmaDirective",
"src": "45:22:0"
},
{
"id": 2,
"literals":
[
"experimental",
"ABIEncoderV2"
],
"nodeType": "PragmaDirective",
"src": "68:33:0"
},
{
"abstract": false,
"baseContracts": [],
"contractDependencies": [],
"contractKind": "contract",
"documentation": null,
"fullyImplemented": true,
"id": 3,
"linearizedBaseContracts":
[
3
],
"name": "ExperimentalEncoder",
"nodeType": "ContractDefinition",
"nodes": [],
"scope": 4,
"src": "103:32:0"
}
],
"src": "45:90:0"
}
```
--------------------------------------------------------------------------------
/aderyn_core/src/ast/impls/node/variables.rs:
--------------------------------------------------------------------------------
```rust
use crate::{ast::*, visitor::ast_visitor::*};
use eyre::Result;
impl Node for VariableDeclaration {
fn accept(&self, visitor: &mut impl ASTConstVisitor) -> Result<()> {
if visitor.visit_variable_declaration(self)? {
if self.type_name.is_some() {
self.type_name.as_ref().unwrap().accept(visitor)?;
}
if self.overrides.is_some() {
self.overrides.as_ref().unwrap().accept(visitor)?;
}
if self.value.is_some() {
self.value.as_ref().unwrap().accept(visitor)?;
}
}
self.accept_metadata(visitor)?;
visitor.end_visit_variable_declaration(self)
}
fn accept_metadata(&self, visitor: &mut impl ASTConstVisitor) -> Result<()> {
if let Some(overrides) = &self.overrides {
visitor.visit_immediate_children(self.id, vec![overrides.id])?;
}
if let Some(value) = &self.value
&& let Some(value_id) = value.get_node_id()
{
visitor.visit_immediate_children(self.id, vec![value_id])?;
}
Ok(())
}
macros::accept_id!();
}
```
--------------------------------------------------------------------------------
/aderyn_core/src/context/browser/closest_ancestor.rs:
--------------------------------------------------------------------------------
```rust
use crate::{
ast::*,
context::workspace::{ASTNode, WorkspaceContext},
visitor::ast_visitor::{ASTConstVisitor, Node},
};
pub trait GetClosestAncestorOfTypeX {
/// Get the parent Chain of an ASTNode
fn closest_ancestor_of_type<'a>(
&self,
context: &'a WorkspaceContext,
node_type: NodeType,
) -> Option<&'a ASTNode>;
}
#[derive(Default)]
struct NodeIDReceiver {
id: Option<NodeID>,
}
impl ASTConstVisitor for NodeIDReceiver {
fn visit_node_id(&mut self, node_id: Option<NodeID>) -> eyre::Result<()> {
self.id = node_id;
Ok(())
}
}
impl<T: Node + ?Sized> GetClosestAncestorOfTypeX for T {
fn closest_ancestor_of_type<'a>(
&self,
context: &'a WorkspaceContext,
node_type: NodeType,
) -> Option<&'a ASTNode> {
// Setup a Node ID receiver
let mut node_id_receiver = NodeIDReceiver::default();
// Find the ID of the node this method is called upon
self.accept_id(&mut node_id_receiver).ok()?;
let current_node_id = node_id_receiver.id?;
context.get_closest_ancestor(current_node_id, node_type)
}
}
```
--------------------------------------------------------------------------------
/aderyn_driver/benches/detectors.rs:
--------------------------------------------------------------------------------
```rust
use std::path::PathBuf;
use aderyn_driver::{detector::get_all_issue_detectors, process::PreprocessedConfig};
use criterion::{Criterion, criterion_group, criterion_main};
use rayon::iter::{IntoParallelRefIterator, ParallelIterator};
fn bench_individual_detectors_on_contract_playground(c: &mut Criterion) {
let root_path = PathBuf::from("../tests/contract-playground");
let preprocessed_config =
PreprocessedConfig { root_path, src: None, include: None, exclude: None };
let (contexts, _) =
aderyn_driver::compile::compile_project(preprocessed_config, false, true).unwrap();
for detector in get_all_issue_detectors() {
c.bench_function(detector.name().as_str(), |b| {
b.iter(|| {
contexts.par_iter().for_each(|context| {
let mut d = detector.skeletal_clone();
let _ = d.detect(context).unwrap();
})
})
});
}
}
criterion_group!(
detectors, // Group name is the first argument
bench_individual_detectors_on_contract_playground, // Group 1
);
criterion_main!(detectors);
```
--------------------------------------------------------------------------------
/aderyn/Cargo.toml:
--------------------------------------------------------------------------------
```toml
[package]
name = "aderyn"
version = "0.6.5"
edition = { workspace = true }
default-run = "aderyn"
authors = { workspace = true }
description = { workspace = true }
license = { workspace = true }
repository = { workspace = true }
homepage = { workspace = true }
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
urlencoding = { workspace = true }
webbrowser = { workspace = true }
indoc = { workspace = true }
aderyn_driver = { workspace = true }
clap = { workspace = true, features = ["derive"] }
reqwest = { workspace = true, features = ["blocking", "json", "rustls-tls"] }
semver = { workspace = true }
serde = { workspace = true, features = ["derive"] }
serde_json = { workspace = true, features = ["preserve_order"] }
strum = { workspace = true, features = ["derive"] }
notify-debouncer-full = { workspace = true }
crossbeam-channel = { workspace = true}
termcolor = { workspace = true }
tokio = { workspace = true, features = ["full"] }
tower-lsp = { workspace = true }
log = { workspace = true }
rmcp = { workspace = true }
axum = { workspace = true }
clap_complete = { workspace = true }
simplelog = "0"
[lints]
workspace = true
```
--------------------------------------------------------------------------------
/tests/ast/leave.json:
--------------------------------------------------------------------------------
```json
{"absolutePath":"a","exportedSymbols":{"C":[6]},"id":7,"nodeType":"SourceUnit","nodes":[{"abstract":false,"baseContracts":[],"canonicalName":"C","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":6,"linearizedBaseContracts":[6],"name":"C","nameLocation":"9:1:1","nodeType":"ContractDefinition","nodes":[{"body":{"id":4,"nodeType":"Block","src":"37:51:1","statements":[{"AST":{"nodeType":"YulBlock","src":"56:26:1","statements":[{"body":{"nodeType":"YulBlock","src":"71:9:1","statements":[{"nodeType":"YulLeave","src":"73:5:1"}]},"name":"f","nodeType":"YulFunctionDefinition","src":"58:22:1"}]},"evmVersion":"london","externalReferences":[],"id":3,"nodeType":"InlineAssembly","src":"47:35:1"}]},"functionSelector":"ece866b9","id":5,"implemented":true,"kind":"function","modifiers":[],"name":"l","nameLocation":"26:1:1","nodeType":"FunctionDefinition","parameters":{"id":1,"nodeType":"ParameterList","parameters":[],"src":"27:2:1"},"returnParameters":{"id":2,"nodeType":"ParameterList","parameters":[],"src":"37:0:1"},"scope":6,"src":"17:71:1","stateMutability":"nonpayable","virtual":false,"visibility":"public"}],"scope":7,"src":"0:90:1","usedErrors":[]}],"src":"0:91:1"}
```
--------------------------------------------------------------------------------
/aderyn_core/templates/mcp-tool-response/node_summarizer.md:
--------------------------------------------------------------------------------
```markdown
## Node summarizer
### Compilation Unit: {{ compilation_unit_index }}
### Node ID: {{ node_id }}
### Filepath: {{ filepath }}
{% if let Some(contract) = containing_contract %}
### Containing Contract Class: {{ contract.name }} | Node Id: {{ contract.node_id }}
{% endif %}
{% if let Some(function) = containing_function %}
### Containing Function: {{ function.name }} | Node Id: {{ function.node_id }}
{% endif %}
{% if let Some(modifier) = containing_modifier %}
### Containing Modifier: {{ modifier.name }} | Node Id: {{ modifier.node_id }}
{% endif %}
### Code snippet of the node:
```solidity
{{ code }}
```
### Metadata
{% if containing_callgraphs.len() == 0 %}
No metadata present.
{% else %}
In this compilation unit {{ compilation_unit_index }}, Node ID {{ node_id }} appears in the callgraphs of the following entrypoints:
{% for c in containing_callgraphs %}
- Deployable contract `{{ c.deployable_contract_name }}` (node ID: {{ c.deployable_contract_id }}) entrypoints:
{% for e in c.entrypoint_ids %}
- Entrypoint Node ID {{ e }}
{% endfor %}
{% endfor %}
You can make use of Aderyn's callgraph tool to further holistically explore the bigger context in which this function is a part of.
{% endif %}
```
--------------------------------------------------------------------------------
/aderyn_core/src/context/browser/immediate_children.rs:
--------------------------------------------------------------------------------
```rust
use crate::{
ast::*,
context::{
browser::ExtractImmediateChildrenIDs,
workspace::{ASTNode, WorkspaceContext},
},
visitor::ast_visitor::{ASTConstVisitor, Node},
};
pub trait GetImmediateChildren {
/// Get the immediate children of an ASTNode
fn children<'a>(&self, context: &'a WorkspaceContext) -> Option<Vec<&'a ASTNode>>;
}
#[derive(Default)]
struct NodeIDReceiver {
id: Option<NodeID>,
}
impl ASTConstVisitor for NodeIDReceiver {
fn visit_node_id(&mut self, node_id: Option<NodeID>) -> eyre::Result<()> {
self.id = node_id;
Ok(())
}
}
impl<T: Node + ?Sized> GetImmediateChildren for T {
fn children<'a>(&self, context: &'a WorkspaceContext) -> Option<Vec<&'a ASTNode>> {
// Setup a Node ID receiver
let mut node_id_receiver = NodeIDReceiver::default();
// Find the ID of the node this method is called upon
self.accept_id(&mut node_id_receiver).ok()?;
let current_node_id = node_id_receiver.id?;
let children = ExtractImmediateChildrenIDs::from(context.nodes.get(¤t_node_id)?)
.extracted
.into_iter()
.filter_map(|x| context.nodes.get(&x))
.collect::<Vec<_>>();
Some(children)
}
}
```
--------------------------------------------------------------------------------
/tests/ast/stringlit.json:
--------------------------------------------------------------------------------
```json
{"absolutePath":"a","exportedSymbols":{"C":[6]},"id":7,"nodeType":"SourceUnit","nodes":[{"abstract":false,"baseContracts":[],"canonicalName":"C","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":6,"linearizedBaseContracts":[6],"name":"C","nameLocation":"9:1:1","nodeType":"ContractDefinition","nodes":[{"body":{"id":4,"nodeType":"Block","src":"37:43:1","statements":[{"AST":{"nodeType":"YulBlock","src":"56:18:1","statements":[{"nodeType":"YulVariableDeclaration","src":"58:14:1","value":{"hexValue":"616263","kind":"string","nodeType":"YulLiteral","src":"67:5:1","type":"","value":"abc"},"variables":[{"name":"x","nodeType":"YulTypedName","src":"62:1:1","type":""}]}]},"evmVersion":"london","externalReferences":[],"id":3,"nodeType":"InlineAssembly","src":"47:27:1"}]},"functionSelector":"5a2ee019","id":5,"implemented":true,"kind":"function","modifiers":[],"name":"m","nameLocation":"26:1:1","nodeType":"FunctionDefinition","parameters":{"id":1,"nodeType":"ParameterList","parameters":[],"src":"27:2:1"},"returnParameters":{"id":2,"nodeType":"ParameterList","parameters":[],"src":"37:0:1"},"scope":6,"src":"17:63:1","stateMutability":"nonpayable","virtual":false,"visibility":"public"}],"scope":7,"src":"0:82:1","usedErrors":[]}],"src":"0:83:1"}
```
--------------------------------------------------------------------------------
/aderyn_core/src/ast/impls/node/blocks.rs:
--------------------------------------------------------------------------------
```rust
use crate::{
ast::{Block, UncheckedBlock, macros::accept_id},
visitor::ast_visitor::*,
};
use eyre::Result;
impl Node for Block {
fn accept(&self, visitor: &mut impl ASTConstVisitor) -> Result<()> {
if visitor.visit_block(self)? {
list_accept(&self.statements, visitor)?;
}
self.accept_metadata(visitor)?;
visitor.end_visit_block(self)
}
fn accept_metadata(&self, visitor: &mut impl ASTConstVisitor) -> Result<()> {
let children_ids = self.statements.iter().flat_map(|x| x.get_node_id()).collect::<Vec<_>>();
visitor.visit_immediate_children(self.id, children_ids)?;
Ok(())
}
accept_id!();
}
impl Node for UncheckedBlock {
fn accept(&self, visitor: &mut impl ASTConstVisitor) -> Result<()> {
if visitor.visit_unchecked_block(self)? {
list_accept(&self.statements, visitor)?;
}
self.accept_metadata(visitor)?;
visitor.end_visit_unchecked_block(self)
}
fn accept_metadata(&self, visitor: &mut impl ASTConstVisitor) -> Result<()> {
let children_ids = self.statements.iter().flat_map(|x| x.get_node_id()).collect::<Vec<_>>();
visitor.visit_immediate_children(self.id, children_ids)?;
Ok(())
}
accept_id!();
}
```
--------------------------------------------------------------------------------
/aderyn_core/src/context/mcp/tool_guide/tool.rs:
--------------------------------------------------------------------------------
```rust
use crate::context::mcp::{MCPToolNamePool, ModelContextProtocolState, ModelContextProtocolTool};
use indoc::indoc;
use rmcp::{
ErrorData as McpError,
handler::server::wrapper::Parameters,
model::{CallToolResult, Content},
};
use std::sync::Arc;
#[derive(Clone)]
pub struct ToolGuide;
impl ModelContextProtocolTool for ToolGuide {
type Input = rmcp::model::EmptyObject;
fn new(_state: Arc<ModelContextProtocolState>) -> Self {
Self
}
fn name(&self) -> String {
MCPToolNamePool::AderynGetToolGuide.to_string()
}
fn description(&self) -> String {
indoc! {
"MUST be called once at the beginning to have that base knowledge required to \
solve user's problems. Provides glossary, general approaches to common scenarios, \
advanced tool calling strategies and tips to leverage Aderyn's MCP tools for \
high performance and accuracy."
}
.to_string()
}
fn execute(&self, _input: Parameters<Self::Input>) -> Result<CallToolResult, McpError> {
let response = include_str!(concat!(
env!("CARGO_MANIFEST_DIR"),
"/templates/mcp-tool-response/tool_guide.md"
));
Ok(CallToolResult::success(vec![Content::text(response)]))
}
}
```
--------------------------------------------------------------------------------
/tests/ast/fallback_and_reveice_ether.json:
--------------------------------------------------------------------------------
```json
{"absolutePath":"a","exportedSymbols":{"C":[9]},"id":10,"nodeType":"SourceUnit","nodes":[{"abstract":false,"baseContracts":[],"canonicalName":"C","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":9,"linearizedBaseContracts":[9],"name":"C","nameLocation":"9:1:1","nodeType":"ContractDefinition","nodes":[{"body":{"id":3,"nodeType":"Block","src":"42:5:1","statements":[]},"id":4,"implemented":true,"kind":"receive","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":1,"nodeType":"ParameterList","parameters":[],"src":"22:2:1"},"returnParameters":{"id":2,"nodeType":"ParameterList","parameters":[],"src":"42:0:1"},"scope":9,"src":"15:32:1","stateMutability":"payable","virtual":false,"visibility":"external"},{"body":{"id":7,"nodeType":"Block","src":"78:5:1","statements":[]},"id":8,"implemented":true,"kind":"fallback","modifiers":[],"name":"","nameLocation":"-1:-1:-1","nodeType":"FunctionDefinition","parameters":{"id":5,"nodeType":"ParameterList","parameters":[],"src":"58:2:1"},"returnParameters":{"id":6,"nodeType":"ParameterList","parameters":[],"src":"78:0:1"},"scope":9,"src":"50:33:1","stateMutability":"payable","virtual":false,"visibility":"external"}],"scope":10,"src":"0:85:1","usedErrors":[]}],"src":"0:86:1"}
```
--------------------------------------------------------------------------------
/aderyn_core/Cargo.toml:
--------------------------------------------------------------------------------
```toml
[package]
name = "aderyn_core"
version = "0.6.5"
edition = { workspace = true }
authors = { workspace = true }
description = { workspace = true }
license = { workspace = true }
repository = { workspace = true }
homepage = { workspace = true }
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
eyre = { workspace = true }
ignore = { workspace = true }
phf = { workspace = true, features = ["macros"] }
prettytable = { workspace = true }
rayon = { workspace = true }
semver = { workspace = true }
serde = { workspace = true, features = ["derive"] }
serde_json = { workspace = true, features = ["preserve_order"] }
serde_repr = { workspace = true }
strum = { workspace = true, features = ["derive"] }
num-bigint = { workspace = true }
num-traits = { workspace = true }
lazy-regex = { workspace = true }
derive_more = { workspace = true }
dunce = { workspace = true }
solidity_ast = { workspace = true }
rmcp = { workspace = true }
askama = { workspace = true }
indoc = { workspace = true}
derive_builder = { workspace = true }
log = { workspace = true }
regex = { workspace = true }
[dev-dependencies]
petgraph = { workspace = true }
serial_test = { workspace = true }
once_cell = { workspace = true }
[lints]
workspace = true
[lib]
doctest = false
```
--------------------------------------------------------------------------------
/aderyn_core/src/context/mcp/contract_surface/render.rs:
--------------------------------------------------------------------------------
```rust
use askama::Template;
use derive_builder::Builder;
use serde::Serialize;
use crate::ast::NodeID;
#[derive(Builder, Serialize, Template)]
#[template(path = "mcp-tool-response/contract_surface.md")]
#[builder(pattern = "owned")]
pub struct ContractSurface {
pub name: String,
pub node_id: NodeID,
pub filepath: String,
pub compilation_unit_index: usize,
pub total_state_variables: usize,
pub reversed_chain: Vec<ContractInfo>,
pub entrypoints: EntrypointFunctions,
}
#[derive(Builder, Serialize, Default)]
#[builder(pattern = "owned")]
pub struct EntrypointFunctions {
pub external_functions: Vec<FunctionInfo>,
pub public_functions: Vec<FunctionInfo>,
pub fallback_function: Option<FunctionInfo>,
pub receive_function: Option<FunctionInfo>,
}
#[derive(Builder, Serialize)]
#[builder(pattern = "owned")]
pub struct ContractInfo {
pub name: String,
pub node_id: NodeID,
pub state_variables: Vec<String>,
pub filepath: String,
}
#[derive(Builder, Serialize)]
#[builder(pattern = "owned")]
pub struct FunctionInfo {
pub name: String,
pub node_id: NodeID,
pub containing_contract: ContainingContract,
}
#[derive(Builder, Serialize)]
#[builder(pattern = "owned")]
pub struct ContainingContract {
pub name: String,
pub node_id: NodeID,
}
```
--------------------------------------------------------------------------------
/aderyn_core/src/ast/impls/own/source_units.rs:
--------------------------------------------------------------------------------
```rust
use crate::ast::{ImportDirective, SourceUnit, SourceUnitNode};
use eyre::{Result, eyre};
use std::io;
impl SourceUnit {
pub fn source_line(&self, src: &str) -> Result<usize> {
let source = match self.source.as_ref() {
Some(source) => source.as_str(),
_ => return Err(eyre!("not found")),
};
let values: Vec<Option<usize>> = src
.split(':')
.map(|token| {
if token.is_empty() {
None
} else {
token
.parse()
.map_err(|error| io::Error::new(io::ErrorKind::InvalidData, error))
.ok()
}
})
.collect();
let index = values.first().and_then(|&value| value).ok_or_else(|| eyre!("not found"))?;
if index > source.len() {
return Err(eyre!("index out of bounds"));
}
Ok(source[..index].chars().filter(|&c| c == '\n').count() + 1)
}
pub fn import_directives(&self) -> Vec<&ImportDirective> {
self.nodes
.iter()
.filter_map(|n| {
let SourceUnitNode::ImportDirective(node) = n else {
return None;
};
Some(node)
})
.collect()
}
}
```
--------------------------------------------------------------------------------
/aderyn_core/src/audit/entrypoint.rs:
--------------------------------------------------------------------------------
```rust
use crate::{audit::auditor::get_auditor_detectors, context::workspace::WorkspaceContext};
use eyre::Result;
use prettytable::Row;
use rayon::iter::{IntoParallelRefMutIterator, ParallelIterator};
use std::{
collections::{BTreeMap, btree_map::Entry},
error::Error,
};
pub type AT = Vec<(String, (Row, Vec<Row>))>;
pub fn prepare_audit_tables(contexts: &[WorkspaceContext]) -> Result<AT, Box<dyn Error>> {
let audit_detectors_with_output = get_auditor_detectors()
.par_iter_mut()
.flat_map(|detector| {
// Keys -> detector's title
// Value -> (table titles, table rows)
let mut grouped_instances: BTreeMap<String, (Row, Vec<Row>)> = BTreeMap::new();
for context in contexts {
let mut d = detector.skeletal_clone();
if let Ok(found) = d.detect(context)
&& found
{
match grouped_instances.entry(d.title()) {
Entry::Occupied(o) => o.into_mut().1.extend(d.table_rows()),
Entry::Vacant(v) => {
v.insert((d.table_titles(), d.table_rows()));
}
};
}
}
grouped_instances
})
.collect::<Vec<_>>();
Ok(audit_detectors_with_output)
}
```
--------------------------------------------------------------------------------
/aderyn_core/src/stats/util.rs:
--------------------------------------------------------------------------------
```rust
use std::str::FromStr;
pub struct CodeIterator {
pub content: Vec<char>,
pub curr_pos: usize,
pub line_no: usize,
}
pub struct StatefulToken {
pub curr: char,
pub next: Option<char>,
pub line_no: usize,
}
impl Iterator for CodeIterator {
type Item = StatefulToken;
fn next(&mut self) -> Option<Self::Item> {
let curr_pos = self.curr_pos;
self.curr_pos += 1;
let result = {
if curr_pos < self.content.len() - 1 {
Some(StatefulToken {
curr: self.content[curr_pos],
next: Some(self.content[curr_pos + 1]),
line_no: self.line_no,
})
} else if curr_pos < self.content.len() {
Some(StatefulToken {
curr: self.content[curr_pos],
next: None,
line_no: self.line_no,
})
} else {
None
}
};
if let Some(ref c) = result
&& c.curr == '\n'
{
self.line_no += 1;
}
result
}
}
impl FromStr for CodeIterator {
type Err = usize;
fn from_str(code: &str) -> Result<Self, <Self as FromStr>::Err> {
Ok(CodeIterator { content: code.chars().collect::<Vec<_>>(), curr_pos: 0, line_no: 1 })
}
}
```
--------------------------------------------------------------------------------
/aderyn_core/src/detect/low/boolean_equality.rs:
--------------------------------------------------------------------------------
```rust
use crate::{detect::helpers::is_constant_boolean, issue_detector};
use eyre::Result;
issue_detector! {
BooleanEqualityDetector;
severity: Low,
title: "Boolean equality is not required",
desc: "If `x` is a boolean, use `if(x)` and `if(!x)` instead of `if(x == true)` or `if(x == false)`.",
name: BooleanEquality,
|context| {
for binary_operation in context.binary_operations() {
if binary_operation.operator == "=="
&& [
binary_operation.left_expression.as_ref(),
binary_operation.right_expression.as_ref(),
]
.iter()
.any(|&operand| is_constant_boolean(context, operand))
{
grab!(binary_operation);
}
}
}
}
#[cfg(test)]
mod boolean_equality_tests {
use crate::detect::{detector::IssueDetector, low::boolean_equality::BooleanEqualityDetector};
#[test]
fn test_boolean_equality_by_loading_contract_directly() {
let context = crate::detect::test_utils::load_solidity_source_unit(
"../tests/contract-playground/src/BooleanEquality.sol",
);
let mut detector = BooleanEqualityDetector::default();
let found = detector.detect(&context).unwrap();
assert!(found);
assert_eq!(detector.instances().len(), 4);
}
}
```
--------------------------------------------------------------------------------
/aderyn_core/src/ast/impls/disp/modifiers.rs:
--------------------------------------------------------------------------------
```rust
use crate::ast::*;
use std::fmt::Display;
impl Display for ModifierDefinition {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str("modifier")?;
if !self.name.is_empty() {
f.write_fmt(format_args!(" {}", self.name))?;
}
f.write_fmt(format_args!("{}", self.parameters))?;
if self.visibility != Visibility::Internal {
f.write_fmt(format_args!("{} {}", self.parameters, self.visibility))?;
}
if self.is_virtual {
f.write_fmt(format_args!(" virtual"))?;
}
if let Some(overrides) = self.overrides.as_ref() {
f.write_fmt(format_args!(" {overrides}"))?;
}
if let Some(body) = self.body.as_ref() {
f.write_fmt(format_args!(" {}", body))?;
}
Ok(())
}
}
impl Display for ModifierInvocation {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_fmt(format_args!("{:?}", self.modifier_name))?;
if let Some(arguments) = self.arguments.as_ref() {
f.write_str("(")?;
for (i, argument) in arguments.iter().enumerate() {
if i > 0 {
f.write_str(", ")?;
}
f.write_fmt(format_args!("{argument}"))?;
}
f.write_str(")")?;
}
Ok(())
}
}
```
--------------------------------------------------------------------------------
/dist-workspace.toml:
--------------------------------------------------------------------------------
```toml
[workspace]
members = ["cargo:."]
# Config for 'dist'
[dist]
# The preferred dist version to use in CI (Cargo.toml SemVer syntax)
cargo-dist-version = "0.28.0"
# CI backends to support
ci = "github"
# The installers to generate for each app
installers = ["shell", "npm", "homebrew"]
# A GitHub repo to push Homebrew formulas to
tap = "cyfrin/homebrew-tap"
# Target platforms to build apps for (Rust target-triple syntax)
targets = ["aarch64-apple-darwin", "aarch64-unknown-linux-gnu", "x86_64-apple-darwin", "x86_64-unknown-linux-gnu"]
# A namespace to use when publishing this package to the npm registry
npm-scope = "@cyfrin"
# Path that installers should place binaries in
install-path = "CARGO_HOME"
# Publish jobs to run in CI
publish-jobs = ["homebrew", "npm"]
# Whether to install an updater program
install-updater = true
[dist.github-custom-runners]
global = "ubuntu-latest"
[dist.github-custom-runners.x86_64-unknown-linux-gnu]
runner = "ubuntu-latest"
container = { image = "quay.io/pypa/manylinux_2_28_x86_64", host = "x86_64-unknown-linux-musl" }
[dist.github-custom-runners.x86_64-unknown-linux-musl]
runner = "ubuntu-latest"
container = { image = "quay.io/pypa/musllinux_1_2_x86_64", host = "x86_64-unknown-linux-musl" }
[dist.github-custom-runners.aarch64-unknown-linux-gnu]
runner = "ubuntu-latest"
container = { image = "quay.io/pypa/manylinux_2_28_x86_64", host = "x86_64-unknown-linux-musl" }
```
--------------------------------------------------------------------------------
/aderyn_core/src/stats/dbg_tips.txt:
--------------------------------------------------------------------------------
```
for group in &token_insight_groups {
if group.token_type == HighLevelType::Code {
println!(
"{}-{} Size:{} Contrib:{}",
group.start_line,
group.end_line,
group.token_insights.len(),
group.total_contribution(),
);
if group.total_contribution() == 37 {
for i in &group.token_insights {
println!(
"{:?} - {:?} - {} - {} - {}",
i.token_type,
i.code_lines.info_lines,
i.starts_with_newline,
i.start_line,
i.end_line
);
}
}
}
}
if value.token_type != TokenType::MultilineComment
&& value.token_type != TokenType::SinglelineComment
&& insight.start_line == 3
|| insight.end_line == 3
{
print!(
"{:?}, {}-{}\n",
value.token_type.clone(),
value.start_line,
value.end_line
);
println!("{}", value.content.clone());
println!(
"Lines {}/{}/{}\n----------------------",
insight.code_lines.info_lines,
insight.code_lines.actual_first_line,
insight.code_lines.last_line_has_code
);
}
starts in the same line, overcounted !
println!(
"cutting for {} {} {} {} {}",
curr.start_line,
prev.end_line,
curr.code_lines.info_lines,
prev.code_lines.info_lines,
prev.code_lines.actual_first_line,
);
```
--------------------------------------------------------------------------------
/tests/ast/switch_default.json:
--------------------------------------------------------------------------------
```json
{"absolutePath":"a","exportedSymbols":{"C":[6]},"id":7,"nodeType":"SourceUnit","nodes":[{"abstract":false,"baseContracts":[],"canonicalName":"C","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":6,"linearizedBaseContracts":[6],"name":"C","nameLocation":"9:1:1","nodeType":"ContractDefinition","nodes":[{"body":{"id":4,"nodeType":"Block","src":"42:58:1","statements":[{"AST":{"nodeType":"YulBlock","src":"61:33:1","statements":[{"cases":[{"body":{"nodeType":"YulBlock","src":"79:2:1","statements":[]},"nodeType":"YulCase","src":"72:9:1","value":{"kind":"number","nodeType":"YulLiteral","src":"77:1:1","type":"","value":"0"}},{"body":{"nodeType":"YulBlock","src":"90:2:1","statements":[]},"nodeType":"YulCase","src":"82:10:1","value":"default"}],"expression":{"kind":"number","nodeType":"YulLiteral","src":"70:1:1","type":"","value":"0"},"nodeType":"YulSwitch","src":"63:29:1"}]},"evmVersion":"london","externalReferences":[],"id":3,"nodeType":"InlineAssembly","src":"52:42:1"}]},"functionSelector":"e2179b8e","id":5,"implemented":true,"kind":"function","modifiers":[],"name":"g","nameLocation":"26:1:1","nodeType":"FunctionDefinition","parameters":{"id":1,"nodeType":"ParameterList","parameters":[],"src":"27:2:1"},"returnParameters":{"id":2,"nodeType":"ParameterList","parameters":[],"src":"42:0:1"},"scope":6,"src":"17:83:1","stateMutability":"view","virtual":false,"visibility":"public"}],"scope":7,"src":"0:102:1","usedErrors":[]}],"src":"0:103:1"}
```
--------------------------------------------------------------------------------
/aderyn_core/tests/common/peek_over.rs:
--------------------------------------------------------------------------------
```rust
use std::{collections::BTreeMap, error::Error};
use aderyn_core::{
ast::NodeID,
capture,
context::{browser::PeekOver, workspace::WorkspaceContext},
detect::detector::{IssueDetector, IssueDetectorNamePool, IssueSeverity},
};
use eyre::Result;
#[derive(Default)]
pub struct PeekOverDemonstrator {
// Keys are: [0] source file name, [1] line number, [2] character location of node.
// Do not add items manually, use `capture!` to add nodes to this BTreeMap.
found_instances: BTreeMap<(String, usize, String), NodeID>,
}
impl IssueDetector for PeekOverDemonstrator {
fn detect(&mut self, context: &WorkspaceContext) -> Result<bool, Box<dyn Error>> {
for event in context.event_definitions() {
if let Some(text) = event.peek_over(context)
&& (text.contains("// SAME CONDITIONALS")
|| text.contains("// DIFFERENT CONDITIONALS"))
{
capture!(self, context, event);
}
}
Ok(!self.found_instances.is_empty())
}
fn severity(&self) -> IssueSeverity {
IssueSeverity::High
}
fn title(&self) -> String {
String::from("Peek Over Demonstration")
}
fn description(&self) -> String {
String::from("Peek Over Demonstration")
}
fn instances(&self) -> BTreeMap<(String, usize, String), NodeID> {
self.found_instances.clone()
}
fn name(&self) -> String {
format!("{}", IssueDetectorNamePool::CentralizationRisk)
}
}
```
--------------------------------------------------------------------------------
/aderyn_core/src/ast/node_type.rs:
--------------------------------------------------------------------------------
```rust
use serde::{Deserialize, Serialize};
pub type NodeID = i64;
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, PartialOrd, Eq, Ord, Hash)]
pub enum NodeType {
SourceUnit,
PragmaDirective,
ImportDirective,
UsingForDirective,
ContractDefinition,
InheritanceSpecifier,
OverrideSpecifier,
IdentifierPath,
StructuredDocumentation,
VariableDeclaration,
Mapping,
ElementaryTypeName,
ElementaryTypeNameExpression,
ArrayTypeName,
TupleExpression,
FunctionDefinition,
ParameterList,
Block,
UncheckedBlock,
Continue,
Break,
Return,
Throw,
Literal,
Conditional,
Identifier,
IndexAccess,
IndexRangeAccess,
MemberAccess,
Assignment,
FunctionCall,
FunctionCallOptions,
FunctionTypeName,
NewExpression,
ExpressionStatement,
VariableDeclarationStatement,
IfStatement,
TryCatchClause,
UnaryOperation,
BinaryOperation,
EventDefinition,
ErrorDefinition,
EmitStatement,
PlaceholderStatement,
TryStatement,
RevertStatement,
ForStatement,
WhileStatement,
DoWhileStatement,
ModifierDefinition,
ModifierInvocation,
EnumDefinition,
EnumValue,
StructDefinition,
UserDefinedTypeName,
InlineAssembly,
YulLiteral,
YulTypedName,
YulSwitch,
YulCase,
YulFunctionCall,
YulExpressionStatement,
YulAssignment,
YulIdentifier,
YulVariableDeclaration,
YulBlock,
UserDefinedValueTypeDefinition,
}
```
--------------------------------------------------------------------------------
/aderyn_core/src/ast/impls/ctx/workspace.rs:
--------------------------------------------------------------------------------
```rust
use rayon::iter::{IntoParallelIterator, ParallelBridge};
use crate::{
ast::{ContractDefinition, FunctionDefinition},
context::{
graph::{CallGraphConsumer, CallGraphDirection},
workspace::WorkspaceContext,
},
};
impl WorkspaceContext {
#[inline]
pub fn deployable_contracts(&self) -> impl Iterator<Item = &ContractDefinition> {
self.contract_definitions().into_iter().filter(|c| c.is_deployable_contract())
}
#[inline]
pub fn par_deployable_contracts(
&self,
) -> impl IntoParallelIterator<Item = &ContractDefinition> {
self.contract_definitions().into_iter().filter(|c| c.is_deployable_contract()).par_bridge()
}
pub fn entrypoints_of_deployable_contracts(&self) -> Vec<&FunctionDefinition> {
let mut entrypoints = vec![];
for contract in self.deployable_contracts() {
if let Some(entrypoint_funcs) = contract.entrypoint_functions(self) {
entrypoints.extend(entrypoint_funcs);
}
}
entrypoints
}
pub fn entrypoints_with_callgraphs(
&self,
) -> Vec<(&FunctionDefinition, Vec<CallGraphConsumer>)> {
let mut result = vec![];
for func in self.entrypoints_of_deployable_contracts() {
let Ok(callgraphs) =
CallGraphConsumer::get(self, &[&(func.into())], CallGraphDirection::Inward)
else {
continue;
};
result.push((func, callgraphs));
}
result
}
}
```
--------------------------------------------------------------------------------
/aderyn_core/templates/mcp-tool-response/project_overview.md:
--------------------------------------------------------------------------------
```markdown
## Project Overview
### Configuration
- **Root:** {{ root }}
- **Source:** {{ source }}
- **Remappings:**
{%if remappings.len() > 0 %}
{% for r in remappings %}
- "{{ r }}"
{% endfor %}
{% else %}
- No remappings found
{% endif %}
### Notes:
- *Root* directory is an absolute path.
- *Remappings* can be relative or absolute. The relative ones are relative to the root.
- Not all solidity files in the root directory are authored by the developer. Some files are 3rd party libraries which should be omitted for analysis unless explicitly pulled as a dependency by other developer authored solidity files.
- *Source* directory is the most important directory of all. It lives inside the *Root* and contains all the solidity contracts that the developer has worked on.
Aderyn has determined that there are **{{ compilation_units.len() }} compilation units**. The actual Solc versions itself are not mentioned.
Note that the file paths shown are relative to the project's **Root** shown above. Please also note that only a subset of these files are considered included files - those lines of entries are appended with `INCLUDED` keyword.
{% for cu in compilation_units %}
### Compilation Unit {{ loop.index }}:
{% for f in cu.files %}
- {{ f.path }}{% if f.included %} INCLUDED{% endif %}
{% endfor %}
{% endfor %}
### Summary:
- Total compilation units: **{{ compilation_units.len() }}**
{% for cu in compilation_units %}
- Compilation Unit {{ loop.index }} has **{{ cu.files.len() }}** files of which **{{ cu.included_count }}** are included.
{% endfor %}
```
--------------------------------------------------------------------------------
/aderyn/src/birdsong.rs:
--------------------------------------------------------------------------------
```rust
use indoc::indoc;
pub const MESSAGES: [&str; 8] = [
indoc! {"
Aderyn saved you hours of headaches.
☕ Buy us a virtual coffee with a GitHub star:
"},
indoc! {"
🐦 Aderyn finds bugs. You write safer code.
⭐ Star us on GitHub if that sounds fair:
"},
indoc! {"
🛡️ Together we make Solidity safer.
✨ Support open-source security — star Aderyn:
"},
indoc! {"
✔ Done! Fast, clean, effective.
⭐ Support the project with a star:
"},
indoc! {"
🌱 Aderyn is growing with community support.
Help others discover it — drop a star on GitHub:
"},
indoc! {"
✔ Aderyn did its job. Solidity's a bit safer now.
💫 Like the tool? A star on GitHub goes a long way:
"},
indoc! {"
🪶 Aderyn spotted all it could. Stay secure.
If our little bird helped you out, give it a perch with a GitHub Star ⭐
"},
indoc! {"
💡 Did Aderyn help you today?
Show some love with a quick star on GitHub Star ⭐
"},
];
use std::time::{SystemTime, UNIX_EPOCH};
pub fn print_last_words() {
let random_in_range = |min: usize, max: usize| -> usize {
let now =
SystemTime::now().duration_since(UNIX_EPOCH).expect("Time went backwards").as_nanos();
let hash = (now ^ (now >> 3) ^ (now << 7)) as usize;
min + (hash % (max - min))
};
let message_idx = random_in_range(0, MESSAGES.len());
let message = MESSAGES[message_idx];
print!("\n{}", message);
println!("https://github.com/Cyfrin/aderyn");
}
```
--------------------------------------------------------------------------------
/benchmarks/aderyn/base/sample.json:
--------------------------------------------------------------------------------
```json
{"sampling_mode":"Flat","iters":[1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0],"times":[93792368.0,125797761.0,96254770.0,102374608.0,96493368.0,94031566.0,92396047.0,92177740.0,143306731.0,117915483.0,116549204.0,120464727.0,119302292.0,103040968.0,111625647.0,100710330.0,95988974.0,100853519.0,103700207.0,96537843.0,102143255.0,99264821.0,104100188.0,103455867.0,190820242.0,199394390.0,142701189.0,100542974.0,91910714.0,93222451.0,92382061.0,93195709.0,92210554.0,92074295.0,93916028.0,94650533.0,95918744.0,93382773.0,89506898.0,93195935.0,91561765.0,91837441.0,104168599.0,103359199.0,113947329.0,109202194.0,95463817.0,91603965.0,97421558.0,132146204.0,125159248.0,99479231.0,93373712.0,92970819.0,94648268.0,100649670.0,105911313.0,114752590.0,112190279.0,116569945.0,101618637.0,100205137.0,99485415.0,103899776.0,104103036.0,105496380.0,117068490.0,114958188.0,119318918.0,114960419.0,102964747.0,119196332.0,149610159.0,139797727.0,122250300.0,120796880.0,241071573.0,156090165.0,160000214.0,137333096.0,137873192.0,139612525.0,146369137.0,127092104.0,109784544.0,115614577.0,114103645.0,115323101.0,126611514.0,159452369.0,124081522.0,117945249.0,116389840.0,120472367.0,115915601.0,163522498.0,114205847.0,172101235.0,111150712.0,121448947.0]}
```
--------------------------------------------------------------------------------
/benchmarks/aderyn/new/sample.json:
--------------------------------------------------------------------------------
```json
{"sampling_mode":"Flat","iters":[1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0],"times":[93792368.0,125797761.0,96254770.0,102374608.0,96493368.0,94031566.0,92396047.0,92177740.0,143306731.0,117915483.0,116549204.0,120464727.0,119302292.0,103040968.0,111625647.0,100710330.0,95988974.0,100853519.0,103700207.0,96537843.0,102143255.0,99264821.0,104100188.0,103455867.0,190820242.0,199394390.0,142701189.0,100542974.0,91910714.0,93222451.0,92382061.0,93195709.0,92210554.0,92074295.0,93916028.0,94650533.0,95918744.0,93382773.0,89506898.0,93195935.0,91561765.0,91837441.0,104168599.0,103359199.0,113947329.0,109202194.0,95463817.0,91603965.0,97421558.0,132146204.0,125159248.0,99479231.0,93373712.0,92970819.0,94648268.0,100649670.0,105911313.0,114752590.0,112190279.0,116569945.0,101618637.0,100205137.0,99485415.0,103899776.0,104103036.0,105496380.0,117068490.0,114958188.0,119318918.0,114960419.0,102964747.0,119196332.0,149610159.0,139797727.0,122250300.0,120796880.0,241071573.0,156090165.0,160000214.0,137333096.0,137873192.0,139612525.0,146369137.0,127092104.0,109784544.0,115614577.0,114103645.0,115323101.0,126611514.0,159452369.0,124081522.0,117945249.0,116389840.0,120472367.0,115915601.0,163522498.0,114205847.0,172101235.0,111150712.0,121448947.0]}
```
--------------------------------------------------------------------------------
/tests/ast/short_type_name.json:
--------------------------------------------------------------------------------
```json
{"absolutePath":"a","exportedSymbols":{"c":[11]},"id":12,"nodeType":"SourceUnit","nodes":[{"abstract":false,"baseContracts":[],"canonicalName":"c","contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"id":11,"linearizedBaseContracts":[11],"name":"c","nameLocation":"9:1:1","nodeType":"ContractDefinition","nodes":[{"body":{"id":9,"nodeType":"Block","src":"33:20:1","statements":[{"assignments":[7],"declarations":[{"constant":false,"id":7,"mutability":"mutable","name":"x","nameLocation":"49:1:1","nodeType":"VariableDeclaration","scope":9,"src":"35:15:1","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":5,"name":"uint","nodeType":"ElementaryTypeName","src":"35:4:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":6,"nodeType":"ArrayTypeName","src":"35:6:1","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"id":8,"nodeType":"VariableDeclarationStatement","src":"35:15:1"}]},"functionSelector":"26121ff0","id":10,"implemented":true,"kind":"function","modifiers":[],"name":"f","nameLocation":"22:1:1","nodeType":"FunctionDefinition","parameters":{"id":1,"nodeType":"ParameterList","parameters":[],"src":"23:2:1"},"returnParameters":{"id":2,"nodeType":"ParameterList","parameters":[],"src":"33:0:1"},"scope":11,"src":"13:40:1","stateMutability":"nonpayable","virtual":false,"visibility":"public"}],"scope":12,"src":"0:55:1","usedErrors":[]}],"src":"0:56:1"}
```
--------------------------------------------------------------------------------
/aderyn_core/src/context/graph/callgraph/utils.rs:
--------------------------------------------------------------------------------
```rust
use super::*;
use crate::context::workspace::{ASTNode, WorkspaceContext};
impl CallGraphConsumer {
/// Legacy method
///
/// Creates a [`CallGraphConsumer`] that can explore paths from given nodes.
pub(super) fn from_nodes(
context: &WorkspaceContext,
nodes: &[&ASTNode],
direction: CallGraphDirection,
) -> super::Result<CallGraphConsumer> {
Ok(CallGraphConsumer {
entry_points: legacy::derive_entry_points(nodes)?,
inward_surface_points: legacy::derive_inward_surface_points_legacy(context, nodes),
outward_surface_points: legacy::derive_outward_surface_points(context, nodes),
direction,
base_contract: None,
})
}
/// New method
///
/// Creates a [`CallGraphConsumer`] that can explore paths from given nodes.
pub(super) fn many_from_nodes(
context: &WorkspaceContext,
nodes: &[&ASTNode],
direction: CallGraphDirection,
) -> super::Result<Vec<CallGraphConsumer>> {
let mut cg_consumers = vec![];
let cg_points = new::derive_surface_points(context, nodes);
for (contract_id, points) in cg_points.points {
cg_consumers.push(CallGraphConsumer {
entry_points: points.entry.into_iter().collect(),
inward_surface_points: points.inward.into_iter().collect(),
outward_surface_points: points.outward.into_iter().collect(),
direction: direction.clone(),
base_contract: Some(contract_id),
});
}
Ok(cg_consumers)
}
}
```
--------------------------------------------------------------------------------
/aderyn_core/src/context/graph.rs:
--------------------------------------------------------------------------------
```rust
mod callgraph;
mod preprocess;
mod traits;
mod utils;
use std::collections::HashMap;
pub use callgraph::*;
pub use traits::*;
use derive_more::From;
use crate::ast::{ASTNode, NodeID};
pub type Result<T> = core::result::Result<T, Error>;
#[derive(Debug)]
pub struct LegacyWorkspaceCallGraph {
pub raw_callgraph: RawCallGraph,
}
#[derive(Debug, Default)]
pub struct WorkspaceCallGraphs {
// Key => Contract Definition NodeID
pub inward_callgraphs: HashMap<NodeID, RawCallGraph>,
pub outward_callgraphs: HashMap<NodeID, RawCallGraph>,
}
/**
* Every NodeID in RawCallGraph should corresponds to [`crate::ast::FunctionDefinition`] or
* [`crate::ast::ModifierDefinition`]
*/
pub type RawCallGraph = HashMap<NodeID, Vec<NodeID>>;
#[derive(Debug, From)]
pub enum Error {
#[from]
Custom(String),
// region: -- standard::* errors
WorkspaceCallGraphDFSError,
InwardCallgraphNotAvailable,
OutwardCallgraphNotAvailable,
UnidentifiedEntryPointNode(ASTNode),
InvalidEntryPointId(NodeID),
EntryPointVisitError,
OutwardFunctionDefinitionVisitError,
OutwardModifierDefinitionVisitError,
InwardFunctionDefinitionVisitError,
InwardModifierDefinitionVisitError,
OutwardSideEffectFunctionDefinitionVisitError,
OutwardSideEffectModifierDefinitionVisitError,
// endregion
}
impl core::fmt::Display for Error {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{self:?}")
}
}
impl From<&str> for Error {
fn from(value: &str) -> Self {
Error::Custom(value.to_string())
}
}
impl std::error::Error for Error {}
```
--------------------------------------------------------------------------------
/aderyn_core/src/detect/high/misused_boolean.rs:
--------------------------------------------------------------------------------
```rust
use crate::{detect::helpers::is_constant_boolean, issue_detector};
use eyre::Result;
issue_detector! {
MisusedBooleanDetector;
severity: High,
title: "Misused boolean with logical operators",
desc: "The patterns `if (… || true)` and `if (.. && false)` will always evaluate to true and false respectively.",
name: MisusedBoolean,
|context| {
for binary_operation in context.binary_operations() {
if (binary_operation.operator == "||" || binary_operation.operator == "&&")
&& [
binary_operation.left_expression.as_ref(),
binary_operation.right_expression.as_ref(),
]
.iter()
.any(|&operand| is_constant_boolean(context, operand))
{
grab!(binary_operation);
}
}
for if_statement in context.if_statements()
.iter()
.filter(|statement| is_constant_boolean(context, &statement.condition)) {
grab!(if_statement);
}
}
}
#[cfg(test)]
mod misused_boolean_tests {
use crate::detect::{detector::IssueDetector, high::misused_boolean::MisusedBooleanDetector};
#[test]
fn test_misused_boolean_by_loading_contract_directly() {
let context = crate::detect::test_utils::load_solidity_source_unit(
"../tests/contract-playground/src/MisusedBoolean.sol",
);
let mut detector = MisusedBooleanDetector::default();
let found = detector.detect(&context).unwrap();
assert!(found);
assert_eq!(detector.instances().len(), 10);
}
}
```
--------------------------------------------------------------------------------
/benchmarks/constants-instead-of-literals/base/sample.json:
--------------------------------------------------------------------------------
```json
{"sampling_mode":"Linear","iters":[1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0,16.0,17.0,18.0,19.0,20.0,21.0,22.0,23.0,24.0,25.0,26.0,27.0,28.0,29.0,30.0,31.0,32.0,33.0,34.0,35.0,36.0,37.0,38.0,39.0,40.0,41.0,42.0,43.0,44.0,45.0,46.0,47.0,48.0,49.0,50.0,51.0,52.0,53.0,54.0,55.0,56.0,57.0,58.0,59.0,60.0,61.0,62.0,63.0,64.0,65.0,66.0,67.0,68.0,69.0,70.0,71.0,72.0,73.0,74.0,75.0,76.0,77.0,78.0,79.0,80.0,81.0,82.0,83.0,84.0,85.0,86.0,87.0,88.0,89.0,90.0,91.0,92.0,93.0,94.0,95.0,96.0,97.0,98.0,99.0,100.0],"times":[1530154.0,3786403.0,4780065.0,6216677.0,8035474.0,8938606.0,10593770.0,12056631.0,13282303.0,14929757.0,16174241.0,17504075.0,18869312.0,19023353.0,22679148.0,22519825.0,23774477.0,24889277.0,27175643.0,27833145.0,27844391.0,29172203.0,30801785.0,31952963.0,33003466.0,36186822.0,37326592.0,37893290.0,42988748.0,56336444.0,57137096.0,55538151.0,52398523.0,55036494.0,54236353.0,54891861.0,54070748.0,54155193.0,53985735.0,59019625.0,61193547.0,62909028.0,63334642.0,62950312.0,63861801.0,62503226.0,69195132.0,74584832.0,72419454.0,72525201.0,68655217.0,70553653.0,72501885.0,72573705.0,73268430.0,74415913.0,78268192.0,80314832.0,82486034.0,80097578.0,84251529.0,86143500.0,87706901.0,89353993.0,88609606.0,89144200.0,92110952.0,90592715.0,93340835.0,93799346.0,95116589.0,96573241.0,97644534.0,100361460.0,100967200.0,102238249.0,101520321.0,104297523.0,107496632.0,108144837.0,110091121.0,115870072.0,132701223.0,112406516.0,123351023.0,126283323.0,121591944.0,120108621.0,121501350.0,122774954.0,126387079.0,123549593.0,137655095.0,133832134.0,125641323.0,122604778.0,123774041.0,126619019.0,124813813.0,124270673.0]}
```
--------------------------------------------------------------------------------
/benchmarks/constants-instead-of-literals/new/sample.json:
--------------------------------------------------------------------------------
```json
{"sampling_mode":"Linear","iters":[1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0,16.0,17.0,18.0,19.0,20.0,21.0,22.0,23.0,24.0,25.0,26.0,27.0,28.0,29.0,30.0,31.0,32.0,33.0,34.0,35.0,36.0,37.0,38.0,39.0,40.0,41.0,42.0,43.0,44.0,45.0,46.0,47.0,48.0,49.0,50.0,51.0,52.0,53.0,54.0,55.0,56.0,57.0,58.0,59.0,60.0,61.0,62.0,63.0,64.0,65.0,66.0,67.0,68.0,69.0,70.0,71.0,72.0,73.0,74.0,75.0,76.0,77.0,78.0,79.0,80.0,81.0,82.0,83.0,84.0,85.0,86.0,87.0,88.0,89.0,90.0,91.0,92.0,93.0,94.0,95.0,96.0,97.0,98.0,99.0,100.0],"times":[1530154.0,3786403.0,4780065.0,6216677.0,8035474.0,8938606.0,10593770.0,12056631.0,13282303.0,14929757.0,16174241.0,17504075.0,18869312.0,19023353.0,22679148.0,22519825.0,23774477.0,24889277.0,27175643.0,27833145.0,27844391.0,29172203.0,30801785.0,31952963.0,33003466.0,36186822.0,37326592.0,37893290.0,42988748.0,56336444.0,57137096.0,55538151.0,52398523.0,55036494.0,54236353.0,54891861.0,54070748.0,54155193.0,53985735.0,59019625.0,61193547.0,62909028.0,63334642.0,62950312.0,63861801.0,62503226.0,69195132.0,74584832.0,72419454.0,72525201.0,68655217.0,70553653.0,72501885.0,72573705.0,73268430.0,74415913.0,78268192.0,80314832.0,82486034.0,80097578.0,84251529.0,86143500.0,87706901.0,89353993.0,88609606.0,89144200.0,92110952.0,90592715.0,93340835.0,93799346.0,95116589.0,96573241.0,97644534.0,100361460.0,100967200.0,102238249.0,101520321.0,104297523.0,107496632.0,108144837.0,110091121.0,115870072.0,132701223.0,112406516.0,123351023.0,126283323.0,121591944.0,120108621.0,121501350.0,122774954.0,126387079.0,123549593.0,137655095.0,133832134.0,125641323.0,122604778.0,123774041.0,126619019.0,124813813.0,124270673.0]}
```
--------------------------------------------------------------------------------
/benchmarks/inconsistent-type-names/base/sample.json:
--------------------------------------------------------------------------------
```json
{"sampling_mode":"Linear","iters":[1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0,16.0,17.0,18.0,19.0,20.0,21.0,22.0,23.0,24.0,25.0,26.0,27.0,28.0,29.0,30.0,31.0,32.0,33.0,34.0,35.0,36.0,37.0,38.0,39.0,40.0,41.0,42.0,43.0,44.0,45.0,46.0,47.0,48.0,49.0,50.0,51.0,52.0,53.0,54.0,55.0,56.0,57.0,58.0,59.0,60.0,61.0,62.0,63.0,64.0,65.0,66.0,67.0,68.0,69.0,70.0,71.0,72.0,73.0,74.0,75.0,76.0,77.0,78.0,79.0,80.0,81.0,82.0,83.0,84.0,85.0,86.0,87.0,88.0,89.0,90.0,91.0,92.0,93.0,94.0,95.0,96.0,97.0,98.0,99.0,100.0],"times":[1391819.0,3386217.0,4477651.0,6524564.0,7318024.0,9048109.0,9425488.0,11788924.0,12828796.0,13837872.0,15116400.0,16509303.0,17964175.0,19454366.0,20834586.0,22690938.0,24731256.0,24470341.0,51938004.0,34618273.0,33539975.0,35307362.0,33854398.0,43262153.0,33239567.0,34581602.0,38079560.0,37190004.0,39196121.0,41439007.0,45214454.0,52692402.0,84566651.0,81819636.0,175764715.0,69021524.0,64483921.0,74659844.0,87088671.0,61066938.0,73088726.0,62188662.0,97479725.0,71287929.0,76791498.0,73379120.0,72118482.0,72526746.0,74200748.0,69667915.0,70815119.0,73712764.0,129778210.0,104212871.0,92037879.0,89621704.0,94037949.0,98800282.0,93295515.0,99444742.0,96661099.0,207670202.0,119110134.0,124353249.0,133843290.0,98900375.0,99755899.0,104107496.0,115668505.0,121691129.0,133149960.0,126631987.0,118332600.0,113460003.0,118194027.0,116893945.0,117890680.0,120412950.0,121675553.0,142772487.0,125229628.0,129010023.0,123035780.0,142395818.0,152111201.0,127373286.0,130579969.0,129336934.0,145881032.0,142304156.0,170626431.0,176995000.0,136790746.0,129906996.0,140958540.0,164265694.0,170057358.0,144300927.0,139602643.0,140552634.0]}
```