Skip to main content

Python-to-EVM compiler — run Python on-chain via a Solidity smart contract pipeline

Project description

solpython

A Python-to-EVM compiler written entirely in Solidity. Feed it Python source code as a string, get EVM-compatible bytecode out — no off-chain tooling required.

644 tests across 46 test suites.

Architecture

Six-phase compiler pipeline, each phase implemented as a Solidity contract:

Python source (string)
       │
       ▼
  ┌──────────┐
  │  Lexer   │  Tokenizes source into token stream
  └────┬─────┘
       │ Token[]
       ▼
  ┌──────────┐
  │  Parser  │  Recursive descent → AST (struct array in storage)
  └────┬─────┘
       │ ASTNode[]
       ▼
  ┌───────────────┐
  │   Semantic    │  Symbol table, scope resolution, type inference
  │   Analyzer    │
  └────┬──────────┘
       │
       ▼
  ┌───────────────┐
  │     Code      │  AST → custom stack-based bytecode
  │   Generator   │
  └────┬──────────┘
       │ bytes (bytecode)
       ▼
  ┌──────────┐
  │    VM    │  Stack machine executes bytecode
  └──────────┘

Alternative backends:

  • Solidity Backend — AST → Solidity source code transpiler
  • Yul Backend — AST → Yul IR transpiler

Supported Python Features

Core:

  • Integer arithmetic (+, -, *, /, //, %, **) with negative numbers
  • Augmented assignment (+=, -=, *=, /=)
  • Comparisons (==, !=, <, >, <=, >=, is, is not)
  • Chained comparisons (a < b < c)
  • Boolean operators (and, or, not)
  • Ternary expressions (a if cond else b)
  • if / elif / else
  • while loops
  • for loops with range(), list iteration, break, continue
  • for...else / while...else
  • Function definitions with recursion, default parameters, keyword arguments
  • Nested function definitions
  • return statements
  • pass statement

Data Types:

  • Integers (tagged, -2^62 to 2^62-1)
  • Booleans (True, False) with proper tagging
  • None type with safety checks
  • Strings with methods (upper, lower, split, contains, charAt, slice)
  • Lists with indexing, negative indexing, len(), append()
  • Dicts with string/int keys, items(), values(), get(), update()
  • Sets with add(), remove(), in operator
  • Tuples with unpacking (a, b = 1, 2)
  • Float (6-digit fixed-point)

Builtins:

  • print() — integer and string output
  • len(), type(), isinstance()
  • range(), enumerate(), zip()
  • map(), filter()
  • sorted(), reversed()
  • abs(), min(), max()
  • f-strings and %s/%d formatting

Advanced:

  • try / except / finally / raise
  • class with methods, self, single inheritance
  • import / from...import with static linking
  • global / nonlocal keywords
  • Virtual file system (VFS) for module loading
  • Garbage collection (reference counting)
  • Constant folding and dead code elimination
  • Structured error messages with line/column info

Build & Test

Requires Foundry.

forge build          # compile
forge test           # run all 644 tests
forge test -vvv      # verbose output
forge test --match-test testFibonacci   # run a single test

Example

def fib(n):
    if n <= 1:
        return n
    return fib(n - 1) + fib(n - 2)

print(fib(10))  # → 55

This compiles to bytecode that runs entirely on-chain via the Solidity VM contract.

Project Structure

src/
  types/                  AST node, token, and type info structs
  libraries/              String utility library
  phases/
    Lexer.sol             Tokenizer
    Parser.sol            Recursive descent parser
    SemanticAnalyzer.sol  Symbol table, scope resolution
    CodeGenerator.sol     AST → bytecode
    VM.sol                Stack-based bytecode interpreter
    SolidityBackend.sol   AST → Solidity source transpiler
    YulBackend.sol        AST → Yul IR transpiler
  optimizer/
    ConstantFolder.sol    Compile-time constant folding
  gc/
    RefCounter.sol        Reference counting GC
  vfs/
    VFS.sol               Virtual file system
  venv/
    Venv.sol              Compilation environment
  PythonCompiler.sol      Top-level orchestrator

test/
  46 test suites covering lexer, parser, semantic analysis,
  code generation, VM execution, and end-to-end integration.

  Key files:
    Integration.t.sol     End-to-end compiler tests (fibonacci, fizzbuzz, bubble sort)
    E2E.t.sol             Feature-specific end-to-end tests
    TypeClassify.t.sol    Type system and tagging verification
    Exception.t.sol       Exception handling tests
    GC.t.sol              Garbage collection tests

Value Tagging

The VM uses a tagged value system to distinguish types:

Type Tag Range
Integer (none) -2^62 to 2^62-1
Boolean BOOL_OFFSET (2^66) 2^66 (False), 2^66+1 (True)
None NONE_VALUE Fixed sentinel
Float Tag at bits 252-255 6-digit fixed-point
List ID 0 to 2^60-1 GC-tracked
Dict ID 2^60 to 2^61-1 GC-tracked
Set ID 2^61 to 2^62-1 GC-tracked
String ID >= 2^62 Static + runtime

Known Limitations

  • No generators/iterators
  • No class inheritance beyond single-level
  • No closures (inner functions cannot capture outer variables)
  • Float arithmetic uses 6-digit fixed-point, not IEEE 754
  • GC is reference counting only (no cycle detection)
  • Solidity/Yul backends don't support all features (see BACKEND_LIMITATIONS.md)

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

solpython-0.1.2.tar.gz (112.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

solpython-0.1.2-py3-none-any.whl (111.7 kB view details)

Uploaded Python 3

File details

Details for the file solpython-0.1.2.tar.gz.

File metadata

  • Download URL: solpython-0.1.2.tar.gz
  • Upload date:
  • Size: 112.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.5

File hashes

Hashes for solpython-0.1.2.tar.gz
Algorithm Hash digest
SHA256 cb09c2f59812b810863a10bf711309ce440f6f28d6e3353d4bfe943a28eac916
MD5 eca7f0ee55657178ca00e8a025a2e519
BLAKE2b-256 87b12b9da18b30f8df7b1e90288361f278fee35b7a4c7102b47059d6f3f7e635

See more details on using hashes here.

File details

Details for the file solpython-0.1.2-py3-none-any.whl.

File metadata

  • Download URL: solpython-0.1.2-py3-none-any.whl
  • Upload date:
  • Size: 111.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.5

File hashes

Hashes for solpython-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 5493f0e0291b61abd5cf56f7867630460e92091d90856149cfe1c75ebffa19d1
MD5 b5c99013066d0e413a82254f130b6c6f
BLAKE2b-256 4f1aa87b1b5ba8ad85cebda1e4460f90dce681ed616bb608fa97f45bd76b06dd

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page