Skip to content

SMTChecker and Formal Verification ​

The Solidity compiler has a built-in formal verification module called the SMTChecker. This module can be used to automatically prove properties of smart contracts.

💡 NeoVM Difference

The standard solc SMTChecker module operates specifically on the behavioral constraints of the EVM (like 256-bit arithmetic boundaries and sequential storage slots).

Neo DevPack for Solidity does not currently include the SMTChecker.

Because NeoVM uses arbitrary-precision integers (BigInteger) internally, Neo DevPack for Solidity implements fixed-width overflow behavior with compiler/runtime guards rather than native EVM word overflow. Standard EVM SMTChecker results are therefore not a direct proof for generated NeoVM artifacts; use them as source-level hints and validate arithmetic behavior with Neo DevPack for Solidity tests.

Verification on Neo ​

Currently, verifying Neo DevPack for Solidity contracts requires external auditing tools or testing frameworks. We recommend utilizing the tooling/ packages in this repository (like @neo-devpack-solidity/hardhat-solc-neo) to run extensive unit and integration tests against local Neo-Express nodes.

Future iterations of the compiler may introduce Neo-specific constraint checkers for static analysis, specifically regarding:

  1. Manifest Permission Wildcards: Validating that all cross-contract calls are strictly bounded.
  2. Witness Checks: Statically analyzing functions to ensure Runtime.checkWitness is executed prior to any state-mutating operations.

MIT Licensed