You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
# Δ Sindi: Semantic Invariant Differencing for Solidity Smart Contracts
2
2
3
-
SInDi compares two Solidity boolean predicates (e.g., the guards in `require`/`assert`) and decides whether they are **equivalent**, **one is stronger**, or **unrelated**. It’s designed to survive real-world Solidity syntax variations across versions and frameworks (e.g., OpenZeppelin patterns) by normalizing source, tokenizing, parsing to an AST, and reasoning over the structure.
3
+
Sindi compares two Solidity boolean predicates (e.g., the guards in `require`/`assert`) and decides whether they are **equivalent**, **one is stronger**, or **unrelated**. It’s designed to survive real-world Solidity syntax variations across versions and frameworks (e.g., OpenZeppelin patterns) by normalizing source, tokenizing, parsing to an AST, and reasoning over the structure.
4
4
5
5
---
6
6
7
-
## Why SInDi?
7
+
## Why Sindi?
8
8
9
-
***Contract evolution:** When you refactor or upgrade a contract (proxy patterns, library changes, Solidity version bumps), the *same* invariant often appears in a different syntactic form. SInDi checks whether behavior is preserved.
10
-
***Invariant denoising:** Auto-mined invariants can be redundant or weak. SInDi helps find equivalences and strength relationships to keep only the strongest set.
11
-
***Fast iteration:** The API lets you run individual stages (rewrite → tokenize → parse → simplify → compare), so you can see what SInDi “understands” at each step.
9
+
***Contract evolution:** When you refactor or upgrade a contract (proxy patterns, library changes, Solidity version bumps), the *same* invariant often appears in a different syntactic form. Sindi checks whether behavior is preserved.
10
+
***Invariant denoising:** Auto-mined invariants can be redundant or weak. Sindi helps find equivalences and strength relationships to keep only the strongest set.
11
+
***Fast iteration:** The API lets you run individual stages (rewrite → tokenize → parse → simplify → compare), so you can see what Sindi “understands” at each step.
12
12
13
13
---
14
14
@@ -48,7 +48,7 @@ SInDi compares two Solidity boolean predicates (e.g., the guards in `require`/`a
48
48
### From PyPI
49
49
50
50
```bash
51
-
pip install sindi
51
+
pip install Sindi
52
52
```
53
53
54
54
### From source (this repo)
@@ -70,11 +70,11 @@ We pin SymPy in `requirements.txt`. The full comparator uses `z3-solver` (alread
70
70
The new CLI is exposed by `main.py` with subcommands:
A lightweight comparator (no Z3, purely structural/rewrites/AST reasoning) can be provided at:
194
194
195
195
```
196
-
src/sindi/comparator_rules.py
196
+
src/Sindi/comparator_rules.py
197
197
```
198
198
199
199
If present, the CLI gains `--light`. Some **light** tests (`tests/test_cli_light.py`) will run only if this file exists; otherwise they are skipped. The **full** test suite does not require it.
0 commit comments