Repository files navigation

This repository contains a formal model of the EVM and Yul in Lean 4. Where applicable, the underlying EVM primops are used directly by the Yul model.

Everything here is work in progress and is subject to change therefore.

Requirements

  • Python packages: coincurve, typing-extensions, pycryptodome, eth-typing, py-ecc

Project structure

Primops

The Operation describing all of the primitive operations:

EvmYul/Operations.lean

The semantic function primCall associated with the ADT:

EvmYul/Yul/PrimOps.lean

EVM

The model of the EVM state EVM.State:

EvmYul/EVM/State.lean

The semantic function step:

EvmYul/EVM/Semantics.lean

Yul

The ADT Stmt mutually defined with Expr and FunctionDefinition describing Yul:

EvmYul/Yul/Ast.lean

The model of the Yul state YUL.State:

EvmYul/Yul/State.lean

The semantic function exec mutually defined with eval (and some misc. functions):

EvmYul/Yul/Interpreter.lean

Conformance testing

A git submodule with EVM conformance tests is in:

EthereumTests/

The test running infrastructure can be found in:

Conform/

To execute conformance tests, make sure the EthereumTests directory is the appropriate git submodule and run:

lake test -- <NUM_THREADS> 2> out_discard.txt

where <NUM_THREADS> is the number of threads running conformance tests in parallel. Note that the default is 1. We recommend redirecting stderr into a file to not pollute the output.

Yul semantics tests

To execute the Yul semantics tests run:

lake exe yulSemanticsTests

These tests are defined in EvmYul/Yul/YulSemanticsTests/Main.lean.

Limitations of the Yul semantics

Fallback function from receiving ether

  • We do not run a the fallback function of a smart contract when it receives ether, such as being a recipient of ether in a SELFDESTRUCT of another contract.

Gas

  • We do not model gas in the Yul semantics, no fee is deducted.

Create

  • We do not model create or create2 because Yul code is not stored as bytecode, and so we cannot properly model create or create2 without some mechanism for correctly decompiling bytecode into Yul code, so we do not model this.
  • This case is caught by the the _ in the match statement in EVMYul/Semantics.lean and returns default.
  • Instead of creating contracts, they should be manually included in the modelled blockchain state, in the accountMap. See EvmYul/Yul/YulSemanticsTests/README.md for more information on how to include custom Solidity contracts in the modelled blockchain state.

EXTCODESIZE

  • Not modelled, the current semantics raise an error. Solidity checks extcodesize and so generated Yul will not be able to call other contracts without removing or editing these extcodesize checks (manually).
  • In the EvmYul/Yul/YulSemanticsTests.lean we manually changed let _1 := extcodesize( 2) to let _1 := 1 in fun_testStoreAndRetrieveExternal.

Other contract code related opcodes not modelled

  • We also do not model EXTCODEHASH, EXTCODECOPY, CODECOPY, CODESIZE for similar reasons to not modelling EXTCODESIZE.
  • These cases are caught by the the _ in the match statement in EVMYul/Semantics.lean and return default.

SELFDESTRUCT

  • Halting for SELFDESTRUCT is not implemented and the semantics for SELFDESTRUCT have limitations, such as not triggering the fallback function in a contract that is the recipient of the ether from the contract the self-destructs. We may remove the semantics for SELFDESTRUCT once its status changes from deprecated to not being supported.

About

Executable formal model of the EVM and Yul in Lean 4.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

This repository contains a formal model of the EVM and Yul in Lean 4. Where applicable, the underlying EVM primops are used directly by the Yul model.

Everything here is work in progress and is subject to change therefore.

Requirements

  • Python packages: coincurve, typing-extensions, pycryptodome, eth-typing, py-ecc

Project structure

Primops

The Operation describing all of the primitive operations:

EvmYul/Operations.lean

The semantic function primCall associated with the ADT:

EvmYul/Yul/PrimOps.lean

