Skip to content

proofs: expose native EVMYulLean transition target#1743

Open
Th0rgal wants to merge 75 commits intomainfrom
codex/native-evmyullean-transition
Open

proofs: expose native EVMYulLean transition target#1743
Th0rgal wants to merge 75 commits intomainfrom
codex/native-evmyullean-transition

Conversation

@Th0rgal
Copy link
Copy Markdown
Member

@Th0rgal Th0rgal commented Apr 22, 2026

Summary

  • expose Native.interpretIRRuntimeNative as the executable native EVMYulLean target for emitted IR runtime Yul
  • preserve pre-existing event history when projecting native EVMYulLean results back to YulResult
  • close the executable/source-surface migration blockers reported against the transition: environment accessors, mapping-struct storage agreement, overloaded function identity, direct helper-call lowering, packed full-word storage writes, and dynamic arrays of static tuple elements
  • document the clean transition plan from the backend-parameterized Verity interpreter to native EvmYul.Yul.callDispatcher

Fixed issues

Closes #1738.
Closes #1739.
Closes #1740.
Closes #1741.
Closes #1742.
Closes #1744.
Closes #1745.

Refs #1737.
Refs #1722.

Why

PR #1735 was only a docs/sync cleanup and did not close the native-runtime work from #1722. The current public theorem target still runs through interpretYulRuntimeWithBackend .evmYulLean, which uses Verity's custom Yul statement interpreter with EVMYulLean-backed builtins. That bridge is useful, but it is not the simpler final architecture requested in #1737.

This PR is now the native transition foundation plus the reported frontend/executable parity fixes needed before the remaining work can focus on the native public theorem target.

What changed

  • Added the native IR-runtime harness entry point Native.interpretIRRuntimeNative over EvmYul.Yul.callDispatcher.
  • Added result/state projection coverage for storage, events, environment fields, halt/revert/error behavior, and explicit observable storage slots.
  • Fixed verity_contract environment reads such as blockTimestamp, blockNumber, chainid, blobbasefee, contractAddress, msgSender, and msgValue, including executable .run state reads.
  • Aligned mapping-struct executable helpers with the compiler/native abstract mapping-slot formula, including packed member masking.
  • Introduced signature-based function identity for overloads while preserving Solidity-facing names for selectors and ABI dispatch.
  • Confirmed direct function-name calls are the user-facing internal-helper surface; explicit internalCall/internalCallAssign remain only lower-level compilation-model IR.
  • Added first-class packed full-word storage writes through setPackedStorage root offset word, lowering to Stmt.setStorageWord / sstore(root.slot + offset, word).
  • Added dynamic array support for static tuple elements on arrayLength/arrayElement; dynamic element arrays such as Array String and Array Bytes still fail closed.
  • Updated docs and CI guards so the repo does not claim native EVMYulLean is authoritative before the public theorem target flips.

Remaining work for #1737

  • prove native lowering invariants for dispatcher/function partitioning and builtin primop lowering
  • prove native state bridge lemmas for calldata, selector, caller/source, callvalue, address, block fields, storage, transient storage, memory, and returndata
  • prove result projection lemmas for normal values, stop, return, revert rollback, logs, and hard native errors
  • widen executable native coverage for dispatcher selection, memory-heavy return/revert/log paths, returndata, external calls, static-call permissions, and mapping helper lowering
  • introduce a public preservation theorem targeting Native.interpretIRRuntimeNative or a total wrapper around it
  • only then move execYulFuel / execYulFuelWithBackend to reference-oracle status and update trust-boundary docs accordingly

Validation

  • lake build Contracts.Smoke
  • lake build Contracts.MacroTranslateInvariantTest
  • lake build Contracts.MacroTranslateRoundTripFuzz
  • lake build Compiler.Proofs.YulGeneration.Backends.EvmYulLeanNativeHarness Compiler.Proofs.YulGeneration.Backends.EvmYulLeanNativeSmokeTest
  • python3 scripts/check_selectors.py
  • python3 -m unittest scripts/test_native_transition_api.py scripts/test_check_native_transition_doc.py scripts/test_check_selectors.py -v
  • python3 -m unittest scripts/test_generate_macro_property_tests.py -v
  • python3 scripts/check_macro_property_test_generation.py
  • python3 scripts/check_lean_hygiene.py
  • python3 scripts/check_verification_status_doc.py
  • python3 scripts/check_layer2_boundary_sync.py
  • python3 scripts/check_layer2_boundary_catalog_sync.py
  • python3 scripts/check_docs_workflow_sync.py
  • git diff --check
  • make check

