  As smart contracts gain adoption in financial transactions, it becomes
increasingly important to ensure that they are free of bugs and security
vulnerabilities. Of particular relevance in this context are arithmetic
overflow bugs, as integers are often used to represent financial assets like
account balances. Motivated by this observation, this paper presents SolType, a
refinement type system for Solidity that can be used to prevent arithmetic
over- and under-flows in smart contracts. SolType allows developers to add
refinement type annotations and uses them to prove that arithmetic operations
do not lead to over- and under-flows. SolType incorporates a rich vocabulary of
refinement terms that allow expressing relationships between integer values and
aggregate properties of complex data structures. Furthermore, our
implementation, called Solid, incorporates a type inference engine and can
automatically infer useful type annotations, including non-trivial contract
invariants.
  To evaluate the usefulness of our type system, we use Solid to prove
arithmetic safety of a total of 120 smart contracts. When used in its fully
automated mode (i.e., using Solid's type inference capabilities), Solid is able
to eliminate 86.3% of redundant runtime checks used to guard against overflows.
We also compare Solid against a state-of-the-art arithmetic safety verifier
called VeriSmart and show that Solid has a significantly lower false positive
rate, while being significantly faster in terms of verification time.
