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.3.tar.gz (112.5 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.3-py3-none-any.whl (111.9 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: solpython-0.1.3.tar.gz
  • Upload date:
  • Size: 112.5 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.3.tar.gz
Algorithm Hash digest
SHA256 fccc1c5a7635ea01bb63cd63bdfaff5414f8c41b25af6679eb371e957fad09f6
MD5 0e50cf22561cbb3e316c44c6d5c3c06c
BLAKE2b-256 f9ef68627b4f5b6a33316f8bc91e95ac8ae76b98189c65f7440f3f73eed8998c

See more details on using hashes here.

File details

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

File metadata

  • Download URL: solpython-0.1.3-py3-none-any.whl
  • Upload date:
  • Size: 111.9 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.3-py3-none-any.whl
Algorithm Hash digest
SHA256 ff50e9a0328c539c72aeb7745562ecaf84e145bf6def4d54b98598d7383d8558
MD5 aa72502f9a163d2c4c110ff1b8607744
BLAKE2b-256 104913a2511ab2ab529c31aa1deb7ad4e0a5f3ffe1cfeb99937d1bfb796ee1bf

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