EVM

The model of the EVM state EVM.State:

EvmYul/EVM/State.lean

The semantic function step:

EvmYul/EVM/Semantics.lean

Yul

The ADT Stmt mutually defined with Expr and FunctionDefinition describing Yul:

EvmYul/Yul/Ast.lean

The model of the Yul state YUL.State:

EvmYul/Yul/State.lean

The semantic function exec mutually defined with eval (and some misc. functions):

EvmYul/Yul/Interpreter.lean

Conformance testing

A git submodule with EVM conformance tests is in:

EthereumTests/

The test running infrastructure can be found in:

Conform/

To execute conformance tests, make sure the EthereumTests directory is the appropriate git submodule and run:

lake test -- <NUM_THREADS> 2> out_discard.txt

where <NUM_THREADS> is the number of threads running conformance tests in parallel. Note that the default is 1. We recommend redirecting stderr into a file to not pollute the output.

Yul semantics tests

To execute the Yul semantics tests run:

lake exe yulSemanticsTests

These tests are defined in EvmYul/Yul/YulSemanticsTests/Main.lean.

Limitations of the Yul semantics

Fallback function from receiving ether

  • We do not run a the fallback function of a smart contract when it receives ether, such as being a recipient of ether in a SELFDESTRUCT of another contract.

Gas

  • We do not model gas in the Yul semantics, no fee is deducted.

Create

  • We do not model create or create2 because Yul code is not stored as bytecode, and so we cannot properly model create or create2 without some mechanism for correctly decompiling bytecode into Yul code, so we do not model this.
  • This case is caught by the the _ in the match statement in EVMYul/Semantics.lean and returns default.
  • Instead of creating contracts, they should be manually included in the modelled blockchain state, in the accountMap. See EvmYul/Yul/YulSemanticsTests/README.md for more information on how to include custom Solidity contracts in the modelled blockchain state.

EXTCODESIZE

  • Not modelled, the current semantics raise an error. Solidity checks extcodesize and so generated Yul will not be able to call other contracts without removing or editing these extcodesize checks (manually).
  • In the EvmYul/Yul/YulSemanticsTests.lean we manually changed let _1 := extcodesize( 2) to let _1 := 1 in fun_testStoreAndRetrieveExternal.

Other contract code related opcodes not modelled

  • We also do not model EXTCODEHASH, EXTCODECOPY, CODECOPY, CODESIZE for similar reasons to not modelling EXTCODESIZE.
  • These cases are caught by the the _ in the match statement in EVMYul/Semantics.lean and return default.

SELFDESTRUCT

  • Halting for SELFDESTRUCT is not implemented and the semantics for SELFDESTRUCT have limitations, such as not triggering the fallback function in a contract that is the recipient of the ether from the contract the self-destructs. We may remove the semantics for SELFDESTRUCT once its status changes from deprecated to not being supported.

About

Executable formal model of the EVM and Yul in Lean 4.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

This repository contains a formal model of the EVM and Yul in Lean 4. Where applicable, the underlying EVM primops are used directly by the Yul model.

Everything here is work in progress and is subject to change therefore.

Requirements

  • Python packages: coincurve, typing-extensions, pycryptodome, eth-typing, py-ecc

Project structure

Primops

The Operation describing all of the primitive operations:

EvmYul/Operations.lean

The semantic function primCall associated with the ADT:

EvmYul/Yul/PrimOps.lean

EVM

The model of the EVM state EVM.State:

EvmYul/EVM/State.lean

The semantic function step:

EvmYul/EVM/Semantics.lean

Yul

The ADT Stmt mutually defined with Expr and FunctionDefinition describing Yul:

EvmYul/Yul/Ast.lean

The model of the Yul state YUL.State:

EvmYul/Yul/State.lean

The semantic function exec mutually defined with eval (and some misc. functions):

EvmYul/Yul/Interpreter.lean

