  This paper describes Slither, a static analysis framework designed to provide
rich information about Ethereum smart contracts. It works by converting
Solidity smart contracts into an intermediate representation called SlithIR.
SlithIR uses Static Single Assignment (SSA) form and a reduced instruction set
to ease implementation of analyses while preserving semantic information that
would be lost in transforming Solidity to bytecode. Slither allows for the
application of commonly used program analysis techniques like dataflow and
taint tracking. Our framework has four main use cases: (1) automated detection
of vulnerabilities, (2) automated detection of code optimization opportunities,
(3) improvement of the user's understanding of the contracts, and (4)
assistance with code review.
  In this paper, we present an overview of Slither, detail the design of its
intermediate representation, and evaluate its capabilities on real-world
contracts. We show that Slither's bug detection is fast, accurate, and
outperforms other static analysis tools at finding issues in Ethereum smart
contracts in terms of speed, robustness, and balance of detection and false
positives. We compared tools using a large dataset of smart contracts and
manually reviewed results for 1000 of the most used contracts.
