proofs: expand EVMYulLean builtin bridge to cover signed operations#1725
proofs: expand EVMYulLean builtin bridge to cover signed operations#1725
Conversation
Adds 26 new native_decide bridge tests covering edge cases flagged by Bugbot's risk assessment of two's-complement semantic mismatches: - sdiv: INT256_MIN/-1 overflow, -1/-1, 0/-1, INT256_MIN/1, INT256_MAX/1 - smod: -neg/-neg, INT256_MIN/-1, INT256_MIN/1 - slt/sgt: neg×neg quadrant, INT256_MIN vs INT256_MAX, equal-value cases - sar: shift by 255 (positive/negative), saturated shift ≥256, INT256_MIN>>1 - signextend: byte positions 1, 15, 30; 0xFF all-ones, zero input Updates adapter report to schema v3 with adapter_correctness_proofs tracking and signed_bridge_lemma_status documentation. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
| \n### CI Failure Hints\n\nFailed jobs: `checks`\n\nCopy-paste local triage:\n```bash\nmake check\nlake build\nFOUNDRY_PROFILE=difftest forge test -vv\n``` |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 3a8e343c55
ℹ️ 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".
- Fix EvmYulLeanAdapterCorrectness.lean: remove `noncomputable` keyword (theorem subsumes it), remove for-loop proofs with unsolved goals, keep solid assign_equiv_let proofs and execYulFuel_stmts_nil helper - Update generate_evmyullean_adapter_report.py to natively produce schema v3 by parsing lookupPrimOp, evalPureBuiltinViaEvmYulLean, bridge lemmas, bridge tests, and correctness theorems from Lean sources - Regenerate adapter report artifact (112 tests, 31 primops, 21 pure builtins, 15 universal lemmas, correctness proofs tracked) Addresses Codex P1 review (schema mismatch) and CI build failure. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 016e11af23
ℹ️ 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".
- Only count bridge equivalence tests where both verityEval and bridgeEval appear in the same example block, excluding context-only tests, bridge-returns-none boundary checks, and adapter smoke tests - concrete_test_count: 96 (was 112 counting all native_decide) - concrete_bridge_tests: removed false-positive state-dependent builtins (address, blobbasefee, callvalue, chainid, number, timestamp) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Adds four theorems proving the adapter's for-loop init-hoisting transformation is semantics-preserving: - for_init_hoist: continue case (core equivalence) - for_init_hoist_revert/return/stop: halt cases Uses simp [execYulStmtFuel, execYulFuel, hinit] pattern matching existing Preservation.lean proof style. Takes init result as a hypothesis to avoid stuck reduction on execYulFuel with variable fuel. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Proves that Verity's signed comparison builtins (via Int256.toInt two's complement conversion) agree with EVMYulLean's UInt256.sltBool/sgtBool (MSB-based case analysis) on all inputs. Both systems use the 2^255 threshold for sign detection; the proof proceeds by case-splitting on the four sign combinations and showing each case produces identical results. New theorems: - slt_result_equiv: helper proving if-then-else equivalence for slt - sgt_result_equiv: helper proving if-then-else equivalence for sgt - evalBuiltinCall_slt_bridge: universal bridge for signed less-than - evalBuiltinCall_sgt_bridge: universal bridge for signed greater-than - evalBuiltinCallWithBackend_evmYulLean_slt_bridge - evalBuiltinCallWithBackend_evmYulLean_sgt_bridge This brings universal bridge lemma count from 15 to 17, covering the first two signed builtins. Remaining signed builtins (sdiv, smod, sar, signextend) require deeper Int256↔UInt256 algorithmic equivalence proofs. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…I timeout The sgt bridge normalization proof times out at the default 200k heartbeats because it sits one position deeper than slt in the evalPureBuiltinViaEvmYulLean match chain. Bumping to 400k resolves the deterministic timeout and the cascading unsolved-goal errors in evalBuiltinCall_sgt_bridge. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…meout - Add Nat.mod_eq_of_lt with UInt256.size bounds to EVMYulLean simp set so Fin.ofNat mod-reduction fully resolves before case analysis - Replace `split <;> split <;> simp_all <;> omega` with targeted `simp [Int.ofNat_lt]` (positive case) and `simp [Int.sub_lt_sub_iff_right, Int.ofNat_lt]` (negative case) - Add `set_option maxHeartbeats 400000` for bridge_eval_slt_normalized (same timeout fix already applied to sgt variant) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The slt/sgt universal bridge proofs had three categories of CI failures: 1. omega couldn't close goals after simp (Prop/Bool if mismatch) 2. bridge_eval_slt/sgt_normalized timed out (missing maxHeartbeats) 3. hmod_a/hmod_b proofs failed (evmModulus vs UInt256.size equivalence) Root cause: Lean 4's `ite` (Prop-based if) and `Bool.casesOn` (Bool-based if) are structurally different, and the proof strategy of case-splitting + omega couldn't bridge between Verity's Int comparison and EVMYulLean's Bool-returning sltBool/sgtBool. The 96 concrete bridge tests in EvmYulLeanBridgeTest.lean still validate these builtins at critical boundary values (INT256_MIN/MAX edges). Universal proofs are deferred to Phase 3 with local Lean development. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Previous approach failed because simp couldn't fully reduce Fin.ofNat
inside sltBool/sgtBool, leaving `a % UInt256.size` and `{ val := ↑a }`
terms that omega couldn't handle.
New approach: prove auxiliary lemmas that reduce UInt256 operations
to plain Nat before entering the case analysis:
- uint256_toNat_ofNat: toNat (ofNat a) = a % size
- uint256_toNat_ofNat_of_lt: toNat (ofNat a) = a when a < size
- uint256_lt_ofNat_iff: ofNat a < ofNat b ↔ a % size < b % size
- sltBool_ofNat_of_lt: characterize sltBool as pure Nat conditions
- sgtBool_ofNat_of_lt: characterize sgtBool as pure Nat conditions
With these, the result_equiv proofs use rw to replace sltBool/sgtBool
with Nat expressions, then match Verity's Int256 case analysis directly.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Previous attempt used Int.ofNat_lt, Int.sub_lt_sub_iff_right, and instLTUInt256/Fin.lt which don't exist in Lean 4.22.0. Also the propext-based rw pattern failed due to type mismatch. Changes: - Replace all Int.ofNat_lt usage with omega (handles Int/Nat conversion) - Replace Int.sub_lt_sub_iff_right with omega - Replace instLTUInt256/Fin.lt in uint256_lt_ofNat_iff with Fin.ofNat unfolding + simp_all in sltBool/sgtBool helpers - Remove propext rw pattern, use simp_all [Decidable.decide_eq_true_eq] - Add set_option maxHeartbeats 400000 for sltBool/sgtBool helpers Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
… heartbeats - Extract reusable `uint256_ofNat_mod_evmModulus` lemma using Fin.ext + Nat.mod_mod to prove UInt256.ofNat n = UInt256.ofNat (n % evmModulus) - Replace broken inline hmod_a/hmod_b proofs (unsolved ↑a = ↑(a % 2^256) goals) with the new helper - Increase bridge_eval_slt/sgt_normalized heartbeats from 400K to 8M (string-match chain traversal in evalPureBuiltinViaEvmYulLean) - Use simp only instead of simp for more predictable elaboration Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Move set_option maxHeartbeats before doc comments (Lean 4.22 requires set_option...in to precede doc comments, not follow them) - Fix Decidable.decide_eq_true_eq → decide_eq_true_eq (correct name in Lean 4.22 stdlib) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace `congr 1; constructor <;> intro h <;> omega` (which fails because `constructor` doesn't work on Prop equality `=`, only on `Iff`) with `split <;> split <;> first | rfl | omega` for the "both positive" and "both negative" cases. Replace `have : ...; simp [this]` with `split <;> first | rfl | omega` for the mixed-sign cases. Add `set_option maxHeartbeats 800000 in` before slt_result_equiv and sgt_result_equiv. Remove unused `ge_iff_le` from simp calls. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…in slt/sgt proofs The sltBool_ofNat_of_lt and sgtBool_ofNat_of_lt proofs had unsolved goals where simp_all couldn't reduce UInt256's `<`/`>` through the LT instance and Fin wrapper. Adding explicit reduction lemmas (proven by rfl) and including them in the simp set resolves this. Also increased heartbeats from 400K to 800K for these auxiliary proofs. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Every other universal bridge theorem (add, sub, mul, div, mod, etc.) has a corresponding @[simp] evalBuiltinCallWithBackend_evmYulLean_*_bridge wrapper. Adding the missing slt and sgt wrappers ensures simp can discharge evalBuiltinCallWithBackend .evmYulLean goals for all bridged signed comparison builtins. Addresses Cursor Bugbot review: "Missing evalBuiltinCallWithBackend wrapper lemmas for slt/sgt". Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Three categories of fixes: 1. sltBool_ofNat_of_lt / sgtBool_ofNat_of_lt: With uint256_lt_iff added to simp, the simp only call may fully close the goal before by_cases runs. Use `try by_cases` to handle both scenarios robustly. 2. slt_result_equiv / sgt_result_equiv "both positive" and "both negative" cases: Replace `split <;> split <;> first | rfl | omega` (omega can't handle Int.ofNat) with `simp only [... Int.ofNat_lt]` which rewrites `Int.ofNat a < Int.ofNat b` to `a < b`. For "both negative", also use `Int.sub_lt_sub_iff_right` to cancel the subtraction. 3. slt_result_equiv / sgt_result_equiv "mixed sign" cases: Replace `split <;> first | rfl | omega` with explicit `have` proofs using `lt_of_lt_of_le` and `Int.ofNat_nonneg` to show the comparison has a definite truth value (negative - modulus < 0 <= positive). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The previous theorem signatures referenced private definitions from EndToEnd.lean (paramLoadErasure) and used rcases rfl patterns that broke with the EVMYulLean fork. Simplify: - backends_agree_on_bridged_builtins: use plain sorry (was sorry anyway) - layer3_preserves_semantics_evmYulLean: simplify to trivial placeholder - evmYulLean_semantic_target_theorem: simplify to trivial placeholder - Fix unused variable warnings with underscore prefixes These theorems are Phase 4 scaffolding that was always sorry-backed. The full implementation will come when whole-program structural induction is completed. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Skip warnings originating from lake-packages or .lake/packages paths in the warning regression check. These come from dependencies and are outside our control — the EVMYulLean fork's cached lakefile triggers a nativeLibDir deprecation warning that we cannot suppress via the baseline (path is dynamic with cache hashes). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Remove orphaned doc comment that was left after simplifying the layer3_preserves_semantics_evmYulLean theorem. Two consecutive doc comments caused a Lean syntax error. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 6aa7bba9a9
ℹ️ 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".
…bridge Merge origin/main to pick up: - refactor: extract IRState.withTx and YulTransaction.ofIR helpers (#1733) - fix: link to the paper Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Complete the `exp_natModPow_eq_uint256Exp` proof by strong induction on the exponent, showing Verity's `modPowAux` loop matches EVMYulLean's `UInt256.powAux` via UInt256 Fin wrapping ≡ explicit `% modulus` on Nat. This required switching the EVMYulLean dependency to the lfglabs-dev fork (commit 7b54b8f) where `powAux` is made public. The proof introduces helper lemmas `uint256_mul_toNat`, `evmModulus_eq_uint256Size`, and `modPowAux_eq_powAux` (the induction core). Updates all 21 files (docs, artifacts, scripts, tests) to reflect 30 proven / 4 sorry'd bridge lemmas (was 29/5). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: f88f2dd8e5
ℹ️ 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".
…ry count from 5 to 4 The dispatch theorem is now sorry-free. Each of the 34 bridged builtins gets a per-builtin helper that case-splits argVals: right arity uses the context-lifted bridge lemma, wrong arity closes by rfl. The remaining 4 sorry's (sdiv/smod/sar/signextend) are isolated in BridgeLemmas.lean. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 339e3c9e24
ℹ️ 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".
Prove signextend_uint256_eq via bitwise extensionality with 15 helper lemmas covering UInt256 val extraction, sign condition conversion, and EVM arithmetic. The proof uses a 3-way case split (byteIdx>31, =31, ≤30) with nested sign-condition analysis. Remaining sorry's: sdiv, smod, sar. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 4d883fcbda
ℹ️ 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".
Prove sdiv_int256_eq_uint256Sdiv via 5-way case analysis: - b=0: both sides return 0 - PP (both positive): unsigned division equivalence - PN (positive/negative): negation via fin_val_mul_neg1, quotient split - NP (negative/positive): symmetric to PN - NN (both negative): double negation cancellation Key technical insight: omega cannot handle Int.ofNat (2^256) as an opaque expression. Adding explicit Int.ofNat_lt.mpr hypotheses provides omega with the Int-level bounds it needs. Remaining sorry's: smod, sar (blocked by private defs / bit semantics). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 977b607a96
ℹ️ 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".
…hardening
Replace three placeholder `True := by trivial` theorems in
`EvmYulLeanRetarget.lean` (`evalYulExpr_backend_equiv`,
`layer3_preserves_semantics_evmYulLean`, `evmYulLean_semantic_target_theorem`)
with genuine builtin-level equivalence statements that delegate to
`backends_agree_on_bridged_builtins`. These now express real (non-vacuous)
pointwise backend equivalence over the bridged builtin set.
Harden the supporting Python tooling:
* `check_lean_hygiene.py`: `THEOREM_RE`/`BOUNDARY_RE` accept `noncomputable`,
`protected`, `unsafe`, `partial`, and `@[attr]` modifier prefixes so the
sorry-allowlist backscan does not skip modifier-prefixed declarations.
* `check_bridge_coverage_sync.py`: match bridge theorem headers across line
breaks (`@[simp]\ntheorem evalBuiltinCall_*_bridge`) and attribute each
`sorry` to either its enclosing bridge theorem or to the next bridge that
uses a sorry-bearing helper, replacing the previous forward-only scan.
* `generate_evmyullean_adapter_report.py`:
- derive Phase 4 retarget status from actual `theorem` declarations
(with modifier support), not raw substring presence, and compute the
sorry status per theorem body rather than per file;
- mirror the corrected sorry-attribution algorithm so bridge admissions
are reported against the right builtin;
- only count bridge examples whose verity/bridge sides reference a
common builtin (mismatched blocks no longer inflate the concrete-test
total).
* `check_lean_warning_regression.py`: extend the dependency-path filter to
match relative paths (`.lake/packages/…`, `lake-packages/…`) in addition
to absolute ones.
* Update the `_parse_bridge_tests` mismatched-builtins test to match the
corrected semantics.
Also regenerates `artifacts/evmyullean_adapter_report.json` so that
`backends_agree_on_bridged_builtins` is now reported as "proven" rather than
"sorry (dispatch...)", reflecting the actual proof state.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Addresses Cursor Bugbot review: evalYulExpr_backend_equiv, layer3_preserves_semantics_evmYulLean, and evmYulLean_semantic_target_theorem were identical clones of backends_agree_on_bridged_builtins with names that overstate the guarantees (implying expression-level or Layer-3-composed equivalence that is not actually proven). Removing them leaves a single honest theorem for the pointwise backend equivalence result. - EvmYulLeanRetarget.lean: delete 3 redundant theorems, rewrite module header and Phase 4 summary to honestly describe the pointwise scope and list what remains for whole-program retargeting - PrintAxioms.lean: regenerate to drop deleted-theorem #print axioms - docs/ROADMAP.md, docs/VERIFICATION_STATUS.md, TRUST_ASSUMPTIONS.md, Compiler/Proofs/EndToEnd.lean: update narrative to "pointwise" framing - scripts/generate_evmyullean_adapter_report.py: drop the layer3_... field from Phase 4 report, rename status to "pointwise", add remaining_for_whole_program_retargeting list - scripts/check_proof_length.py: drop stale allowlist entry - artifacts/evmyullean_adapter_report.json: regenerate Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Issue #1722 requires that every divergence from upstream `NethermindEth/EVMYulLean` be minimal, visibility-preserving, and documented so auditors can review what Verity trusts beyond upstream Ethereum conformance coverage. This change makes the fork audit concrete and CI-enforced: * `scripts/generate_evmyullean_fork_audit.py` — new deterministic generator/checker that serializes a hand-maintained audit record into `artifacts/evmyullean_fork_audit.json`. The script cross-checks the pinned `evmyul` commit in `lake-manifest.json` against the audit record, failing closed if they drift. Also rejects any commit marked as `semantic-change` without explicit scope expansion. * `artifacts/evmyullean_fork_audit.json` — enumerates the exact divergence from `upstream/main`. At the current pin (`7b54b8f38bb68ee930d00d39c1b11dd60fb123c8`), the fork is 2 commits ahead and 0 behind: - `ed9215e` — expose `EvmYul.UInt256.powAux` (strip `private`). Required because Lean 4.22.0 disallows cross-module unfolding of private declarations (Lean 4 PR #8519). No behavior change. - `7b54b8f` — `nativeLibDir -> staticLibDir` in `lakefile.lean` (Lean 4.22.0 deprecation). No behavior change. Neither commit modifies EVM/Yul execution semantics, so upstream conformance test coverage applies transitively. * `TRUST_ASSUMPTIONS.md` — the "EVM/Yul Semantics and Gas" section now names the fork URL, references the audit artifact, and states the 2-commits-ahead / 0-behind divergence explicitly. * `Makefile` — `make check` now runs `generate_evmyullean_fork_audit.py --check` so any silent pin bump without audit regeneration fails CI. Moves Issue #1722's "fork audit" deliverable from implicit (scattered across memory notes) to explicit (on-disk, CI-checked, auditor- reviewable). No Lean code changes; no new `sorry`. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 6c2df25a82
ℹ️ 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".
Prove expression-level backend equivalence for BridgedExpr by adding a backend-parameterized Yul expression evaluator and composing nested call evaluation with backends_agree_on_bridged_builtins. Update adapter reports, docs, and PrintAxioms to distinguish expression-level retargeting from the remaining statement-level and Layer-3 work. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Extends EvmYulLean backend's `evalBuiltinCallViaEvmYulLean` to handle `sload` by returning `some (storage slot)` — definitionally equal to the Verity path `some (abstractLoadStorageOrMapping storage slot)` and witnessed (at the state level) by `storageLookup_projectStorage`. Changes: - `EvmYulLeanAdapter.lean`: add `sload` case to `evalBuiltinCallViaEvmYulLean`; rename `default` → `defaultCase` to avoid the reserved-word parse error that appears once `MappingSlot` is in the import chain. - `EvmYulLeanBridgeLemmas.lean`: add `evalBuiltinCall_sload_bridge`, promote the context-level `_sload_none` fallthrough to `_sload_bridge`, add `sload` to `bridgedBuiltins` (now 35) and drop it from `unbridgedBuiltins` (now just `mappingSlot`). - `EvmYulLeanRetarget.lean`: add `backends_agree_sload` helper and extend the master `backends_agree_on_bridged_builtins` dispatch proof to 35 cases. - Sync derived artifacts and docs: `PrintAxioms.lean`, adapter report, interpreter feature matrix, ROADMAP, VERIFICATION_STATUS, TRUST_ASSUMPTIONS, bridge matrix sync scripts, and the proof-length allowlist comment. No new sorry; dispatch proof remains sorry-free. Verified locally with `lake build Compiler.Proofs.YulGeneration.Backends.EvmYulLeanRetarget` and `make check`. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 1 potential issue.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit b9da909. Configure here.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: b9da9099fd
ℹ️ 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".
Introduce execYulFuelWithBackend as a statement-level mirror of execYulFuel that swaps expression evaluation through the selected builtin backend. Prove the .verity backend recovers the existing execYulFuel semantics, giving Layer 3 a stable executor hook for the future EVMYulLean statement induction without claiming statement-level backend equality yet. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- update the sload context bridge smoke test to assert backend equivalence now that sload is bridged\n- downgrade Phase 4 report status when retarget theorem bodies contain sorry\n- add regression coverage for admitted retarget theorem status\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 1cf42c4f07
ℹ️ 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".

Summary
lookupPrimOpfrom 19 to 35 builtins mapped to EVMYulLeanOperationconstructors — addssdiv,smod,slt,sgt,sar,signextend,addmod,mulmod,exp,byte,address,caller,callvalue,calldataload,calldatasize,timestamp,number,chainid,blobbasefee,sloadevalPureBuiltinViaEvmYulLeanfrom 16 to 25 pure builtins evaluated via EVMYulLean'sUInt256operations — addssdiv,smod,slt,sgt,sar,signextend,addmod,mulmod,expEvmYulLeanAdapterCorrectness.leanwith proven semantic preservation for assign→let rebinding and for-loop init-hoisting (7 theorems)addmod,mulmod,exp,byteto Verity'sevalBuiltinCallWithContext(30→34 builtins)EvmYulLeanStateBridge.leanwith Phase 2 state bridge scaffolding (type-level conversions, storage round-trip proofs, env field bridge proofs, 0 sorry)evalBuiltinCallWithBackendContextlevel with arbitrary context valuesnonefor state-dependent builtinslookup_primop_mapped,eval_pure_bridged,universal_bridge_lemmas,concrete_bridge_tests, andconcrete_test_countinventoriesPURE_BUILTINStracking to all 25 pure builtins with doc-sync enforcementCloses #1722 (partial — Phase 1 adapter expansion + Phase 2 scaffolding)
Context
This is the first PR toward issue #1722 (replacing custom Yul semantics with EVMYulLean as compilation target). It lays the groundwork by expanding the adapter infrastructure to cover all builtins in the capability report's allowed overlap set.
Bridge coverage
add,sub,mul,div,mod,eq,iszero,lt,gt,and,or,xor,not,shl,shr,addmod,mulmod,byteevalBuiltinCallWithBackendContextlevel with arbitrary context (key for Phase 4)nonefor delegated builtins (11 at pure level + 11 at dispatcher level)evalBuiltinCallWithBackendContext_evmYulLean_pure_bridge) for Phase 4 retargetingnative_decidetests only:slt,sgt,sdiv,smod,sar,signextend,expsload,caller,address,callvalue,timestamp,calldataload,calldatasize,number,chainid,blobbasefee,mappingSlotState bridge (Phase 2)
YulStateand EVMYulLeanSharedState .YulstorageLookup_projectStorage)callvalue,timestamp,number,caller,address)TransCmpinstance forUInt256(needed for RBMap operations)Deferred to Phase 3
Universal bridge proofs for signed builtins (
slt,sgt,sdiv,smod,sar,signextend) andexprequire locallake builditeration:Int256.toIntwhile EVMYulLean uses sign-bit case analysis —omegacannot close the intermediate Int/Nat goalsexp: Verity usesnatModPow(repeated squaring) while EVMYulLean usesUInt256.exp— needs inductive proof on the recursive structureTest plan
make checkpassesbuildstep compiles all Lean codechecksstep validates sorry allowlist, proof length, doc sync, and coverage🤖 Generated with Claude Code
Note
Medium Risk
Substantial changes in proof infrastructure and backend-dispatch equivalence for many Yul builtins, including new context/state bridging and two remaining
sorry-backed core equivalences (smod,sar) that could mask semantic mismatches.Overview
Extends the EVMYulLean adapter/bridge from a small arithmetic subset to full backend coverage:
lookupPrimOpandevalPureBuiltinViaEvmYulLeannow handle signed ops (sdiv,smod,slt,sgt,sar,signextend), modular/exponent/byte ops (addmod,mulmod,exp,byte), and additional context/state builtins, withevalBuiltinCallViaEvmYulLeanbridgingcalldataload,sload, andmappingSlotvia shared helpers.Adds large new proof surface in
EvmYulLeanBridgeLemmas.lean, providing universal bridge lemmas and context-lifted equivalence theorems atevalBuiltinCallWithBackendContextlevel, plus inventories (bridgedBuiltinscovers 36 builtins) and a new Phase 4 moduleEvmYulLeanRetarget.leanthat proves pointwise backend agreement on bridged builtins and lifts it to a bridged-expression evaluator (statement-level whole-program lift is explicitly left pending).Introduces
EvmYulLeanAdapterCorrectness.leanproving the adapter’s non-trivial rewrites (assign→let_,for_init-hoisting) preserve execution results, tightens thecalldatasizeproof to normalize modulo2^256, and updates docs/tests to reflect the expanded bridge (many newnative_decidebridge tests and updatedAXIOMS.md/EndToEnd.leanPhase 4 notes).Reviewed by Cursor Bugbot for commit 318821e. Bugbot is set up for automated code reviews on this repo. Configure here.