Conformance testing

A git submodule with EVM conformance tests is in:

EthereumTests/

The test running infrastructure can be found in:

Conform/

To execute conformance tests, make sure the EthereumTests directory is the appropriate git submodule and run:

lake test -- <NUM_THREADS> 2> out_discard.txt

where <NUM_THREADS> is the number of threads running conformance tests in parallel. Note that the default is 1. We recommend redirecting stderr into a file to not pollute the output.

Yul semantics tests

To execute the Yul semantics tests run:

lake exe yulSemanticsTests

These tests are defined in EvmYul/Yul/YulSemanticsTests/Main.lean.

Limitations of the Yul semantics

Fallback function from receiving ether

  • We do not run a the fallback function of a smart contract when it receives ether, such as being a recipient of ether in a SELFDESTRUCT of another contract.

Gas

  • We do not model gas in the Yul semantics, no fee is deducted.

Create

  • We do not model create or create2 because Yul code is not stored as bytecode, and so we cannot properly model create or create2 without some mechanism for correctly decompiling bytecode into Yul code, so we do not model this.
  • This case is caught by the the _ in the match statement in EVMYul/Semantics.lean and returns default.
  • Instead of creating contracts, they should be manually included in the modelled blockchain state, in the accountMap. See EvmYul/Yul/YulSemanticsTests/README.md for more information on how to include custom Solidity contracts in the modelled blockchain state.

EXTCODESIZE

  • Not modelled, the current semantics raise an error. Solidity checks extcodesize and so generated Yul will not be able to call other contracts without removing or editing these extcodesize checks (manually).
  • In the EvmYul/Yul/YulSemanticsTests.lean we manually changed let _1 := extcodesize( 2) to let _1 := 1 in fun_testStoreAndRetrieveExternal.

Other contract code related opcodes not modelled

  • We also do not model EXTCODEHASH, EXTCODECOPY, CODECOPY, CODESIZE for similar reasons to not modelling EXTCODESIZE.
  • These cases are caught by the the _ in the match statement in EVMYul/Semantics.lean and return default.

SELFDESTRUCT

  • Halting for SELFDESTRUCT is not implemented and the semantics for SELFDESTRUCT have limitations, such as not triggering the fallback function in a contract that is the recipient of the ether from the contract the self-destructs. We may remove the semantics for SELFDESTRUCT once its status changes from deprecated to not being supported.

About

Executable formal model of the EVM and Yul in Lean 4.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

This repository contains a formal model of the EVM and Yul in Lean 4. Where applicable, the underlying EVM primops are used directly by the Yul model.

Everything here is work in progress and is subject to change therefore.

Requirements

  • Python packages: coincurve, typing-extensions, pycryptodome, eth-typing, py-ecc

Project structure

Primops

The Operation describing all of the primitive operations:

EvmYul/Operations.lean

The semantic function primCall associated with the ADT:

EvmYul/Yul/PrimOps.lean

EVM

The model of the EVM state EVM.State:

EvmYul/EVM/State.lean

The semantic function step:

EvmYul/EVM/Semantics.lean

Yul

The ADT Stmt mutually defined with Expr and FunctionDefinition describing Yul:

EvmYul/Yul/Ast.lean

The model of the Yul state YUL.State:

EvmYul/Yul/State.lean

The semantic function exec mutually defined with eval (and some misc. functions):

EvmYul/Yul/Interpreter.lean

Conformance testing

A git submodule with EVM conformance tests is in:

EthereumTests/

The test running infrastructure can be found in:

Conform/

To execute conformance tests, make sure the EthereumTests directory is the appropriate git submodule and run:

lake test -- <NUM_THREADS> 2> out_discard.txt

where <NUM_THREADS> is the number of threads running conformance tests in parallel. Note that the default is 1. We recommend redirecting stderr into a file to not pollute the output.

Yul semantics tests

To execute the Yul semantics tests run:

lake exe yulSemanticsTests

These tests are defined in EvmYul/Yul/YulSemanticsTests/Main.lean.

Limitations of the Yul semantics

Fallback function from receiving ether

  • We do not run a the fallback function of a smart contract when it receives ether, such as being a recipient of ether in a SELFDESTRUCT of another contract.

Gas

  • We do not model gas in the Yul semantics, no fee is deducted.

Create

  • We do not model create or create2 because Yul code is not stored as bytecode, and so we cannot properly model create or create2 without some mechanism for correctly decompiling bytecode into Yul code, so we do not model this.
  • This case is caught by the the _ in the match statement in EVMYul/Semantics.lean and returns default.
  • Instead of creating contracts, they should be manually included in the modelled blockchain state, in the accountMap. See EvmYul/Yul/YulSemanticsTests/README.md for more information on how to include custom Solidity contracts in the modelled blockchain state.

EXTCODESIZE

  • Not modelled, the current semantics raise an error. Solidity checks extcodesize and so generated Yul will not be able to call other contracts without removing or editing these extcodesize checks (manually).
  • In the EvmYul/Yul/YulSemanticsTests.lean we manually changed let _1 := extcodesize( 2) to let _1 := 1 in fun_testStoreAndRetrieveExternal.

Other contract code related opcodes not modelled

  • We also do not model EXTCODEHASH, EXTCODECOPY, CODECOPY, CODESIZE for similar reasons to not modelling EXTCODESIZE.
  • These cases are caught by the the _ in the match statement in EVMYul/Semantics.lean and return default.

SELFDESTRUCT

  • Halting for SELFDESTRUCT is not implemented and the semantics for SELFDESTRUCT have limitations, such as not triggering the fallback function in a contract that is the recipient of the ether from the contract the self-destructs. We may remove the semantics for SELFDESTRUCT once its status changes from deprecated to not being supported.

About

Executable formal model of the EVM and Yul in Lean 4.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

This repository contains a formal model of the EVM and Yul in Lean 4. Where applicable, the underlying EVM primops are used directly by the Yul model.

Everything here is work in progress and is subject to change therefore.

Requirements

  • Python packages: coincurve, typing-extensions, pycryptodome, eth-typing, py-ecc

Project structure

Primops

The Operation describing all of the primitive operations:

EvmYul/Operations.lean

The semantic function primCall associated with the ADT:

EvmYul/Yul/PrimOps.lean

EVM

The model of the EVM state EVM.State:

EvmYul/EVM/State.lean

The semantic function step:

EvmYul/EVM/Semantics.lean

Yul

The ADT Stmt mutually defined with Expr and FunctionDefinition describing Yul:

EvmYul/Yul/Ast.lean

The model of the Yul state YUL.State:

EvmYul/Yul/State.lean

The semantic function exec mutually defined with eval (and some misc. functions):

EvmYul/Yul/Interpreter.lean

Conformance testing

A git submodule with EVM conformance tests is in:

EthereumTests/

The test running infrastructure can be found in:

Conform/

To execute conformance tests, make sure the EthereumTests directory is the appropriate git submodule and run:

lake test -- <NUM_THREADS> 2> out_discard.txt

where <NUM_THREADS> is the number of threads running conformance tests in parallel. Note that the default is 1. We recommend redirecting stderr into a file to not pollute the output.

Yul semantics tests

To execute the Yul semantics tests run:

lake exe yulSemanticsTests

These tests are defined in EvmYul/Yul/YulSemanticsTests/Main.lean.

Limitations of the Yul semantics

Fallback function from receiving ether

  • We do not run a the fallback function of a smart contract when it receives ether, such as being a recipient of ether in a SELFDESTRUCT of another contract.

Gas

  • We do not model gas in the Yul semantics, no fee is deducted.

Create

  • We do not model create or create2 because Yul code is not stored as bytecode, and so we cannot properly model create or create2 without some mechanism for correctly decompiling bytecode into Yul code, so we do not model this.
  • This case is caught by the the _ in the match statement in EVMYul/Semantics.lean and returns default.
  • Instead of creating contracts, they should be manually included in the modelled blockchain state, in the accountMap. See EvmYul/Yul/YulSemanticsTests/README.md for more information on how to include custom Solidity contracts in the modelled blockchain state.

EXTCODESIZE

  • Not modelled, the current semantics raise an error. Solidity checks extcodesize and so generated Yul will not be able to call other contracts without removing or editing these extcodesize checks (manually).
  • In the EvmYul/Yul/YulSemanticsTests.lean we manually changed let _1 := extcodesize( 2) to let _1 := 1 in fun_testStoreAndRetrieveExternal.

Other contract code related opcodes not modelled

  • We also do not model EXTCODEHASH, EXTCODECOPY, CODECOPY, CODESIZE for similar reasons to not modelling EXTCODESIZE.
  • These cases are caught by the the _ in the match statement in EVMYul/Semantics.lean and return default.

SELFDESTRUCT

  • Halting for SELFDESTRUCT is not implemented and the semantics for SELFDESTRUCT have limitations, such as not triggering the fallback function in a contract that is the recipient of the ether from the contract the self-destructs. We may remove the semantics for SELFDESTRUCT once its status changes from deprecated to not being supported.

About

Executable formal model of the EVM and Yul in Lean 4.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

This repository contains a formal model of the EVM and Yul in Lean 4. Where applicable, the underlying EVM primops are used directly by the Yul model.

Everything here is work in progress and is subject to change therefore.

Requirements

  • Python packages: coincurve, typing-extensions, pycryptodome, eth-typing, py-ecc

Project structure

Primops

The Operation describing all of the primitive operations:

EvmYul/Operations.lean

The semantic function primCall associated with the ADT:

EvmYul/Yul/PrimOps.lean

EVM

The model of the EVM state EVM.State:

EvmYul/EVM/State.lean

The semantic function step:

EvmYul/EVM/Semantics.lean

Yul

The ADT Stmt mutually defined with Expr and FunctionDefinition describing Yul:

EvmYul/Yul/Ast.lean

The model of the Yul state YUL.State:

EvmYul/Yul/State.lean

The semantic function exec mutually defined with eval (and some misc. functions):

EvmYul/Yul/Interpreter.lean

Conformance testing

A git submodule with EVM conformance tests is in:

EthereumTests/

The test running infrastructure can be found in:

Conform/

To execute conformance tests, make sure the EthereumTests directory is the appropriate git submodule and run:

lake test -- <NUM_THREADS> 2> out_discard.txt

where <NUM_THREADS> is the number of threads running conformance tests in parallel. Note that the default is 1. We recommend redirecting stderr into a file to not pollute the output.

Yul semantics tests

To execute the Yul semantics tests run:

lake exe yulSemanticsTests

These tests are defined in EvmYul/Yul/YulSemanticsTests/Main.lean.

Limitations of the Yul semantics

Fallback function from receiving ether

  • We do not run a the fallback function of a smart contract when it receives ether, such as being a recipient of ether in a SELFDESTRUCT of another contract.

Gas

  • We do not model gas in the Yul semantics, no fee is deducted.

Create

  • We do not model create or create2 because Yul code is not stored as bytecode, and so we cannot properly model create or create2 without some mechanism for correctly decompiling bytecode into Yul code, so we do not model this.
  • This case is caught by the the _ in the match statement in EVMYul/Semantics.lean and returns default.
  • Instead of creating contracts, they should be manually included in the modelled blockchain state, in the accountMap. See EvmYul/Yul/YulSemanticsTests/README.md for more information on how to include custom Solidity contracts in the modelled blockchain state.

EXTCODESIZE

  • Not modelled, the current semantics raise an error. Solidity checks extcodesize and so generated Yul will not be able to call other contracts without removing or editing these extcodesize checks (manually).
  • In the EvmYul/Yul/YulSemanticsTests.lean we manually changed let _1 := extcodesize( 2) to let _1 := 1 in fun_testStoreAndRetrieveExternal.

Other contract code related opcodes not modelled

  • We also do not model EXTCODEHASH, EXTCODECOPY, CODECOPY, CODESIZE for similar reasons to not modelling EXTCODESIZE.
  • These cases are caught by the the _ in the match statement in EVMYul/Semantics.lean and return default.

SELFDESTRUCT

  • Halting for SELFDESTRUCT is not implemented and the semantics for SELFDESTRUCT have limitations, such as not triggering the fallback function in a contract that is the recipient of the ether from the contract the self-destructs. We may remove the semantics for SELFDESTRUCT once its status changes from deprecated to not being supported.

About

Executable formal model of the EVM and Yul in Lean 4.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

This repository contains a formal model of the EVM and Yul in Lean 4. Where applicable, the underlying EVM primops are used directly by the Yul model.

Everything here is work in progress and is subject to change therefore.

Requirements

  • Python packages: coincurve, typing-extensions, pycryptodome, eth-typing, py-ecc

Project structure

Primops

The Operation describing all of the primitive operations:

EvmYul/Operations.lean

The semantic function primCall associated with the ADT:

EvmYul/Yul/PrimOps.lean

EVM

The model of the EVM state EVM.State:

EvmYul/EVM/State.lean

The semantic function step:

EvmYul/EVM/Semantics.lean

Yul

The ADT Stmt mutually defined with Expr and FunctionDefinition describing Yul:

EvmYul/Yul/Ast.lean

The model of the Yul state YUL.State:

EvmYul/Yul/State.lean

The semantic function exec mutually defined with eval (and some misc. functions):

EvmYul/Yul/Interpreter.lean

Conformance testing

A git submodule with EVM conformance tests is in:

EthereumTests/

The test running infrastructure can be found in:

Conform/

To execute conformance tests, make sure the EthereumTests directory is the appropriate git submodule and run:

lake test -- <NUM_THREADS> 2> out_discard.txt

where <NUM_THREADS> is the number of threads running conformance tests in parallel. Note that the default is 1. We recommend redirecting stderr into a file to not pollute the output.

Yul semantics tests

To execute the Yul semantics tests run:

lake exe yulSemanticsTests

These tests are defined in EvmYul/Yul/YulSemanticsTests/Main.lean.

Limitations of the Yul semantics

Fallback function from receiving ether

  • We do not run a the fallback function of a smart contract when it receives ether, such as being a recipient of ether in a SELFDESTRUCT of another contract.

Gas

  • We do not model gas in the Yul semantics, no fee is deducted.

Create

  • We do not model create or create2 because Yul code is not stored as bytecode, and so we cannot properly model create or create2 without some mechanism for correctly decompiling bytecode into Yul code, so we do not model this.
  • This case is caught by the the _ in the match statement in EVMYul/Semantics.lean and returns default.
  • Instead of creating contracts, they should be manually included in the modelled blockchain state, in the accountMap. See EvmYul/Yul/YulSemanticsTests/README.md for more information on how to include custom Solidity contracts in the modelled blockchain state.

EXTCODESIZE

  • Not modelled, the current semantics raise an error. Solidity checks extcodesize and so generated Yul will not be able to call other contracts without removing or editing these extcodesize checks (manually).
  • In the EvmYul/Yul/YulSemanticsTests.lean we manually changed let _1 := extcodesize( 2) to let _1 := 1 in fun_testStoreAndRetrieveExternal.

Other contract code related opcodes not modelled

  • We also do not model EXTCODEHASH, EXTCODECOPY, CODECOPY, CODESIZE for similar reasons to not modelling EXTCODESIZE.
  • These cases are caught by the the _ in the match statement in EVMYul/Semantics.lean and return default.