Note

Medium Risk
Touches compiler IR, validation, and Yul codegen helpers around storage writes and ABI array bounds, which can affect generated contract semantics. Native harness additions are mostly additive but increase coupling to EVMYulLean execution/projection behavior.

Overview
Adds a new executable native EVMYulLean runtime target (Native.interpretIRRuntimeNative) built on EvmYul.Yul.callDispatcher, including a much more complete state/result projection that preserves prior events and a large native_decide smoke-test suite to validate lowering, dispatch, environment/storage/log semantics, and failure-closed behavior.

Extends the compilation model/IR with packed-word capabilities: Expr.arrayElementWord (checked word access inside static-width array elements) and Stmt.setStorageWord (write to field.slot + offset), plus new Yul helpers for word-indexed array loads, updated array-length bounds checks for multi-word elements, and updated validation/usage/trust-surface tracking for the new constructors.

Tightens ABI/dispatch correctness by deduping external functions by full functionSignature (not just name), and updates docs + the fork conformance workflow to include building the new native harness/smoke tests. Contract-side support is adjusted with new packed/struct slot helpers (setPackedStorage, structMemberAt/setStructMemberAt, etc.) and minor API cleanup (environment builtins now return Contract values; to params renamed to toAddr).

Reviewed by Cursor Bugbot for commit e01b323. Bugbot is set up for automated code reviews on this repo. Configure here.

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: fc6b2b9c8a

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread Compiler/Proofs/YulGeneration/Backends/EvmYulLeanNativeHarness.lean Outdated
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 22, 2026

\n### CI Failure Hints\n\nFailed jobs: `build`\n\nCopy-paste local triage:\n```bash\nmake check\nlake build\nFOUNDRY_PROFILE=difftest forge test -vv\n```

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 20e7b900ca

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread Verity/Macro/Translate.lean
Comment thread Verity/Macro/Translate.lean
Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 20e7b900ca

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread Verity/Macro/Translate.lean
Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: f85598c41a

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread Verity/Macro/Translate.lean Outdated
$(← translatePureExprWithTypes fields constDecls immutableDecls params locals offset))
| _ =>
match matchLocalFunctionApp? functions rhs with
match ← resolveLocalFunctionApp? fields constDecls immutableDecls #[] functions params locals rhs with
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Thread externals into local-call overload resolution

resolveLocalFunctionApp? infers argument types via inferPureExprType, but this translation path passes #[] as externalDecls. When a local helper call in a bind source includes an externalCall argument (which is valid and can pass earlier type validation), this second inference run cannot resolve the external and fails during translation with an unsupported/unknown external error. That creates a compile-time regression for contracts that wrap externals inside internal helper calls; the resolver here needs the actual external declarations (and the same fix at the other #[] call sites).

Useful? React with 👍 / 👎.

Copy link
Copy Markdown

@cursor cursor Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit e01b323. Configure here.

match firstDuplicateName (spec.functions.map functionSignature) with
| some dup =>
throw s!"Compilation error: duplicate function name '{dup}' in {spec.name}"
throw s!"Compilation error: duplicate function signature '{dup}' in {spec.name}"
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Signature-based duplicate check misses same-name internal functions

Medium Severity

The duplicate function check changed from comparing names (·.name) to comparing full signatures (functionSignature). This means two functions sharing the same name but with different parameter types now pass validation. For internal functions, this is unsafe — compileInternalFunction emits Yul funcDef statements keyed by name, so same-name internal functions would produce duplicate Yul function definitions regardless of their parameter types.

Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit e01b323. Configure here.

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: e01b323750

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +2530 to +2533
exprs := exprs.push (← `(Compiler.CompilationModel.Expr.arrayElementWord
$(strTerm paramName)
$indexExpr
$(natTerm elementWords)
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Evaluate tuple arrayElement index exactly once

Tuple destructuring for arrayElement expands into one Expr.arrayElementWord per member, each reusing $indexExpr directly, so the index expression is re-evaluated for every field. If the index contains call-like operations (e.g., call, delegatecall, externalCall), this duplicates side effects and can even read different tuple elements across fields, which diverges from the source-level arrayElement semantics that should evaluate the index once before destructuring.

Useful? React with 👍 / 👎.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment