- Solidity versions
- Unlocked pragma
- Multiple Solidity pragma
- Incorrect access control
- Unprotected withdraw function
- Unprotected call to selfdestruct
- Modifier side-effects
- Incorrect modifier
- Constructor names
- Void constructor
- Implicit constructor callValue check
- Controlled delegatecall
- Reentrancy vulnerabilities
- ERC777 callbacks and reentrancy
- Avoid transfer(), send() as reentrancy mitigations
- Private on-chain data
- Weak PRNG
- Block values as time proxies
- Integer overflow, underflow
- Divide before multiply
- Transaction order dependence
- ERC20 approve() race condition
- Signature malleability
- ERC20 transfer() does not return boolean
- Incorrect return values for ERC721 ownerOf()
- Unexpected Ether and this.balance
- fallback vs receive()
- Dangerous strict equalities
- Locked Ether
- Dangerous usage of tx.origin
- Contract check
- Deleting a mapping within a struct
- Tautology or contradiction
- Boolean constant
- Boolean equality
- State-modifying functions
- Return values of low-level calls
- Account existence check for low-level calls
- Dangerous shadowing
- Dangerous state variable shadowing
- Pre-declaration usage of local variables
- Costly operations inside a loop
- Calls inside a loop
- DoS with block gas limit
- Missing events
- Unindexed event parameters
- Incorrect event signature in libraries
- Dangerous unary expressions
- Missing zero address validation
- Critical address change
- assert(), require() state change
- require() vs assert()
- Deprecated keywords
- Function default visibility
- Incorrect inheritance order
- Missing inheritance
- Insufficient gas griefing
- Modifying reference type parameters
- Arbitrary jump with function type variable
- Hash collisions with multiple variable length arguments
- Malleability risk from dirty high order bits
- Incorrect shift in assembly
- Assembly usage
- Right-To-Left-Override control character (U+202E)
- Constant state variables
- Similar variable names
- Uninitialized state, local variables
- Uninitialized storage pointers
- Uninitialized function pointers in constructors
- Long number literals
- Out-of-range enum
- Uncalled public functions
- Dead, Unreachable code
- Unused return values
- Unused variables
- Redundant statements
- Storage array with signed Integers with ABIEncoderV2
- Dynamic constructor arguments clipped with ABIEncoderV2
- Storage array with multiSlot element with ABIEncoderV2
- Calldata structs with statically sized and dynamically encoded members with ABIEncoderV2
- Packed storage with ABIEncoderV2
- Incorrect loads with Yul optimizer and ABIEncoderV2
- Array slice dynamically encoded base type with ABIEncoderV2
- Missing escaping in formatting with ABIEncoderV2
- Double shift size overflow
- Incorrect byte instruction optimization
- Essential assignments removed with Yul Optimizer
- Private methods overridden
- Tuple assignment multi stack slot components
- Dynamic array cleanup
- Empty byte array copy
- Memory array creation overflow
- Calldata using for
- Free function redefinition
- Unprotected initializers in proxy-based upgradeable contracts
- Initializing state-variables in proxy-based upgradeable contracts
- Import upgradeable contracts in proxy-based upgradeable contracts
- Avoid selfdestruct or delegatecall in proxy-based upgradeable contracts
- State variables in proxy-based upgradeable contracts
- Function ID collision between proxy, implementation in proxy-based upgradeable contracts
- Function shadowing between proxy, contract in proxy-based upgradeable contracts