Skip to content

Commit

Permalink
Update hardhat config lookup, add address_balance analyzer
Browse files Browse the repository at this point in the history
  • Loading branch information
camden-smallwood committed Jan 18, 2023
1 parent 2c79a43 commit 0332aca
Show file tree
Hide file tree
Showing 3 changed files with 121 additions and 11 deletions.
107 changes: 107 additions & 0 deletions solast/src/analysis/address_balance.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
use solidity::ast::*;

pub struct AddressBalanceVisitor;

impl AddressBalanceVisitor {
fn print_message(
&mut self,
contract_definition: &ContractDefinition,
definition_node: &ContractDefinitionNode,
source_line: usize,
expression: &dyn std::fmt::Display,
external: bool,
) {
match definition_node {
ContractDefinitionNode::FunctionDefinition(function_definition) => println!(
"\tL{}: The {} {} in the `{}` {} contains `{}` usage, which can be optimized with assembly: `{}`",

source_line,

function_definition.visibility,

if let FunctionKind::Constructor = function_definition.kind {
"constructor".to_string()
} else {
format!("`{}` {}", function_definition.name, function_definition.kind)
},

contract_definition.name,
contract_definition.kind,

expression,

if external {
"assembly { bal := balance(addr); }"
} else {
"assembly { bal := selfbalance(); }"
}
),

ContractDefinitionNode::ModifierDefinition(modifier_definition) => println!(
"\tL{}: The `{}` modifier in the `{}` {} contains `{}` usage, which can be optimized with assembly: `{}`",

source_line,

modifier_definition.name,

contract_definition.name,
contract_definition.kind,

expression,

if external {
"assembly { bal := balance(addr); }"
} else {
"assembly { bal := selfbalance(); }"
}
),

_ => {}
}
}
}

impl AstVisitor for AddressBalanceVisitor {
fn visit_member_access<'a, 'b>(&mut self, context: &mut MemberAccessContext<'a, 'b>) -> std::io::Result<()> {
if context.member_access.member_name != "balance" {
return Ok(())
}

let (expression, arguments) = match context.member_access.expression.as_ref() {
Expression::FunctionCall(FunctionCall {
expression,
arguments,
..
}) if arguments.len() == 1 => (expression, arguments),

_ => return Ok(())
};

match expression.as_ref() {
Expression::ElementaryTypeNameExpression(ElementaryTypeNameExpression {
type_name: TypeName::ElementaryTypeName(ElementaryTypeName {
name,
..
}),
..
}) if name == "address" => {}

_ => return Ok(())
}

if let Some(Expression::Identifier(Identifier {
name,
..
})) = arguments.first() {
self.print_message(
context.contract_definition,
context.definition_node,
context.current_source_unit.source_line(context.member_access.src.as_str())?,
expression,
name != "this"
);
}

Ok(())
}
}
19 changes: 10 additions & 9 deletions solast/src/analysis/mod.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
mod abi_encoding;
mod abstract_contracts;
mod address_balance;
mod assert_usage;
mod assignment_comparisons;
mod check_effects_interactions;
Expand Down Expand Up @@ -39,15 +40,15 @@ mod unrestricted_setter_functions;
mod unused_return;

pub use self::{
abi_encoding::*, abstract_contracts::*, assert_usage::*, assignment_comparisons::*,
check_effects_interactions::*, comparison_utilization::*, divide_before_multiply::*,
explicit_variable_return::*, external_calls_in_loop::*, floating_solidity_version::*,
ineffectual_statements::*, inline_assembly::*, invalid_using_for_directives::*,
large_literals::*, manipulatable_balance_usage::*, missing_return::*, no_spdx_identifier::*,
node_modules_imports::*, redundant_assignments::*, redundant_comparisons::*,
redundant_getter_function::*, redundant_imports::*, redundant_state_variable_access::*,
require_without_message::*, safe_erc20_functions::*, secure_ether_transfer::*,
selfdestruct_usage::*, source_unit::*, state_variable_mutability::*,
abi_encoding::*, abstract_contracts::*, address_balance::*, assert_usage::*,
assignment_comparisons::*, check_effects_interactions::*, comparison_utilization::*,
divide_before_multiply::*, explicit_variable_return::*, external_calls_in_loop::*,
floating_solidity_version::*, ineffectual_statements::*, inline_assembly::*,
invalid_using_for_directives::*, large_literals::*, manipulatable_balance_usage::*,
missing_return::*, no_spdx_identifier::*, node_modules_imports::*, redundant_assignments::*,
redundant_comparisons::*, redundant_getter_function::*, redundant_imports::*,
redundant_state_variable_access::*, require_without_message::*, safe_erc20_functions::*,
secure_ether_transfer::*, selfdestruct_usage::*, source_unit::*, state_variable_mutability::*,
state_variable_shadowing::*, storage_array_loop::*, tight_variable_packing::*,
unchecked_casting::*, unchecked_erc20_transfer::*, unnecessary_pragmas::*,
unpaid_payable_functions::*, unreferenced_state_variables::*, unrestricted_setter_functions::*,
Expand Down
6 changes: 4 additions & 2 deletions solast/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ const VISITOR_TYPES: &[VisitorEntry] = &[
("redundant_assignments", || Box::new(analysis::RedundantAssignmentsVisitor)),
("invalid_using_for_directives", || Box::new(analysis::InvalidUsingForDirectivesVisitor)),
("abi_encoding", || Box::new(analysis::AbiEncodingVisitor::default())),
("address_balance", || Box::new(analysis::AddressBalanceVisitor)),
];

fn main() -> io::Result<()> {
Expand Down Expand Up @@ -111,7 +112,8 @@ fn main() -> io::Result<()> {
let mut source_units: Vec<SourceUnit> = vec![];

let brownie_config_path = path.join("brownie-config.yaml");
let hardhat_config_path = path.join("hardhat.config.js");
let hardhat_config_js_path = path.join("hardhat.config.js");
let hardhat_config_ts_path = path.join("hardhat.config.ts");
let truffle_config_path = path.join("truffle-config.js");

if brownie_config_path.is_file() {
Expand Down Expand Up @@ -152,7 +154,7 @@ fn main() -> io::Result<()> {
}
}
}
} else if hardhat_config_path.is_file() {
} else if hardhat_config_js_path.is_file() || hardhat_config_ts_path.is_file() {
let build_path = path.join("artifacts").join("build-info");

if !build_path.exists() || !build_path.is_dir() {
Expand Down

0 comments on commit 0332aca

Please sign in to comment.