SELFDESTRUCT

  • Halting for SELFDESTRUCT is not implemented and the semantics for SELFDESTRUCT have limitations, such as not triggering the fallback function in a contract that is the recipient of the ether from the contract the self-destructs. We may remove the semantics for SELFDESTRUCT once its status changes from deprecated to not being supported.

About

Executable formal model of the EVM and Yul in Lean 4.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

This repository contains a formal model of the EVM and Yul in Lean 4. Where applicable, the underlying EVM primops are used directly by the Yul model.

Everything here is work in progress and is subject to change therefore.

Requirements

  • Python packages: coincurve, typing-extensions, pycryptodome, eth-typing, py-ecc

Project structure

Primops

The Operation describing all of the primitive operations:

EvmYul/Operations.lean

The semantic function primCall associated with the ADT:

EvmYul/Yul/PrimOps.lean

EVM

The model of the EVM state EVM.State:

EvmYul/EVM/State.lean

The semantic function step:

EvmYul/EVM/Semantics.lean

Yul

The ADT Stmt mutually defined with Expr and FunctionDefinition describing Yul:

EvmYul/Yul/Ast.lean

The model of the Yul state YUL.State:

EvmYul/Yul/State.lean

The semantic function exec mutually defined with eval (and some misc. functions):

EvmYul/Yul/Interpreter.lean

Conformance testing

A git submodule with EVM conformance tests is in:

EthereumTests/

The test running infrastructure can be found in:

Conform/

To execute conformance tests, make sure the EthereumTests directory is the appropriate git submodule and run:

lake test -- <NUM_THREADS> 2> out_discard.txt

where <NUM_THREADS> is the number of threads running conformance tests in parallel. Note that the default is 1. We recommend redirecting stderr into a file to not pollute the output.

Yul semantics tests

To execute the Yul semantics tests run:

lake exe yulSemanticsTests

These tests are defined in EvmYul/Yul/YulSemanticsTests/Main.lean.

Limitations of the Yul semantics

Fallback function from receiving ether

  • We do not run a the fallback function of a smart contract when it receives ether, such as being a recipient of ether in a SELFDESTRUCT of another contract.

Gas

  • We do not model gas in the Yul semantics, no fee is deducted.

Create

  • We do not model create or create2 because Yul code is not stored as bytecode, and so we cannot properly model create or create2 without some mechanism for correctly decompiling bytecode into Yul code, so we do not model this.
  • This case is caught by the the _ in the match statement in EVMYul/Semantics.lean and returns default.
  • Instead of creating contracts, they should be manually included in the modelled blockchain state, in the accountMap. See EvmYul/Yul/YulSemanticsTests/README.md for more information on how to include custom Solidity contracts in the modelled blockchain state.

EXTCODESIZE

  • Not modelled, the current semantics raise an error. Solidity checks extcodesize and so generated Yul will not be able to call other contracts without removing or editing these extcodesize checks (manually).
  • In the EvmYul/Yul/YulSemanticsTests.lean we manually changed let _1 := extcodesize( 2) to let _1 := 1 in fun_testStoreAndRetrieveExternal.

Other contract code related opcodes not modelled

  • We also do not model EXTCODEHASH, EXTCODECOPY, CODECOPY, CODESIZE for similar reasons to not modelling EXTCODESIZE.
  • These cases are caught by the the _ in the match statement in EVMYul/Semantics.lean and return default.

SELFDESTRUCT

  • Halting for SELFDESTRUCT is not implemented and the semantics for SELFDESTRUCT have limitations, such as not triggering the fallback function in a contract that is the recipient of the ether from the contract the self-destructs. We may remove the semantics for SELFDESTRUCT once its status changes from deprecated to not being supported.

About

Executable formal model of the EVM and Yul in Lean 4.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages