<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>ZKsync</title>
        <link>https://paragraph.com/@zksync</link>
        <description>The elastic chain network: an ever expanding verifiable blockchain network, secured by math. 

Previous posts: https://blog.matter-labs.io</description>
        <lastBuildDate>Wed, 16 Sep 2026 07:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <image>
            <title>ZKsync</title>
            <url>https://storage.googleapis.com/papyrus_images/b1a5be2e5552881564b08e588bd6b5c6dc96d31957c0e0161b45585f141271b3.png</url>
            <link>https://paragraph.com/@zksync</link>
        </image>
        <copyright>All rights reserved</copyright>
        <item>
            <title><![CDATA[Introducing the ZK Stack's Atlas upgrade: beyond 15K TPS with one-second ZK finality.]]></title>
            <link>https://paragraph.com/@zksync/introducing-the-zk-stack-s-atlas-upgrade-beyond-15k-tps-with-one-second-zk-finality</link>
            <guid>XFVuBkCUzup3AizOc256</guid>
            <pubDate>Tue, 07 Oct 2025 10:47:22 GMT</pubDate>
            <description><![CDATA[Today, the ZKsync team is excited to share details of the Atlas upgrade for the ZK Stack, which provides a major step forward towards the vision of a network of sovereign chains, secured by cryptography and powering the global economy. This release delivers a high-performance, low-latency sequencer, support for multiple VM configurations (including full EVM equivalence), and integration with Airbender, the world’s most performant open source RISC-V proof system, for one-second finality with Z...]]></description>
            <content:encoded><![CDATA[<p>Today, the ZKsync team is excited to share details of the <strong>Atlas upgrade for the ZK Stack</strong>, which provides a major step forward towards the vision of a network of sovereign chains, secured by cryptography and powering the global economy.</p><p>This release delivers a <strong>high-performance</strong>, <strong>low-latency sequencer</strong>, support for <strong>multiple VM</strong> configurations (including full EVM equivalence), and integration with Airbender, the world’s most performant open source RISC-V proof system, for <strong>one-second finality with ZK proofs</strong>.</p><h1 id="h-global-markets-are-moving-onchain" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Global markets are moving onchain</h1><p>Increasingly, businesses, institutions, and nations are embracing blockchains as a significant component of their financial infrastructure. Just this year we have seen:</p><ul><li><p><strong>Regulatory clarity is unlocking payment use cases.</strong> With clearer rulesets arriving in major markets (such as the GENIUS Act in the US) and improved banking connectivity, we’re seeing significant momentum for payments and stablecoins.</p></li><li><p><strong>Major growth in onchain RWAs.</strong> <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="http://rwa.xyz/">rwa.xyz</a> is tracking &gt;<strong>$30B</strong> in tokenized real-world assets on public chains (excluding stablecoins), with sustained month-over-month growth across issuers and holders. Tradable has facilitated 38 private credit deals on ZKsync representing an active loan book of $2.1B.</p></li><li><p><strong>Tokenized funds at scale.</strong> BlackRock’s tokenized U.S. Treasury fund (BUIDL) <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.coindesk.com/business/2025/03/13/blackrock-s-buidl-fund-tops-usd1b-with-ethena-s-usd200m-allocation">crossed <strong>$1B AUM</strong></a> on Ethereum in March 2025.</p></li><li><p><strong>Institutional private chains on Ethereum.</strong> Deutsche Bank is working with <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://mementoblockchain.com/"><strong>Memento</strong></a> on tokenized asset infrastructure - an example of regulated, privacy-preserving domains that still anchor to public liquidity.</p></li><li><p><strong>Mainstream fintechs are moving onchain.</strong> Robinhood and Stripe have both recently announced plans to launch their own blockchains as they look to add support for tokenization and stablecoins</p></li></ul><p>We believe this trajectory will continue, and that we’re heading towards a world in which business and institutions routinely participate in the digital asset economy via systems they control, deployed as part of their internal infrastructure. These systems will be configured differently to support specific use-cases, but will still need to integrate across a single network, able to exchange value with cryptographic guarantees of correctness.</p><p>ZKsync, and the ZK Stack, are designed for this future. ZKsync connects public and private chains into one cryptographically secure network, made incorruptible by ZK, and connected to the billions in onchain liquidity via Ethereum. The ZK Stack is a toolkit for deploying these high performance chains, providing builders with control over options related to privacy, economics, and access.</p><hr><h1 id="h-the-zk-stacks-atlas-upgrade" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">The ZK Stack’s Atlas upgrade</h1><p>The Atlas upgrade going live is the culmination of several major projects by the ZKsync team.</p><h3 id="h-a-high-performance-sequencer-capable-of-greater15k-tps" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">A high-performance sequencer, capable of &gt;15K TPS</h3><p>Firstly, we are introducing a new transaction sequencer, designed from the ground up around three dimensions: <strong>improving throughput</strong> (including resilience to traffic bursts), <strong>reducing</strong> <strong>latency</strong> (for rapid tx inclusion), and <strong>system</strong> <strong>simplicity</strong>.</p><p>Some of the most impactful decisions included:</p><ul><li><p>We stripped all unnecessary functionality out of the sequencer, with a specific focus on <strong>minimizing synchronous persistence</strong>. The sequencer does not know about batches or L1, and is supported instead by separate asynchronous components.</p></li><li><p>We <strong>enforced strong separation between aspects of the system’s state.</strong> This included the state needed to execute the VM, the state required by the APIs, and the state required to generate the ZK proof or to verify it on L1, reducing unnecessary overhead on components.</p></li><li><p><strong>We made it easy to replay blocks.</strong> The sequencer is fully idempotent, and other components have been optimized to reduce unnecessary computational work. This allows for a more resilient system with better developer experience.</p></li></ul><p>The first results are already very exciting!</p><p>Before we get into the numbers, it is important to remember that transactions per second (TPS) <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://x.com/bkiepuszewski/status/1719441292197830928">is a flawed metric</a> for profiling these systems; the computational resources required to execute a transaction vary depending on what it is doing. Gas/second has been proposed as a better metric, but for some systems this has a similar issue. The EVM’s gas prices are intended to directly price the computational work of Ethereum, but this strong coupling isn’t preserved when you also prove the transaction.</p><p>To help contextualize the sequencer capabilities we developed several demonstration scenarios, keeping in mind the limitations just described.</p><ol><li><p><strong>High frequency price updates.</strong> First, we model the situation in which a team wants to bring high frequency price feeds onchain, deploying an oracle contract and testing with generated traffic.</p><p>In this scenario the system was able to sustain ~23K TPS, corresponding to ~0.66 gigagas per second, and an average tx inclusion time of 250ms.</p></li><li><p><strong>Stablecoin transfers.</strong> Next, we model a payments focused system in which 50,000 simulated users are transacting between each other via ERC20 token transfers.</p><p>In this scenario we saw a sustained performance of ~15K TPS, corresponding to ~0.5 gigagas per second, and an average tx inclusion time of 500ms.</p></li><li><p><strong>ETH transfers.</strong> Finally, we tested the system with native ETH transfers, again with a pool of simulated users. In the other experiments we used a blocktime of 100ms, but here tested raising this to 500ms.</p><p>This is where we saw the most significant performance, with the system processing ~43K TPS, corresponding to ~0.9 gigagas per second, and an average tx inclusion time of 450ms.</p></li></ol><p>We’re excited to share these early numbers, and while we have designed this sequencer for performance and are excited by the early results, it is nowhere near optimized and many more improvements will be made as the system matures.</p><h3 id="h-unleashing-airbender-one-second-block-proofs-and-dollar00001transfer" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Unleashing Airbender: one-second block proofs and $0.0001/transfer</h3><p>With this upgrade, we’re delighted to see Airbender stepping into the spotlight. Airbender, <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://zksync.mirror.xyz/ZgRmbYA_EE3wfGcXWv81m-xcED-ppNKkRzkleS6YZRc">introduced in an earlier blog post</a>, is the <strong>world’s fastest open-source RISC-V zkVM.</strong></p><p>As a reminder, it offers:</p><ul><li><p><strong>Fast proofs → fast finality:</strong> Airbender provides one-second block proofs and minutes-to-Ethereum finality.</p></li><li><p><strong>General-purpose:</strong> Airbender can prove any program that compiles to RISC-V.</p></li><li><p><strong>Best-in-class hardware utilization:</strong> Airbender is an incredibly efficient system, requiring a substantially smaller hardware footprint than competitor systems.</p></li></ul><p>Efficient, near-real time ZK proofs are a breakthrough technology, enabling functionality that simply cannot be supported without it.</p><ul><li><p>Applications such as onchain order books, perps, exchanges, and AMMs depend on fast finality to reduce risk. Airbender allows systems to verify and settle extremely quickly.</p></li><li><p>Public and private systems (such as <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.zksync.io/prividium">ZKsync’s Prividiums</a>) can interoperate without requiring third parties, as fast ZK proof generation allows for a network supporting near real time incorruptible connectivity. It will be possible to send assets of any size, anywhere in the network, in one second.</p></li><li><p>Tokenized securities and FX trades cannot wait minutes or hours to finalize. Airbender will shorten settlement cycles and allow teams to meet compliance-driven SLAs.</p></li></ul><h3 id="h-one-second-zk-finality" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">One-second ZK finality</h3><p>Airbender provides a critical property: one-second ZK finality.</p><p>At the network edge, blocks from ZK Stack chains are proved in ~1s and verified by the <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.zksync.io/zksync-protocol/gateway/overview">ZKsync Gateway</a> (the coordination layer). Counterparties get cryptographic assurance of execution almost immediately, and the proofs are then settled to Ethereum within minutes for full L1 finality.</p><p><strong>This is a fundamental change to how systems can integrate.</strong> In a world of many chains, the naïve way to trust another chain is to re-execute it yourself, meaning running full nodes on often powerful hardware for every system you connect to. That is prohibitively expensive and incompatible with privacy (you can’t re-execute what you can’t see inside a Prividium).</p><p><strong>Proofs, not intermediaries, carry trust across domains.</strong> With one-second proofs, you don’t re-execute, you verify. Anyone (chain operators, exchanges, even a user’s mobile device) can quickly verify a succinct proof and act with confidence. This is also how private chains can keep user data private while still composing with public liquidity, revealing only the ZK proof of correctness.</p><p>The combination of a sequencer providing low latency tx inclusion, Airbender generating a proof within a second, and then Gateway verifying and coordinating cross-chain messages, is how this architecture is able to realize the vision of a world transacting onchain.</p><h3 id="h-native-evm-support-via-a-more-flexible-system-architecture" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Native EVM support via a more flexible system architecture</h3><p>Additionally, the Atlas upgrade brings significant improvements to how ZK Stack chains will operate. We have redesigned the system-level component that is responsible for executing transactions and managing the state. This component is implemented as a Rust program and is compiled to both the x86 and RISC-V instruction sets. x86 is used for running the sequencer and RISC-V is fed to Airbender, and used to compute the ZK proof attesting to the correctness of the system.</p><p>This design has several compelling properties, which serve as the foundation for the entire upgrade:</p><ul><li><p><strong>One program, two targets.</strong> Compiling the same code to <strong>x86</strong> for the sequencer and to <strong>RISC-V</strong> for proving means <em>what you execute is what you prove</em>, reducing the systemic risk and audit surface relative to previous proof system designs.</p></li><li><p><strong>Multi-VM by design:</strong> any VM that compiles to RISC-V can be proven by the same pipeline, allowing for more optionality for chain builders. <strong>The</strong> <strong>EVM is first</strong>, and native support is already live. Support for other execution environments, such as the EraVM and WASM, can be added later.</p></li><li><p><strong>Improved performance</strong>: proving an ERC20 transfer will cost ~$0.0001, with significant improvement in the throughput that can be supported by the sequencer.</p></li></ul><h2 id="h-mainnets-incoming" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Mainnets incoming</h2><p>In our <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://zksync.mirror.xyz/QG2Xr4lQdJTbyjeKftPVc6-pj2t9-H9WEGnvCcnusck">2025 Roadmap</a>, we committed to bytecode-level EVM equivalence and performance at industry scale. This upgrade advances those dimensions significantly, and further expands the toolkit available to ZK Stack builders. The first teams to be taking advantage of the Atlas upgrade already have testnets live, and we expect many other chains to follow in the coming weeks, on both testnet and mainnet.</p><p>High performance systems alone will not bring the world onchain because the endgame isn’t one big chain. <strong>It’s many sovereign systems, connected as part of a secure network.</strong> We expect banks, enterprises, public agencies, hospitals etc will all operate their own blockchain infrastructure (private where required) and participate an incorruptible network, anchored to Ethereum’s security and liquidity.</p><p>This vision requires both:</p><ul><li><p>High-performance, reliable systems, for builders to develop the applications their users want.</p></li><li><p>Real-time ZK proofs so those systems can settle and interoperate without trusted intermediaries.</p></li></ul><p>Alone, neither is sufficient.</p><p>With the Atlas upgrade, blocks are included quickly <em>and</em> proved quickly, so chains can finalize to Ethereum on minute timescales while keeping user-visible latency near real-time. Payments will clear with card-like UX but cryptographic finality. Price feeds will arrive at the speed finance applications need, and settle deterministically</p><p>This upgrade is another major step forward for the ZK Stack, which is ready today as a platform for teams looking to issue and settle real-world assets, run global payments with near-instant settlement, and tap into billions in onchain liquidity via Ethereum.</p><p>Find out more on the <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.zksync.io/zk-stack">ZK Stack page</a>.</p>]]></content:encoded>
            <author>zksync@newsletter.paragraph.com (ZKsync)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/2c6c6158c88a1d599fd785b8d1d9448849e878471ba195abb102f58600a3561f.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[solx 0.1.2 - Smaller Binary Size When It Matters Most]]></title>
            <link>https://paragraph.com/@zksync/solx-0-1-2-smaller-binary-size-when-it-matters-most</link>
            <guid>xSyXhLXKbzpIGzKDAnBw</guid>
            <pubDate>Wed, 01 Oct 2025 14:29:17 GMT</pubDate>
            <description><![CDATA[solx 0.1.2 targets binary size — cutting deployment costs and fitting more contracts under Ethereum’s 24 kB limit — without sacrificing gas efficiency or compile time. That focus turns into:Smaller binaries without losing gas efficiency. Contracts compiled with --via-ir are 13% smaller on median vs 0.1.1, and about 22% smaller than solc 0.8.30 –via-ir.More often under the 24 KB limit. If a contract would exceed the cap, solx 0.1.2 optimizes for size more aggressively to make a contract deploy...]]></description>
            <content:encoded><![CDATA[<p>solx 0.1.2 targets binary size — cutting deployment costs and fitting more contracts under Ethereum’s 24 kB limit — without sacrificing gas efficiency or compile time. That focus turns into:</p><ul><li><p><strong>Smaller binaries without losing gas efficiency.</strong> Contracts compiled with <code>--via-ir </code>are <strong>13% smaller on median vs 0.1.1</strong>, and about <strong>22% smaller than solc 0.8.30</strong> <code>–via-ir</code>.</p></li><li><p><strong>More often under the 24 KB limit.</strong> If a contract would exceed the cap, solx 0.1.2 optimizes for size more aggressively to make a contract deployable (<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/matter-labs/era-compiler-llvm/pull/854">PR-854</a>).</p></li><li><p><strong>Better code quality.</strong> The compiler now eliminates unused stores (heap, transient, or persistent storage) (<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/matter-labs/era-compiler-llvm/pull/865">PR-865</a>) and generates more efficient conditional jumps (<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/matter-labs/era-compiler-llvm/pull/870/files">PR-870</a>).</p></li><li><p><strong>Improved tooling support.</strong> Integration with <strong>Hardhat v3</strong> is now smoother out of the box.</p></li></ul><p>This post walks through the current results and explains the optimizations in detail.</p><h1 id="h-still-beta-but-better-than-solc-via-ir-in-every-non-functional-metric" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0"><strong>Still Beta, But Better Than solc</strong> <code>--via-ir</code> <strong>in Every Non-Functional Metric</strong></h1><p>solx 0.1.2 remains in <strong>beta</strong>. It passes the full Solidity test suite, internal tests, and 24 real-world Hardhat/Foundry projects (e.g., Uniswap V4, Aave V3, Solady, Beefy, Lens). Code coverage is tracked; PRs that reduce it are not accepted.</p><p>QA is sufficient for development use — some teams already build with solx. Deploying <strong>non-mission-critical</strong> contracts is also viable today.</p><p>Raw benchmarking data is available in the <strong>solx 0.1.2</strong> <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/matter-labs/solx/pull/130#issuecomment-3263629087">release PR</a>. The subsections below provide a summary view and key highlights from that data.</p><h3 id="h-runtime-code-size" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Runtime Code Size</h3><p><strong>solx 0.1.2</strong> reduces contract size across both the <code>--via-ir</code> and default pipelines. Like solc, it still uses the legacy pipeline by default.</p><p>The table below shows the relative <strong>runtime size improvements</strong> compared to <strong>solx 0.1.1</strong> and <strong>solc 0.8.30</strong> (negative values indicate smaller size, i.e., better).</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/2853ab3ded0e23f8bcefe60a6d640ca72e810a4dd63bcb831ecea2629ca0c812.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>Despite a clear median win, the odds that a specific contract ends up smaller still slightly favor <code>solc --via-ir</code>. The measurement includes <strong>all artifacts</strong> produced by a <code>foundry build</code>.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/3531cc1c5f6826c1a060d9c6093467a531decf541588d0f51da45bc5fe220271.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>The data shows considerable variation in whether a given contract compiles smaller with solc or solx; however, when <strong>solx</strong> wins, the margin is typically larger. The table below samples real-world contracts to show you how it looks in practice.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/15a1b3d8c935f3b916f7363ab1e3b48adf781c58785790cd9f8f7a96d128fae9.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><h3 id="h-gas-efficiency" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Gas Efficiency</h3><p>The average gas metric remained stable in <strong>solx 0.1.2</strong>: the <strong>gas-for-size tradeoffs</strong> were offset by other optimizations introduced in this release.</p><p>The table below compares <strong>solx 0.1.2</strong> against <strong>solx 0.1.1</strong> and <strong>solc 0.8.30</strong>, showing <strong>relative gas changes</strong> (negative values indicate reduced gas usage, i.e., better).</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/6c7e10cd0275bdb9e7c8595d719fcaaf3fac1fa1529224ecd4db138342b78045.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>The table below also shows the <strong>likelihood that a given test consumes less gas</strong> with <strong>solx 0.1.2</strong> compared to solx 0.1.1 and solc 0.8.30.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/7256bf7142decb06d78105052c7d1d0e315e26e4cc7a029ff6b0697a0bbb8801.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><h3 id="h-compilation-time" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Compilation Time</h3><p><strong>solx 0.1.2</strong> doesn’t introduce pipeline changes, so <strong>compilation time remains similar to solx 0.1.1</strong>.</p><p>The table below shows how long each test run takes on our <strong>CI hardware (in seconds)</strong>, comparing against <strong>solc 0.8.30</strong> (both default and <code>--via-ir</code>).</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/6cbb93203686b2835b99554b5da4f426943854c1c60940b2c433a8396ad8f92a.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><h3 id="h-how-it-works-optimizations-behind-the-gains" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">How It Works: Optimizations Behind the Gains</h3><p>The earlier sections focused on what solx 0.1.2 achieved — smaller contracts, same or better gas usage. This section explains how we got there.</p><p>Three new optimizations made this possible:</p><ul><li><p>The Constant Unfolder now splits <code>PUSHN</code> into multiple instructions if it reduces total bytecode size by at least 2.5× and fits within 4 instructions. Once the 24 kB limit is hit, it unfolds for any size reduction — prioritizing code outside of loops first, then loops of nesting depth 1, then 2, and so on. This acts as a hot/cold code heuristic to preserve performance while keeping contracts deployable.</p></li><li><p>The Dead Store Elimination pass can now remove not only overwritten stores to memory and storage, but also accounts for contract termination scenarios like <code>return</code> and <code>revert</code>. In <code>solx 0.1.2</code>, the common free heap pointer initialization (<code>PUSH1 0x40 PUSH1 0x80 MSTORE</code>) is eliminated from runtime code when unused (see <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://godbolt.org/z/vocaq8WP1">example in Compiler Explorer</a>). On the main branch, it&apos;s also removed from deployment code.</p></li><li><p>The Peephole Optimizer now emits more efficient code for conditional jumps involving <code>OR</code> conditions.</p></li></ul><h1 id="h-hardhat-v3-integration" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Hardhat v3 Integration</h1><p>Starting with <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/NomicFoundation/hardhat/releases/tag/hardhat%403.0.5">Hardhat v3.0.5</a>, it’s now much easier to use <strong>solx</strong> in Hardhat.</p><p>To get started, just specify the following in your <code>hardhat.config.ts</code>:</p><pre data-type="codeBlock" text="solidity: {
  profiles: {
    default: {
      version: &quot;0.8.28&quot;,
      path: &quot;./path/to/solx&quot;,
    },
  },
},
"><code>solidity: {
  profiles: {
    default: {
      version: <span class="hljs-string">"0.8.28"</span>,
      path: <span class="hljs-string">"./path/to/solx"</span>,
    },
  },
},
</code></pre><p>You can find a detailed guide in <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://hardhat.org/docs/learn-more/configuring-the-compiler#using-a-custom-compiler">the Hardhat documentation</a>.</p><p><strong>solx 0.1.2</strong> also resolves a key integration issue by producing all the artifacts required by Ethereum Developer Runtime (<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/matter-labs/solx/pull/133">PR #133</a>).</p><h1 id="h-next-steps-from-optimization-to-functionality" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Next Steps: From Optimization to Functionality</h1><p>Considering non-functional metrics alone, <code>solx</code> now leads across the board — except for default-pipeline compile time, where <code>solc</code> remains faster. We expect the upcoming MLIR pipeline to close this final gap (<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://x.com/solx_compiler/status/1963980589628870773">learn more about it in the X thread</a>). With performance largely handled, our focus is shifting toward functional gaps — starting with debugging support, which is now our top priority.</p><p>If you’ve read this far, chances are you care about <code>solx</code>. If you haven’t already, join our <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://t.me/solx_devs">Telegram group</a> and tell us more about your use case. Your input helps us prioritize wisely — especially as we move beyond optimization and work to make <code>solx</code> a first-class development experience.</p>]]></content:encoded>
            <author>zksync@newsletter.paragraph.com (ZKsync)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/6185eb2bb1807a7f4a01b7e8315f092e05fa49835022e13d9cbbfc647aec8d4b.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[Diving Deep into the Stack — But Not Too Deep]]></title>
            <link>https://paragraph.com/@zksync/diving-deep-into-the-stack-but-not-too-deep</link>
            <guid>mzxiQ8zqFQoYuaRIT1vR</guid>
            <pubDate>Wed, 16 Jul 2025 12:46:27 GMT</pubDate>
            <description><![CDATA[Solidity developers have long dreaded the infamous “Stack too deep” error. To work around it, they often split functions, pack variables into structs, or manually offload values to memory — just to get the code to compile. It’s been a persistent pain point, with prominent Ethereum engineers openly questioning why it remains unresolved. One partial solution is the --via-ir flag, which allows the compiler to automatically move excess variables to memory instead of relying solely on DUP and SWAP...]]></description>
            <content:encoded><![CDATA[<p>Solidity developers have long dreaded the infamous “Stack too deep” error. To work around it, they often split functions, <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/ethereum/solidity/issues/16085">pack variables into structs</a>, or manually offload values to memory — just to get the code to compile. It’s been a persistent pain point, with prominent Ethereum engineers openly questioning why it remains unresolved. One partial solution is the <code>--via-ir</code> flag, which allows the compiler to automatically move excess variables to memory instead of relying solely on <code>DUP</code> and <code>SWAP</code> for stack manipulation. It mostly works — but with a major caveat: it can subtly <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.soliditylang.org/en/latest/ir-breaking-changes.html#semantic-only-changes">change the semantics of a contract</a>. The result? Most projects remain on the legacy compiler path, doing “stack too deep” workarounds, leaving the underlying problem unsolved.</p><p>solx removes the error entirely while keeping your contract’s behavior bit-for-bit identical.</p><h2 id="h-solx-memory-layout-and-current-constraints" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">solx memory layout and current constraints</h2><p>Solx extends solidity’s <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.soliditylang.org/en/latest/internals/layout_in_memory.html#layout-in-memory">memory layout</a> — similarly to solc <code>--via-ir</code> — by inserting a dedicated region for spills. This guarantees that spills never interfere with user memory:</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/28b2cdfe943e7fb37aa754f18c3d0ed3e3656edc62b2c87ef49bde10bf0638e2.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>The spill region is laid out at compile time: the frontend reserves it starting at the first safe offset (<code>0x80</code>), the backend calculates the exact size of this region, and the free memory pointer (<code>0x40</code>) is updated to point immediately after it. Because the region cannot grow at runtime and all heap allocations begin beyond its end, neither user code nor memory-safe inline assembly can touch a spill slot, and a spill write can never run past its bounds. Memory corruption is therefore impossible by design.</p><p>This deterministic layout comes with an intentional tradeoff: self-recursive and indirectly recursive functions are not supported. Supporting recursion would require allocating a fresh set of spill slots for each call, but solx deliberately avoids dynamic memory allocation for spills. As a result, recursive functions are explicitly rejected at compile time if they have “stack too deep” issues. Developers writing inline assembly should be careful. When spilling is required and a contract contains an assembly block without the memory-safe annotation, solx will produce an error like the following:</p><pre data-type="codeBlock" text="Error (5726): This contract cannot be compiled due to a combination of a memory-unsafe assembly block and a stack-too-deep error. The compiler can automatically fix the stack-too-deep error, but only in the absence of memory-unsafe assembly.
To successfully compile this contract, please check if this assembly block is memory-safe according to the requirements at 

    https://docs.soliditylang.org/en/latest/assembly.html#memory-safety

and then mark it with a memory-safe tag.
Alternatively, if you feel confident, you may suppress this error project-wide by setting the EVM_DISABLE_MEMORY_SAFE_ASM_CHECK environment variable:

    EVM_DISABLE_MEMORY_SAFE_ASM_CHECK=1 &lt;your build command&gt;

Please be aware of the memory corruption risks described at the link above!
  --&gt; forge/test/strategy/CommonBaseTest.t.sol:25:9:
   |
25 |         assembly {
   |         ^ (Relevant source part starts here and spans across multiple lines).
"><code><span class="hljs-built_in">Error</span> (<span class="hljs-number">5726</span>): This <span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">cannot</span> <span class="hljs-title">be</span> <span class="hljs-title">compiled</span> <span class="hljs-title">due</span> <span class="hljs-title">to</span> <span class="hljs-title">a</span> <span class="hljs-title">combination</span> <span class="hljs-title">of</span> <span class="hljs-title">a</span> <span class="hljs-title"><span class="hljs-keyword">memory</span></span>-<span class="hljs-title">unsafe</span> <span class="hljs-title"><span class="hljs-keyword">assembly</span></span> <span class="hljs-title"><span class="hljs-built_in">block</span></span> <span class="hljs-title">and</span> <span class="hljs-title">a</span> <span class="hljs-title">stack</span>-<span class="hljs-title">too</span>-<span class="hljs-title">deep</span> <span class="hljs-title"><span class="hljs-keyword">error</span></span>. <span class="hljs-title">The</span> <span class="hljs-title">compiler</span> <span class="hljs-title">can</span> <span class="hljs-title">automatically</span> <span class="hljs-title">fix</span> <span class="hljs-title">the</span> <span class="hljs-title">stack</span>-<span class="hljs-title">too</span>-<span class="hljs-title">deep</span> <span class="hljs-title"><span class="hljs-keyword">error</span></span>, <span class="hljs-title">but</span> <span class="hljs-title">only</span> <span class="hljs-title">in</span> <span class="hljs-title">the</span> <span class="hljs-title">absence</span> <span class="hljs-title">of</span> <span class="hljs-title"><span class="hljs-keyword">memory</span></span>-<span class="hljs-title">unsafe</span> <span class="hljs-title"><span class="hljs-keyword">assembly</span></span>.
<span class="hljs-title">To</span> <span class="hljs-title">successfully</span> <span class="hljs-title">compile</span> <span class="hljs-title"><span class="hljs-built_in">this</span></span> <span class="hljs-title"><span class="hljs-keyword">contract</span></span>, <span class="hljs-title">please</span> <span class="hljs-title">check</span> <span class="hljs-title"><span class="hljs-keyword">if</span></span> <span class="hljs-title"><span class="hljs-built_in">this</span></span> <span class="hljs-title"><span class="hljs-keyword">assembly</span></span> <span class="hljs-title"><span class="hljs-built_in">block</span></span> <span class="hljs-keyword">is</span> <span class="hljs-title"><span class="hljs-keyword">memory</span></span>-<span class="hljs-title">safe</span> <span class="hljs-title">according</span> <span class="hljs-title">to</span> <span class="hljs-title">the</span> <span class="hljs-title">requirements</span> <span class="hljs-title">at</span> 

    <span class="hljs-title">https</span>:<span class="hljs-comment">//docs.soliditylang.org/en/latest/assembly.html#memory-safety</span>

<span class="hljs-title">and</span> <span class="hljs-title">then</span> <span class="hljs-title">mark</span> <span class="hljs-title">it</span> <span class="hljs-title">with</span> <span class="hljs-title">a</span> <span class="hljs-title"><span class="hljs-keyword">memory</span></span>-<span class="hljs-title">safe</span> <span class="hljs-title">tag</span>.
<span class="hljs-title">Alternatively</span>, <span class="hljs-title"><span class="hljs-keyword">if</span></span> <span class="hljs-title">you</span> <span class="hljs-title">feel</span> <span class="hljs-title">confident</span>, <span class="hljs-title">you</span> <span class="hljs-title">may</span> <span class="hljs-title">suppress</span> <span class="hljs-title"><span class="hljs-built_in">this</span></span> <span class="hljs-title"><span class="hljs-keyword">error</span></span> <span class="hljs-title">project</span>-<span class="hljs-title">wide</span> <span class="hljs-title">by</span> <span class="hljs-title">setting</span> <span class="hljs-title">the</span> <span class="hljs-title">EVM_DISABLE_MEMORY_SAFE_ASM_CHECK</span> <span class="hljs-title">environment</span> <span class="hljs-title">variable</span>:

    <span class="hljs-title">EVM_DISABLE_MEMORY_SAFE_ASM_CHECK</span>=1 &#x3C;<span class="hljs-title">your</span> <span class="hljs-title">build</span> <span class="hljs-title">command</span>>

<span class="hljs-title">Please</span> <span class="hljs-title">be</span> <span class="hljs-title">aware</span> <span class="hljs-title">of</span> <span class="hljs-title">the</span> <span class="hljs-title"><span class="hljs-keyword">memory</span></span> <span class="hljs-title">corruption</span> <span class="hljs-title">risks</span> <span class="hljs-title">described</span> <span class="hljs-title">at</span> <span class="hljs-title">the</span> <span class="hljs-title">link</span> <span class="hljs-title">above</span>!
  --> <span class="hljs-title">forge</span>/<span class="hljs-title">test</span>/<span class="hljs-title">strategy</span>/<span class="hljs-title">CommonBaseTest</span>.<span class="hljs-title">t</span>.<span class="hljs-title">sol</span>:25:9:
   |
25 |         <span class="hljs-title"><span class="hljs-keyword">assembly</span></span> </span>{
   <span class="hljs-operator">|</span>         <span class="hljs-operator">^</span> (Relevant source part starts here and spans across multiple lines).
</code></pre><p>If an assembly block is memory-safe, it must be explicitly annotated with <code>&quot;memory-safe&quot;</code> to inform the compiler that it can safely reserve space for the spill region and emit spills.</p><p>On the other hand, if an assembly block is not memory-safe but is incorrectly annotated as such, it can lead to <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.soliditylang.org/en/latest/assembly.html#memory-safety">incorrect and undefined behavior</a> — since memory used for spills may be overwritten unexpectedly.</p><p>There are also a few important current limitations to keep in mind. First, the EVM imposes a hard limit of 1024 elements on the operand stack, but solx does not currently track this global stack depth during code generation. While this rarely poses a problem in typical contracts, it may become relevant in cases involving very deep nesting or aggressive inlining. If the limit is exceeded at runtime, execution will fail without prior compiler warnings.</p><p>Another limitation arises when functions have a large number of arguments or return values — typically more than 16. In such cases, “stack too deep” issues may occur during stackification. While solx can often recover by spilling intermediate values to memory, this is not guaranteed in all scenarios, particularly when values remain live across complex control flow.</p><h1 id="h-solx-memory-spills-vs-solc-via-ir" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">solx memory spills vs solc --via-ir</h1><p>Both solc <code>--via-ir</code> and solx aim to solve the same problem: fixing “stack too deep” issues in EVM by introducing memory spills. However, they approach this problem with very different strategies.</p><p>solc’s <code>StackLimitEvader</code> makes assumptions about potential stack pressure and rewrites code to preemptively store intermediate results in memory. These spills are generally safe but tend to be precautionary, and once a value is stored in memory, the slot is not reused, even if it’s no longer needed. In some cases, contracts may still fail with “stack too deep” errors, as seen in several reported issues on GitHub.</p><p>In contrast, solx inserts spills during stackification, but only when needed. Memory slots are reused based on LLVM’s internal analysis, which considers liveness information. This reuse is not the result of custom logic in solx, but a natural benefit of LLVM’s infrastructure. solx pays more at compile time to produce more efficient and compact runtime code — an intentional tradeoff. Rather than assuming stack pressure might occur, it emits spills only when they are truly necessary.</p><h1 id="h-stack-too-deep-resolvability-table" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Stack too deep resolvability table</h1><p>This table illustrates the state of “stack too deep” solutions across different pipelines and codegens. We can see that thanks to additional IRs added on top of EVM assembly in the eponymous codegen, it becomes the most robust set of compiler settings without <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.soliditylang.org/en/latest/ir-breaking-changes.html">dangerous semantic changes</a> that <code>--via-ir</code> could bring.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/abc6902dada476dd90afb9d81a196e15cd58f1f4a4a415a7706dc507d67a8078.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><ol><li><p>Only if the project was developed with viaIR, or migrated and has been tested later (total &lt;20% of live projects).</p></li><li><p>Turning off the Yul optimizer from solx can alleviate the issue while keeping its library inlining intact.</p><p>- It is coming in next releases of solx.</p></li><li><p>MLIR is a new codegen that will supersede EVM assembly and Yul in solx. It is still work-in-progress, but we’re going to share some interesting news soon.</p></li></ol><h1 id="h-from-spills-that-just-works-to-a-production-grade" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">From spills that just works to a production grade</h1><p>When we began addressing “stack too deep” issues in solx this May, our expectations were modest. The immediate goal was pragmatic: unblock the largest real-world contracts that failed to compile in our early pre-alpha releases. The plan was simple — spill whatever caused “stack too deep” and prioritize correctness over performance. If a contract compiled, that was already a win, even if it meant some gas inefficiency. With just a few months of work, we didn’t anticipate significant improvements over solc on those same contracts. And even if we wanted to improve the implementation, LLVM seemed like an unlikely candidate for help. The EVM is a stack machine without registers, while LLVM was built for register-based architectures. Its register allocation infrastructure appeared irrelevant to a stack-based target.</p><p>Both expectations proved wrong. First, in the majority of real-world contracts we <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://matter-labs.github.io/solx/dashboard/">tested</a> (around 2000 from production-grade projects), solx outperforms solc — even when spilling is required. Second, LLVM provides a solid foundation for building production-grade code generation — even for a stack-based architecture — allowing us to move quickly and iterate with minimal custom effort. What began as a simple implementation quickly evolved into a robust and efficient solution.</p><h2 id="h-choosing-which-register-to-spill" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Choosing which register to spill</h2><p>Spills are determined during stackification — the phase where code is lowered from an intermediate representation into the EVM’s bytecode. Registers that cannot be reached via <code>DUP</code> or <code>SWAP</code> are spilled to memory and later reloaded when needed. This process proceeds iteratively until all “stack too deep” issues are resolved.</p><p>In our initial implementation of register spilling, we selected a register that was unreachable via the <code>DUP</code> or <code>SWAP</code> instructions. While this approach ensured correctness, it resulted in a high number of spills. To improve on this, we used LLVM’s register weight heuristic, which estimates the cost of spilling each virtual register based on its usage frequency and live range:</p><pre data-type="codeBlock" text="let x := add(a, b)
let y := sub(c, d)
pop(init(y))             // first use of y

// Inside a loop
  ...
  let z := mul(x, e)     // first use of x
  ...

pop(final(x))            // second use of x
pop(done(y))             // second use of y

// Weights:
x: high - used in the loop
y: low  - used outside the loop

=&gt; Heuristic prefers spilling y
"><code>let x :<span class="hljs-operator">=</span> add(a, b)
let y :<span class="hljs-operator">=</span> sub(c, d)
pop(init(y))             <span class="hljs-comment">// first use of y</span>

<span class="hljs-comment">// Inside a loop</span>
  ...
  let z :<span class="hljs-operator">=</span> mul(x, e)     <span class="hljs-comment">// first use of x</span>
  ...

pop(final(x))            <span class="hljs-comment">// second use of x</span>
pop(done(y))             <span class="hljs-comment">// second use of y</span>

<span class="hljs-comment">// Weights:</span>
x: high <span class="hljs-operator">-</span> used in the loop
y: low  <span class="hljs-operator">-</span> used outside the loop

<span class="hljs-operator">=</span><span class="hljs-operator">></span> Heuristic prefers spilling y
</code></pre><p>At the point where a register becomes unreachable, the set of live registers from that register up to the top of the stack is examined, and the one with the lowest weight — the least expensive to spill — is selected. This change, combined with refining the heuristic to account for the number of uses of each register within the function, reduced the number of registers that needed to be spilled by an average of 65%. To enable this, we simply needed to hook into LLVM’s existing infrastructure, with a small customization to adjust for usage counts:</p><pre data-type="codeBlock" text="/// EVM-specific implementation of weight normalization.
class EVMVirtRegAuxInfo final : public VirtRegAuxInfo {
  float normalize(float UseDefFreq, unsigned Size, unsigned NumInstr) override {
    // All intervals have a spill weight that is mostly proportional to the
    // number of uses, with uses in loops having a bigger weight.
    return NumInstr * VirtRegAuxInfo::normalize(UseDefFreq, Size, 1);
  }

public:
  EVMVirtRegAuxInfo(MachineFunction &amp;MF, LiveIntervals &amp;LIS,
                    const VirtRegMap &amp;VRM, const MachineLoopInfo &amp;Loops,
                    const MachineBlockFrequencyInfo &amp;MBFI)
      : VirtRegAuxInfo(MF, LIS, VRM, Loops, MBFI) {}
};

EVMVirtRegAuxInfo EVRAI(MF, LIS, VRM, *MLI, MBFI);
// Use LLVM&apos;s heuristic to assign weights to registers
EVRAI.calculateSpillWeightsAndHints();
"><code><span class="hljs-comment">/// EVM-specific implementation of weight normalization.</span>
<span class="hljs-keyword">class</span> <span class="hljs-title class_">EVMVirtRegAuxInfo</span> <span class="hljs-keyword">final</span> : <span class="hljs-keyword">public</span> VirtRegAuxInfo {
  <span class="hljs-function"><span class="hljs-type">float</span> <span class="hljs-title">normalize</span><span class="hljs-params">(<span class="hljs-type">float</span> UseDefFreq, <span class="hljs-type">unsigned</span> Size, <span class="hljs-type">unsigned</span> NumInstr)</span> <span class="hljs-keyword">override</span> </span>{
    <span class="hljs-comment">// All intervals have a spill weight that is mostly proportional to the</span>
    <span class="hljs-comment">// number of uses, with uses in loops having a bigger weight.</span>
    <span class="hljs-keyword">return</span> NumInstr * VirtRegAuxInfo::<span class="hljs-built_in">normalize</span>(UseDefFreq, Size, <span class="hljs-number">1</span>);
  }

<span class="hljs-keyword">public</span>:
  <span class="hljs-built_in">EVMVirtRegAuxInfo</span>(MachineFunction &#x26;MF, LiveIntervals &#x26;LIS,
                    <span class="hljs-type">const</span> VirtRegMap &#x26;VRM, <span class="hljs-type">const</span> MachineLoopInfo &#x26;Loops,
                    <span class="hljs-type">const</span> MachineBlockFrequencyInfo &#x26;MBFI)
      : <span class="hljs-built_in">VirtRegAuxInfo</span>(MF, LIS, VRM, Loops, MBFI) {}
};

<span class="hljs-function">EVMVirtRegAuxInfo <span class="hljs-title">EVRAI</span><span class="hljs-params">(MF, LIS, VRM, *MLI, MBFI)</span></span>;
<span class="hljs-comment">// Use LLVM's heuristic to assign weights to registers</span>
EVRAI.<span class="hljs-built_in">calculateSpillWeightsAndHints</span>();
</code></pre><h2 id="h-reducing-spill-memory" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Reducing spill memory</h2><p>As the implementation matured, we introduced <code>StackSlotColoring</code>, a standard LLVM pass that reuses stack slots for variables whose lifetimes don’t overlap — meaning if two values are never alive at the same time, they can safely be assigned to the same memory location. Previously, each spill was assigned a dedicated slot, resulting in excessive memory usage. Enabling coloring, led to an average 25% reduction in allocated spill slots across multiple cases. Notably, this optimization was achieved with minimal effort by updating the analysis used by the pass and running that pass — demonstrating the advantages of leveraging LLVM’s infrastructure:</p><pre data-type="codeBlock" text="// Updating the analysis
StackSlot = VRM.assignVirt2StackSlot(Reg);
auto &amp;StackInt =
    LSS.getOrCreateInterval(StackSlot, MF.getRegInfo().getRegClass(Reg));
StackInt.getNextValue(SlotIndex(), LSS.getVNInfoAllocator());
StackInt.MergeSegmentsInAsValue(LIS.getInterval(Reg),
                                StackInt.getValNumInfo(0));

// Running the pass
addPass(&amp;StackSlotColoringID);
"><code><span class="hljs-comment">// Updating the analysis</span>
StackSlot <span class="hljs-operator">=</span> VRM.assignVirt2StackSlot(Reg);
auto <span class="hljs-operator">&#x26;</span>StackInt <span class="hljs-operator">=</span>
    LSS.getOrCreateInterval(StackSlot, MF.getRegInfo().getRegClass(Reg));
StackInt.getNextValue(SlotIndex(), LSS.getVNInfoAllocator());
StackInt.MergeSegmentsInAsValue(LIS.getInterval(Reg),
                                StackInt.getValNumInfo(<span class="hljs-number">0</span>));

<span class="hljs-comment">// Running the pass</span>
addPass(<span class="hljs-operator">&#x26;</span>StackSlotColoringID);
</code></pre><h2 id="h-small-implementation-big-infrastructure" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Small implementation, big infrastructure</h2><p>To give you a sense of the implementation effort and code impact, the following output highlights the changes introduced by this feature in the solx EVM backend, how much code was reused and the implementation from solc. The solx implementation took approximately two months, while the original solc implementation required at least three and a half months, as indicated by <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/ethereum/solidity/pull/9162">this PR</a> — possibly even longer.</p><pre data-type="codeBlock" text="Code changes introduced by the feature:
---------------------------------------------------------------------------------------
Language                   new files added          blank        comment           code
---------------------------------------------------------------------------------------
C++                                      2            100            116            495
C/C++ Header                             0              7             10             55
TableGen                                 0              1              0              3
CMake                                    0              0              0              2
---------------------------------------------------------------------------------------
SUM:                                     2            108            126            555
---------------------------------------------------------------------------------------
"><code>Code changes introduced by the feature:
<span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span>
Language                   <span class="hljs-keyword">new</span> files added          blank        comment           code
<span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span>
C<span class="hljs-operator">+</span><span class="hljs-operator">+</span>                                      <span class="hljs-number">2</span>            <span class="hljs-number">100</span>            <span class="hljs-number">116</span>            <span class="hljs-number">495</span>
C<span class="hljs-operator">/</span>C<span class="hljs-operator">+</span><span class="hljs-operator">+</span> Header                             <span class="hljs-number">0</span>              <span class="hljs-number">7</span>             <span class="hljs-number">10</span>             <span class="hljs-number">55</span>
TableGen                                 <span class="hljs-number">0</span>              <span class="hljs-number">1</span>              <span class="hljs-number">0</span>              <span class="hljs-number">3</span>
CMake                                    <span class="hljs-number">0</span>              <span class="hljs-number">0</span>              <span class="hljs-number">0</span>              <span class="hljs-number">2</span>
<span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span>
SUM:                                     <span class="hljs-number">2</span>            <span class="hljs-number">108</span>            <span class="hljs-number">126</span>            <span class="hljs-number">555</span>
<span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span>
</code></pre><pre data-type="codeBlock" text="Reused LLVM code:
llvm/include/llvm/CodeGen/CalcSpillWeights.h
llvm/include/llvm/CodeGen/LiveIntervals.h
llvm/include/llvm/CodeGen/LiveStacks.h
llvm/include/llvm/CodeGen/MachineBlockFrequencyInfo.h
llvm/include/llvm/CodeGen/VirtRegMap.h
llvm/lib/CodeGen/CalcSpillWeights.cpp
llvm/lib/CodeGen/LiveIntervals.cpp
llvm/lib/CodeGen/LiveStacks.cpp
llvm/lib/CodeGen/MachineBlockFrequencyInfo.cpp
llvm/lib/CodeGen/StackSlotColoring.cpp
llvm/lib/CodeGen/VirtRegMap.cpp
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
C++                              6            476            644           2650
C/C++ Header                     5            212            346            567
-------------------------------------------------------------------------------
SUM:                            11            688            990           3217
-------------------------------------------------------------------------------
"><code>Reused LLVM code:
llvm<span class="hljs-operator">/</span>include<span class="hljs-operator">/</span>llvm<span class="hljs-operator">/</span>CodeGen<span class="hljs-operator">/</span>CalcSpillWeights.h
llvm<span class="hljs-operator">/</span>include<span class="hljs-operator">/</span>llvm<span class="hljs-operator">/</span>CodeGen<span class="hljs-operator">/</span>LiveIntervals.h
llvm<span class="hljs-operator">/</span>include<span class="hljs-operator">/</span>llvm<span class="hljs-operator">/</span>CodeGen<span class="hljs-operator">/</span>LiveStacks.h
llvm<span class="hljs-operator">/</span>include<span class="hljs-operator">/</span>llvm<span class="hljs-operator">/</span>CodeGen<span class="hljs-operator">/</span>MachineBlockFrequencyInfo.h
llvm<span class="hljs-operator">/</span>include<span class="hljs-operator">/</span>llvm<span class="hljs-operator">/</span>CodeGen<span class="hljs-operator">/</span>VirtRegMap.h
llvm<span class="hljs-operator">/</span>lib<span class="hljs-operator">/</span>CodeGen<span class="hljs-operator">/</span>CalcSpillWeights.cpp
llvm<span class="hljs-operator">/</span>lib<span class="hljs-operator">/</span>CodeGen<span class="hljs-operator">/</span>LiveIntervals.cpp
llvm<span class="hljs-operator">/</span>lib<span class="hljs-operator">/</span>CodeGen<span class="hljs-operator">/</span>LiveStacks.cpp
llvm<span class="hljs-operator">/</span>lib<span class="hljs-operator">/</span>CodeGen<span class="hljs-operator">/</span>MachineBlockFrequencyInfo.cpp
llvm<span class="hljs-operator">/</span>lib<span class="hljs-operator">/</span>CodeGen<span class="hljs-operator">/</span>StackSlotColoring.cpp
llvm<span class="hljs-operator">/</span>lib<span class="hljs-operator">/</span>CodeGen<span class="hljs-operator">/</span>VirtRegMap.cpp
<span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span>
Language                     files          blank        comment           code
<span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span>
C<span class="hljs-operator">+</span><span class="hljs-operator">+</span>                              <span class="hljs-number">6</span>            <span class="hljs-number">476</span>            <span class="hljs-number">644</span>           <span class="hljs-number">2650</span>
C<span class="hljs-operator">/</span>C<span class="hljs-operator">+</span><span class="hljs-operator">+</span> Header                     <span class="hljs-number">5</span>            <span class="hljs-number">212</span>            <span class="hljs-number">346</span>            <span class="hljs-number">567</span>
<span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span>
SUM:                            <span class="hljs-number">11</span>            <span class="hljs-number">688</span>            <span class="hljs-number">990</span>           <span class="hljs-number">3217</span>
<span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span>
</code></pre><pre data-type="codeBlock" text="solc:
libyul/optimiser/StackLimitEvader.cpp
libyul/optimiser/StackLimitEvader.h
libyul/optimiser/StackToMemoryMover.cpp
libyul/optimiser/StackToMemoryMover.h
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
C++                              2             59             64            456
C/C++ Header                     2             24            179             85
-------------------------------------------------------------------------------
SUM:                             4             83            243            541
-------------------------------------------------------------------------------
"><code>solc:
libyul<span class="hljs-operator">/</span>optimiser<span class="hljs-operator">/</span>StackLimitEvader.cpp
libyul<span class="hljs-operator">/</span>optimiser<span class="hljs-operator">/</span>StackLimitEvader.h
libyul<span class="hljs-operator">/</span>optimiser<span class="hljs-operator">/</span>StackToMemoryMover.cpp
libyul<span class="hljs-operator">/</span>optimiser<span class="hljs-operator">/</span>StackToMemoryMover.h
<span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span>
Language                     files          blank        comment           code
<span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span>
C<span class="hljs-operator">+</span><span class="hljs-operator">+</span>                              <span class="hljs-number">2</span>             <span class="hljs-number">59</span>             <span class="hljs-number">64</span>            <span class="hljs-number">456</span>
C<span class="hljs-operator">/</span>C<span class="hljs-operator">+</span><span class="hljs-operator">+</span> Header                     <span class="hljs-number">2</span>             <span class="hljs-number">24</span>            <span class="hljs-number">179</span>             <span class="hljs-number">85</span>
<span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span>
SUM:                             <span class="hljs-number">4</span>             <span class="hljs-number">83</span>            <span class="hljs-number">243</span>            <span class="hljs-number">541</span>
<span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span>
</code></pre><h2 id="h-avoiding-solcs-stack-depth-limits-in-legacy-mode" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Avoiding solc’s stack depth limits in legacy mode</h2><p>One might assume we&apos;re simply relying on solc in legacy mode to compile contracts without running into “stack too deep” issues. But that’s not the full story. We’ve also modified solc itself to successfully produce EVM assembly by emitting extended stack manipulation instructions — specifically <code>SWAPX</code> and <code>DUPX</code>. These allow us to defer stack layout resolution to the LLVM backend, where the stackification and spill handling are performed in a controlled and optimized way.</p><p>If you have any thoughts, questions, or feedback — we’d love to hear it. You can reach us directly on <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://t.me/solx_devs">Telegram</a>. At the end of the day, we want solx to be useful to you. And if you haven’t tried it yet, head over to <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://solx.zksync.io">solx.zksync.io</a> and get started in just a few clicks.</p>]]></content:encoded>
            <author>zksync@newsletter.paragraph.com (ZKsync)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/0a965cbbcb97e6187888cf0189210aa6751d11c714220df62562f4dc3579402a.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[solx Beta: No stack too deep. No semantic changes.]]></title>
            <link>https://paragraph.com/@zksync/solx-beta-no-stack-too-deep-no-semantic-changes</link>
            <guid>ph2GQpHwGUn3TJieZ6YG</guid>
            <pubDate>Fri, 11 Jul 2025 13:07:34 GMT</pubDate>
            <description><![CDATA[With the new release, solx fixes solc’s notorious stack-too-deep failure without altering contract semantics — your contract behaves exactly as if compiled with solc, just cheaper and with fewer compilation failures. It now reliably eliminates stack-too-deep and, since our first release in May, has tightened the byte-code-size and compile-time gap while further reducing runtime gas consumption. With that, we believe solx is ready for mainnet deployment of non-critical, well-tested contracts. ...]]></description>
            <content:encoded><![CDATA[<p>With the new release, <strong>solx fixes solc’s notorious <em>stack-too-deep</em> failure without altering contract semantics</strong> — your contract behaves exactly as if compiled with solc, just cheaper and with fewer compilation failures. It now reliably eliminates <em>stack-too-deep</em> and, since our first release in May, has tightened the byte-code-size and compile-time gap while further reducing runtime gas consumption.</p><p>With that, we believe solx is ready for mainnet deployment of non-critical, well-tested contracts. We’re still raising the security bar, so please don’t rush into gas-saving migrations just yet.</p><blockquote><p>solx ships two pipelines—default and <code>--via-ir</code>, the latter applying <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.soliditylang.org/en/latest/ir-breaking-changes.html">rewrites that can change semantics</a>. solx leaves both untouched: <code>solx</code> (default) matches solc’s default semantics, and <code>solx --via-ir</code> mirrors <code>solc --via-ir</code>. If something looks off, double-check your Foundry or other configuration to ensure the expected pipeline is in use before filing a bug.</p></blockquote><h2 id="h-stack-too-deep-fixed-but-mind-inline-assembly" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Stack-Too-Deep? Fixed — But Mind Inline Assembly</h2><p>solx Beta eliminates the <em>stack-too-deep</em> error that has topped every Solidity-developer pain-point survey for years.</p><p>Like the <code>solc --via-ir</code> pipeline, solx resolves the issue by <strong>spilling</strong> selected stack values into a region of memory that starts right after <code>0x80</code> and is sized <em>exactly</em> to fit the spilled variables. The free-memory pointer (<code>0x40</code>) is then bumped so user-level allocations never collide with that region.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/d45a2e0cef8aceaf11918e3545a66b912466627f37ea013bd6d6ebe3e1c27a83.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>The approach carries the <em>same inherent limits</em> as <code>--via-ir</code>:</p><ul><li><p><strong>The compiler can’t spill inside recursion</strong> because it must know the total spill size at compile time.</p></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.soliditylang.org/en/latest/assembly.html#memory-safe-assembly"><strong>Memory-unsafe inline assembly</strong></a> disables spilling for the entire contract.</p></li></ul><p>Where <strong>solx differs</strong> is in <em>how</em> it achieves the fix: solx plugs the spilling logic into the <strong>default compiler pipeline</strong>, so <strong>no </strong><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.soliditylang.org/en/latest/ir-breaking-changes.html"><strong>semantic changes</strong></a> are introduced. Your contract behaves exactly as it would under the legacy pipeline—just without the stack error.</p><blockquote><p><strong>Heads-up on inline assembly</strong></p><ul><li><p>Whenever possible, <strong>prefer high-level Solidity</strong>; solx is steadily eroding the old performance edge of hand-rolled assembly.</p></li><li><p>If you do need assembly, be honest: mark <em>only</em> truly safe blocks with <code>assembly (&quot;memory-safe&quot;) // preferred, future-proof</code> or <code>/// @solidity memory-safe-assembly // legacy form, kept only for old compilers</code>. Mis-labelling unsafe code lets both your logic <em>and</em> the spill logic write to the same slots, silently corrupting data.</p></li><li><p>In doubtful cases, skip the annotation and let the compiler disable spilling rather than risk undefined behavior.</p></li></ul></blockquote><p>We’ll publish an in-depth blog post on the algorithm later. For now remember: <strong>enjoy the automatic fix—just keep your assembly minimal, accurate, and genuinely memory-safe.</strong></p><h1 id="h-runtime-gas-widening-lead" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Runtime gas — widening lead</h1><p>A proper benchmark that weights each function by real-world call frequency and uses representative inputs is still on the to-do list. For now we rely on raw <code>forge test --gas-report</code> data. Across <strong>2 057 cases</strong> drawn from popular projects, <strong>solx consumes less gas than solc in 1 888 of them—about 92 %</strong>. The advantage ranges from small fractions of percent to double-digit cuts, depending on the code path. You can browse the full snapshot at <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://matter-labs.github.io/solx/dashboard/">https://matter-labs.github.io/solx/dashboard/</a>. Pick any project from the drop-down to see a visual, test-by-test comparison of <code>forge test --gas-report</code> for <strong>solc</strong> vs. <strong>solx</strong>.</p><p><strong>Recent compiler changes</strong></p><ul><li><p><strong>EVM constant folding</strong> (<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/matter-labs/era-compiler-llvm/pull/835">PR #835</a>)</p><p><code>add</code>, <code>mulmod</code>, <code>exp</code>, <code>signext</code>, and <code>byte</code> now fold to literals when inputs are known at compile time, removing whole instruction sequences in the legacy pipeline.</p></li><li><p><strong>Sharper branch lowering</strong> (<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/matter-labs/era-compiler-llvm/pull/817">PR #817</a>)</p><p>solx now emits fewer instructions to set a <code>JUMPI</code> condition.</p></li></ul><p>These wins were partly offset when we restored explicit local function calls and let LLVM decide what to inline (<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/matter-labs/era-solidity/pull/1048">PR #1048</a>). The refactor produced smaller byte-code and faster builds, but runtime gas ticked up slightly because LLVM’s default inliner is too cautious for the EVM cost model. We’re retuning those heuristics and expect to regain the lost gas efficiency.</p><p><strong>Path forward</strong></p><p>LLVM underpins both the default and <code>--via-ir</code> modes, so every EVM-specific optimization that lives only in <code>--via-ir</code>can migrate into the main LLVM path. Constant folding was the first step; more moves are underway, so the <em>default</em> pipeline will ultimately include <strong>all</strong> LLVM optimizations <strong>and</strong> every <code>--via-ir</code> improvement.</p><h1 id="h-erc-20-gas-savings-potential-network-impact" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">ERC-20 Gas Savings — Potential Network Impact</h1><p>ERC-20 tokens (USDT, USDC, DAI, …) dominate Ethereum traffic, so we measured gas on the lean, audited <strong>Solady</strong> implementation. The same contract was compiled with <strong>solc 0.8.30</strong> and with the current <strong>solx beta</strong>, then run through Foundry’s <code>forge test --gas-report</code> <strong>200 times each</strong> (Solady’s harness injects randomness, so single runs are noisy). Average gas per call:</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/d86229d943af550fea6ea9d0e7b6398ed93616391f4f4fd20c10de483095f533.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p><em>(Negative Δ means solx is cheaper.)</em></p><p><strong>Why Solady?</strong></p><p>It mirrors real-world ERC-20 patterns while staying easy to benchmark. Solady ships its own gas-benchmarking harness, making large-sample runs easy. OpenZeppelin’s implementation doesn’t include comparable tooling out of the box, so Solady was the quicker path; quick hand-written trials on OpenZeppelin actually showed larger gas cuts, making the table above a conservative lower bound on real-world savings.</p><h3 id="h-aggregating-the-savings-how-much-255-gas-per-transfer-is-in-dollars" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Aggregating the savings — how much “-255 gas per transfer” is in dollars</h3><p>Ethereum sees about 1.5 million main-net transactions a day, and roughly 60 % of them are simple ERC-20 <code>transfers</code> — close to 900 000 moves of tokens every 24 hours. Shaving 255 gas off each call with solx (-0.56 % versus solc) removes around 230 million gas daily. In the quieter 2025 market, where gas has hovered near 2.6 Gwei, that’s roughly 0.60 ETH saved every day — about $1 600, or $0.6 million a year at today’s $2 800/ETH. During 2024’s busier spell, with averages nearer 15 Gwei and frequent spikes, the same 230 million gas translated to about $10 000 per day, or $3–4 million over the year; slicing 0.56 % off the $2.48 billion users paid in 2024 fees would have left roughly $14 million in their wallets. Even if only half of new tokens adopted solx, annual network-wide savings would still run well into seven figures — without touching a single line of Solidity.</p><blockquote><p>Please don’t rush critical contracts to mainnet.</p><p>solx already cuts gas and removes <em>stack-too-deep</em>, but we’re still hardening security. Treat these numbers as a preview of what full-scale adoption could unlock; test thoroughly before deploying anything mission-critical.</p></blockquote><h1 id="h-code-size-closing-the-gap" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Code size — closing the gap</h1><p>When we first spot-checked solx binaries earlier this year they were a little over <strong>20 % larger</strong> than solc’s. In the current beta that overhead has fallen to <strong>about 6 %</strong>. The code-size dashboard (<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://matter-labs.github.io/solx/codesize/0.1.0/">https://matter-labs.github.io/solx/codesize/0.1.0/</a>) shows the details contract by contract; at this point only two default-pipeline builds —Aave’s <em>StataTokenV2</em> and Beefy’s <em>StrategyAuraGyroMainnet</em> — still exceed Ethereum’s 24 576-byte limit.</p><p><strong>Recent compiler changes</strong></p><ul><li><p><strong>Inlining shifted to LLVM.</strong> Already explained in the previous section.</p></li><li><p><strong>Large-constant unfolding</strong> (<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/matter-labs/era-compiler-llvm/pull/833">PR #833</a>)<strong>.</strong> The backend now emits shorter sequences for small negatives and other literals when the gas trade-off is minimal, avoiding full-width <code>PUSH</code> instructions.</p></li></ul><p>The <strong>default pipeline remains gas-first</strong> — it adopts size tweaks only when they cost little or no runtime gas. For the few outlier contracts that still exceed the cap, we plan to offer an <strong>aggressive size-optimization fallback</strong> that prioritizes byte-code shrinkage over gas efficiency.</p><h1 id="h-compilation-time-catching-up" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Compilation time — catching up</h1><p>Right now the default solx pipeline still lags solc’s by a few-fold on wall-clock time, although it is already noticeably faster than <code>solc --via-ir --optimize</code>. We don’t have a public dashboard for this metric yet, but every pull request in the solx repo now gets a compile-time report from CI, so progress is tracked continuously.</p><p>Looking ahead, our <strong>MLIR pipeline</strong> is showing encouraging numbers: with LLVM optimizations enabled it compiles only a few‐tens-of-percent slower than solc <strong>with optimizations off</strong>. Once that pipeline is production-ready, we expect compilation speed to tighten further while keeping all current gas and size wins.</p><h1 id="h-why-trust-a-new-compiler-because-it-isnt" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Why Trust a “New” Compiler? Because It Isn’t</h1><p>Our May-2025 pre-alpha already cleared the Solidity compiler test-suite and real-world projects such as Uniswap V2 and Solmate. A detailed write-up (“<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://zksync.mirror.xyz/aCTbO6aDQdrPbUOFR9YMCt24p7-z5KZMMw_GqFz4tpE">Solx: The New Solidity Compiler — Why It Matters to You</a>”) covers those results.</p><p>With the <em>stack-too-deep</em> issue resolved, we have widened our test pool. Every project below builds cleanly, and all unit tests pass on solx beta:</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/33d93de00848842752ab591ebb86cc99b27ec785eb05575b67f52a61963ad664.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>† <em>Beefy note</em> Inline assembly in Beefy lacks the <code>memory-safe-assembly</code> tag; adding it turns the suite green.</p><p>Totals: ≈ 2 000 contracts, ≈ 6 400 unit tests — <strong>all green</strong>.</p><p>That is far from all the testing we have run. While solx may look new, its core is not: the same LLVM fork has powered <strong>zksolc</strong> (Solidity) and <strong>zkvyper</strong> (Vyper) on ZKsync since 2021. The only delta is about 9 000 LoC in the EVM code generator. Across contracts deployed to ZKsync we have seen <strong>zero</strong> post-deployment miscompilations; the lone genuine LLVM issue—the <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/matter-labs/era-compiler-solidity/security/advisories/GHSA-fpx7-8vc6-frjj">AAVE miscompilation</a>—was caught in testing and patched before release, plus <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/matter-labs/era-compiler-solidity/security/advisories">five additional miscompilations</a> introduced in our own ZKsync VM (EraVM) specific code; each was discovered during testing or bug-bounty report and is now fixed.</p><p>Today we believe solx is comparable at safety to <code>solc --via-ir --optimize</code>. The legacy solc pipeline — though ultra-conservative — delivers far fewer optimizations and often forces developers to hand-tune code. As compiler engineers we don’t think people at scale can do optimizations more securely than a thoroughly tested compiler. Nevertheless, the 401 open LLVM “miscompilation” tickets (<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/llvm/llvm-project/issues?q=is%3Aissue%20state%3Aopen%20label%3Amiscompilation">label = miscompilation, 11 Jul 2025</a>) remain a concern, and we do not assume LLVM is <em>secure enough</em> by default. Our first triage suggests that only 42 of them could realistically surface in solx:</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/d7d52b3050841f82fe67ead859cd0bb6f182a122c6b8d57eb9d9366fe9bd22c0.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>Before tackling those 42, we are defining a permanent triage and tracking process so we never repeat this snapshot exercise. Reported LLVM miscompilations will be kept out of our next releases.</p><blockquote><p>Recommendations</p><ul><li><p>Maintain <strong>100 % test coverage</strong> in your own codebases; well-tested code is far less likely to conceal an undetected optimization bug.</p></li><li><p>Feel free to <strong>battle-test solx on non-critical contracts today</strong>. For mission-critical deployments, wait until we raise our security bar further.</p></li></ul></blockquote><h1 id="h-conclusion-has-solx-really-fixed-stack-too-deep" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Conclusion — has solx <em>really</em> fixed stack-too-deep?</h1><p>Two months after our first public release, the beta compiles every contract that previously tripped over <em>stack-too-deep</em>—the error that has topped Solidity-developer pain charts for years.</p><p>So is the problem gone for good? <strong>Partly.</strong></p><p><em>Stack-too-deep</em> is eliminated in <strong>optimizing builds</strong>, meaning you can point solx at production code today and ship byte-code that solc’s default pipeline could never produce. What remains is a smooth <strong>development-time</strong> experience: lightning-fast, non-optimizing builds with source maps and coverage. Delivering that requires a “debug” pipeline, but—unlike <code>solc --via-ir</code>  detour—solx doesn’t need a separate code generator. Turning off most LLVM passes is enough, because the spill strategy already lives in the backend.</p><p>That puts a developer-friendly, non-optimizing pipeline well within reach. Once it lands, teams will compile fast, debug smoothly, and then flip the optimizer on for deployment — all without ever seeing <em>stack-too-deep</em> again.</p><p>This is our best idea for what to tackle next, but if you think we’re wrong — or have any feedback at all — please reach out on <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://t.me/solx_devs">Telegram</a> or email. Above all else we want solx to meet <em>your</em> needs. And if you haven’t tried it yet, head over to <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="http://solx.zksync.io"><strong>solx.zksync.io</strong></a> for an easy start.</p>]]></content:encoded>
            <author>zksync@newsletter.paragraph.com (ZKsync)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/e068906de6fd595796516c79615e0c00f33bd7fd1ff3ec8fec422fdbe6034acf.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[Introducing ZKsync Airbender: the World’s Fastest Open-Source RISC-V zkVM]]></title>
            <link>https://paragraph.com/@zksync/introducing-zksync-airbender-the-world-s-fastest-open-source-risc-v-zkvm</link>
            <guid>FT7Kqa7MMGdRDDpYD2CY</guid>
            <pubDate>Tue, 24 Jun 2025 18:43:03 GMT</pubDate>
            <description><![CDATA[Today we are proud to unveil ZKsync Airbender, a high-performance, general-purpose ZK prover designed to meet the real-world demands of interoperability, decentralization, and scalability without compromise. Airbender isn’t just fast. It’s the fastest open-source RISC-V zkVM we have seen. In benchmark tests, Airbender outperforms other leading systems by wide margins. It has achieved:sub-second proofs for ZKsync blocks, and ~3 second proofs using a single commodity GPU~4-6x faster speedup tha...]]></description>
            <content:encoded><![CDATA[<p>Today we are proud to unveil <strong>ZKsync Airbender</strong>, a high-performance, general-purpose ZK prover designed to meet the real-world demands of interoperability, decentralization, and scalability without compromise.</p><p>Airbender isn’t just fast. It’s the fastest open-source RISC-V zkVM we have seen. In benchmark tests, Airbender outperforms other leading systems by wide margins. It has achieved:</p><ul><li><p>sub-second proofs for ZKsync blocks, and ~3 second proofs using a single commodity GPU</p></li><li><p>~4-6x faster speedup than the closest contender.</p></li><li><p>the fastest proofs on a single H100 (21.8 million cycles per second for base layer, 8.5 million cycles per second end to end)</p></li><li><p>the ability to prove Ethereum blocks on average in under 35 seconds using just <strong>a single (!) GPU</strong> (vs existing set ups that use 50-160 GPUs for proofs in 12 seconds, depending on the size of the blocks).</p></li><li><p>Airbender can also prove Ethereum blocks in 17 seconds without recursion, which tells us that <strong>real-time proving on a single GPU is in the realm of possibility</strong>.</p></li></ul><p>These performance gains are more than just numbers. They unlock a future where chains coordinate and settle in real time, developers can build client-side apps with local proof generation, and entire ecosystems benefit from faster, cheaper, and more decentralized infrastructure.</p><h2 id="h-worlds-fastest-open-source-risc-v-zkvm" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">World’s fastest open-source RISC-V zkVM</h2><p>Airbender is fast, and we’ve got the numbers to back it up.</p><p>We tested Airbender against two leading zkVM proving systems, RiscZero and SP1 (Turbo), using a standardized Fibonacci program to ensure apples-to-apples comparison. Benchmarks were run on both NVIDIA L4 and H100 GPUs, and we measured performance across two stages:</p><ul><li><p><strong>Base Proving</strong>: the first round of proof generation</p></li><li><p><strong>STARK Recursion</strong>: followup rounds where base proofs are aggregated into one or a small number of final proofs.</p></li></ul><p>Here’s how Airbender stacks up (the higher the MHz, the faster the system):</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/ae9f5fbfafac7c7583ea3388ad6e1fbef039ec52ce73c8af47253fcb3f5e2227.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/9f0143e987be810994d27c45908645204156ba9b9fa1fb07d48525b7339ac42f.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p><strong>What these numbers show:</strong></p><ul><li><p>Airbender is the <strong>fastest base layer prover</strong> on both powerful (<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.nvidia.com/en-us/data-center/h100/">H100</a>) GPUs and smaller, economical (<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.nvidia.com/en-us/data-center/l4/">L4</a>) GPUs. On H100 it achieves <strong>21.8 MHz (millions of cycles proven per second)</strong>, compared to 3.45 MHz for SP1 Turbo and 1.1 MHz for RiscZero.</p></li><li><p>Airbender is the <strong>fastest end to end prover</strong> (including recursion): <strong>2.5-4X</strong> faster than SP1 Turbo and <strong>8.5-11X</strong> faster than RiscZero.</p></li></ul><p>You can reproduce <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/matter-labs/zksync-airbender/tree/main/examples/dynamic_fibonacci">these benchmarks yourself here</a><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/matter-labs/zksync-os/blob/main/docs/proving_ethereum.md">.</a> These are early results—and we’re just getting started. There are likely to be even more improvements in the coming weeks.</p><h2 id="h-near-real-time-ethereum-proofs-on-a-single-gpu" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0"><strong>Near Real-time Ethereum Proofs on a Single (!) GPU</strong></h2><p>By leveraging ZKsync Airbender and <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/matter-labs/zksync-os">ZKsync OS</a> (our new EVM execution environment), we were able to prove execution of an average Ethereum block <strong>in ~17 seconds</strong> using just a single H100 with ZKsync OS storage model before recursion <strong>and ~35 seconds end-to-end (with recursion).</strong> These <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/matter-labs/zksync-os/blob/main/docs/proving_ethereum.md">benchmarks can be reproduced here</a>.</p><p><strong>That is a major breakthrough that paves the path for home-proving Ethereum.</strong></p><p>Existing alternatives require massive hardware to achieve comparable results. For example, in Succinct’s Real Time Proving announcement, SP1 Hypercube took ~12 seconds to prove Ethereum blocks, but required 50-160 GPUs (Nvidia 4090s, <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.youtube.com/watch?v=4E-yaX-F7Qw&amp;t=1795s">roughly equivalent to H100</a>).</p><p>Airbender achieves comparable performance with a fraction of the hardware. More efficient proving doesn’t just mean lower costs. It’s what enables the future we are building toward: a decentralized network of chains that coordinate, settle, and interoperate in real time.</p><p>It’s worth noting that SP1 used a different execution environment and storage model, so this isn’t an apples-to-apples comparison of zkVMs. But that’s exactly our point: our performance stems from the strength of the full system, from zkVM to engine to proving architecture. Airbender’s efficiency is a product of deep integration across the ZKsync stack. In the end, what matters isn’t just raw benchmarks, but what a system can actually do. ZKsync can deliver near real-time block proving with consumer-grade hardware. That’s the breakthrough.</p><h2 id="h-sub-second-block-proofs-for-zksync-chains-and-beyond" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Sub-Second Block Proofs for ZKsync Chains and Beyond</h2><p>All new ZKsync Chains will use Airbender as a proof system moving forward, replacing the current Boojum prover. Chains like Abstract, Sophon, GRVT, Lens, and Memento will be able to migrate to Airbender and leverage its speed and efficiency. Airbender reduces proving costs to just $0.0001 per transfer, already more than 10x cheaper than Boojum, bringing meaningful savings and performance gains to apps across the Elastic Network.</p><p>Airbender isn’t just for ZKsync Chains. Its open-source design and RISC-V zkVM make it suitable for proving any type of program. It unlocks a broader future for general-purpose, verifiable applications. Its design supports proving on ordinary consumer hardware, opening the door for new use cases in gaming, identity, and decentralized AI. We’re continuing to improve the developer experience and will share updates soon at <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://x.com/zkSyncDevs">@ZKsyncDevs on X</a>.</p><h2 id="h-test-airbender-yourself" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Test Airbender Yourself!</h2><p>We’ve <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://demoapp.airbender.zksync.io/">released a fun app to showcase Airbender’s capabilities</a>. It’s designed to highlight what this kind of performance means in practice: from submitting tx to full block proof verification on a ZKsync OS testnet.</p><p>While Airbender is still in beta and not production-ready yet, developers can <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/matter-labs/zksync-airbender/tree/main">start building with Airbender today</a>. We are actively working on improving the developer experience, and would welcome feedback from any devs who try it out.</p><p>Whether you’re building private chains, ZK-native apps, or cross-chain infrastructure, Airbender offers a flexible zkVM and proving system purpose-built for fast, native interoperability. Its performance also unlocks new application design patterns, where chains can communicate in near real-time, and developers can coordinate logic across networks with trustless, low-latency execution.</p><h1 id="h-technical-deep-dive" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Technical Deep Dive</h1><h2 id="h-what-is-zksync-airbender" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">What is ZKsync Airbender?</h2><p>Those benchmarks are exciting, but let’s take a step back. What is Airbender?</p><p>Airbender is ZKsync’s new zkVM and proving system, designed to generate ZK proofs of RISC-V bytecode execution. It was built alongside ZKsync OS, our modular operating system for ZKsync Chains which is tailored to support a wide range of execution environments, including EVM, EraVM, and WASM. Put simply, Airbender and ZKsync OS bring more performance and more customizability for teams building in the Elastic Network.</p><p>The core proving engine is based on <strong>AIR constraints</strong> compiled into highly optimized DEEP STARK proofs over a Mersenne31 prime field. The system supports custom machine configurations, precompiled circuits (e.g. Blake2s/Blake3, big-integer arithmetic), and recursive proving modes.</p><p>This architecture allows developers and protocol operators to optimize for different use cases: decentralization, cost-efficiency, or proof compression.</p><h2 id="h-proving-architecture" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Proving Architecture</h2><p>Airbender’s performance, including the breakthrough to proving chains with a single GPU, is made possible by a set of carefully engineered components.</p><p>The proving pipeline follows a five-stage structure optimized for both flexibility and throughput:</p><ol><li><p><strong>Witness Commitment:</strong> Computes low-degree extensions (LDEs) and trace commitments.</p></li><li><p><strong>Lookup &amp; Memory Argument:</strong> Validates memory operations using lookup tables.</p></li><li><p><strong>STARK Quotient Polynomial:</strong> Encodes circuit constraints via AIR polynomials.</p></li><li><p><strong>DEEP Polynomial Construction:</strong> implements FRI batching to reduce proof size.</p></li><li><p><strong>FRI IOPP:</strong> Generates the final proximity proof.</p></li></ol><h2 id="h-execution-model" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Execution Model</h2><p>Airbender implements the <strong>RISC-V 32I+M instruction set</strong>, operating in a standard fetch-decode-execute loop. Bytecode is loaded via ROM and processed in chunks of ~4 million cycles. Prover performance can be scaled horizontally by stitching chunks together via memory arguments.</p><p>The system supports <strong>Kernel Mode</strong> for ZKsync OS system-level logic.</p><h2 id="h-design-considerations" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Design Considerations</h2><ul><li><p><strong>Hybrid CPU/GPU:</strong> Airbender supports proving with a CPU, a single GPU, or multiple GPUs. For the latter options, the CPU performs the RISC-V simulation and tracing, and then the GPU computes witness generation and the rest of the steps.</p></li><li><p><strong>RAM-Backed Registers:</strong> All 32-bit registers are implemented in RAM, simplifying the circuit and deferring register management to memory lookups.</p></li><li><p><strong>Mersenne31 Field Arithmetic:</strong> Fast arithmetic operations optimized for STARK performance.</p></li><li><p><strong>Custom Precompiles:</strong> Supports cryptographic operations and big integer math through a CSRRW-opcode-based delegation mechanism.</p></li></ul><h1 id="h-acknowledgements" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Acknowledgements</h1><p>Thank you to the many cryptographers and engineers that have helped push this industry forward. Special thanks to RiscZero for pioneering RISC-V zkVMs, Starkware for STARKs including Circle STARKs, and Polygon for the Mersenne31 Prime and work on the Circle Group. More detailed acknowledgements can be found <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/matter-labs/zksync-airbender/blob/b950cd4043219ef516a5a4a1b521b8a9ec64db69/NOTICE.md">in the Airbender repository.</a></p>]]></content:encoded>
            <author>zksync@newsletter.paragraph.com (ZKsync)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/15d58da06e88d151f84d50576dded105e6983626eed81a4827166f5d38be8b82.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[Introducing ZKsync Prividium: Private Blockchain Infra Built for Institutions]]></title>
            <link>https://paragraph.com/@zksync/introducing-zksync-prividium-private-blockchain-infra-built-for-institutions</link>
            <guid>gbU22nKklpOsEnegD4bd</guid>
            <pubDate>Tue, 27 May 2025 11:00:59 GMT</pubDate>
            <description><![CDATA[In the race to modernize financial infrastructure, enterprises face a difficult choice: either move fast and risk compliance, or stay compliant and fall behind. With the launch of ZKsync Prividium, they no longer have to choose. Prividium is a new product from ZKsync that delivers something no other blockchain platform can today: enterprise-grade privacy, built-in compliance, and seamless connection to Ethereum, all in a fully customizable, production-ready stack. Today we are proud to launch...]]></description>
            <content:encoded><![CDATA[<p>In the race to modernize financial infrastructure, enterprises face a difficult choice: either move fast and risk compliance, or stay compliant and fall behind.</p><p>With the launch of <strong>ZKsync Prividium</strong>, they no longer have to choose.</p><p>Prividium is a new product from ZKsync that delivers something no other blockchain platform can today: enterprise-grade privacy, built-in compliance, and seamless connection to Ethereum, all in a fully customizable, production-ready stack.</p><p>Today we are proud to launch with our first partner, <strong>Memento ZK Chain.</strong></p><h2 id="h-why-zksync-prividium-matters" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Why ZKsync Prividium Matters</h2><p>Enterprises, from global banks to fintech platforms, are under pressure to modernize the way they settle payments, manage assets, and move value across borders. But most private blockchain options come with serious limitations: they’re siloed, hard to audit, and disconnected from the broader public blockchain ecosystem.</p><p><strong>Prividium changes that.</strong> It gives institutions a way to bring real-world financial systems onchain: privately, compliantly, and at scale.</p><p>With Prividium, institutions can:</p><ul><li><p><strong>Deploy a private chain inside their own infrastructure.</strong> Run in a private cloud or on-premises. Data stays under their control.</p></li><li><p><strong>Meet regulatory standards from day one.</strong> Includes KYC/KYB, audit logs, onchain identity, and role-based access.</p></li><li><p><strong>Settle trustlessly on Ethereum.</strong> Every transaction is verified with ZK proofs and finalized on Ethereum for tamper-proof integrity.</p></li><li><p><strong>Customize every layer to match business needs.</strong> From governance to gas tokens to user experience, everything is configurable.</p></li><li><p><strong>Stay private without getting isolated.</strong> Each Prividium chain is custom-built, but can remain interoperable with Ethereum and other ZKsync Chains. Institutions can operate independently and still participate in cross-chain financial workflows.</p></li></ul><h2 id="h-launching-with-memento-a-real-world-deployment-in-institutional-finance" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Launching with Memento: A Real-World Deployment in Institutional Finance</h2><p>The first in-production deployment of Prividium is <strong>Memento ZK Chain</strong>, a compliance-focused chain built on ZKsync in collaboration with Deutsche Bank, designed to bring fund servicing fully onchain.</p><p>Originally incubated as <em>Project DAMA under</em> <strong>MAS Project Guardian</strong>, Memento ZK Chain is now launching on mainnet. It supports digital fund creation, investor onboarding, custody, KYC-gated access, onchain identity, and multi-chain accounting. Everything is secured by ZK proofs and anchored to Ethereum.</p><p>This is what modern institutional finance infrastructure looks like.</p><p><strong>Memento ZK Chain delivers:</strong></p><ul><li><p>Private validium architecture for institutional-grade privacy and scalability.</p></li><li><p>Near-instant settlements and automated fund servicing</p></li><li><p>KYC-gated access to meet global compliance standards</p></li><li><p>Full control over validator selection and data privacy</p></li><li><p>A live partnership with Deutsche Bank, with more to follow.</p></li></ul><h2 id="h-bring-your-infrastructure-onchain" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Bring Your Infrastructure Onchain</h2><p>The future of finance is onchain — but not all blockchains are built for institutions.</p><p>With Prividium, we’re giving enterprises the infrastructure they need to operate securely, meet compliance standards, and move faster in a connected ecosystem.</p><p>If you’re ready to bring your financial infrastructure onchain — without compromise — <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="http://www.zksync.io/enterprise/prividium">get in touch with our team</a>.</p>]]></content:encoded>
            <author>zksync@newsletter.paragraph.com (ZKsync)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/80341838c0e466739895695c9bdf26345ef3d899a4d754b5d6f2d8aae2445a34.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[solx: The New Solidity Compiler - For Toolchain Builders]]></title>
            <link>https://paragraph.com/@zksync/solx-the-new-solidity-compiler-for-toolchain-builders</link>
            <guid>YfoNzUUisZ5bRkD2IFjy</guid>
            <pubDate>Thu, 08 May 2025 12:35:08 GMT</pubDate>
            <description><![CDATA[For Toolchain Builders — Ship More, Maintain LessThis part is for tooling developers — those building new languages, compilers, debuggers, or targeting alternate EVMs and virtual machines. If you&apos;re only looking to use solx to compile smart contracts, Part 1 should cover everything you need. If you&apos;re working on compilers, debuggers, or alternate VMs, we recommend starting with Part 1 for context, then continuing here.With 2 man-years of engineering effort, solx has already reached ...]]></description>
            <content:encoded><![CDATA[<h1 id="h-for-toolchain-builders-ship-more-maintain-less" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">For Toolchain Builders — Ship More, Maintain Less</h1><blockquote><p>This part is for tooling developers — those building new languages, compilers, debuggers, or targeting alternate EVMs and virtual machines. If you&apos;re only looking to use solx to compile smart contracts, <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://zksync.mirror.xyz/aCTbO6aDQdrPbUOFR9YMCt24p7-z5KZMMw_GqFz4tpE">Part 1</a> should cover everything you need.</p><p>If you&apos;re working on compilers, debuggers, or alternate VMs, we recommend starting with <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://zksync.mirror.xyz/aCTbO6aDQdrPbUOFR9YMCt24p7-z5KZMMw_GqFz4tpE">Part 1</a> for context, then continuing here.</p></blockquote><p>With 2 man-years of engineering effort, solx has already reached a state where it produces better runtime gas efficiency than solc’s --via-ir --optimize pipeline — and it does so without tuning the LLVM optimizer or implementing any EVM-specific optimizations yet.</p><p>Thanks to LLVM, solx’s optimizer and code generator are under 8,000 lines of code and far easier to maintain than a custom pipeline. Much of the complexity typical of compiler development can be offloaded to LLVM’s existing infrastructure.</p><p>In this part, we briefly cover solx’s internal structure, how it can be reused or extended, and what it offers if you’re planning to:</p><ul><li><p>develop a new language or adapt an existing one for smart contract development,</p></li><li><p>implement an experimental EVM feature,</p></li><li><p>or retarget Solidity to something like RISC-V.</p></li></ul><h2 id="h-solx-architecture-overview" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">solx Architecture Overview</h2><p><strong>solx</strong> combines the standard Solidity front-end with a new LLVM-based back-end.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/64e437a97cdc66e48cc668f8b3a7f5b2ee4055e2d7f7b049e5ab89b96bc74345.png" alt="solx Architecture" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">solx Architecture</figcaption></figure><p>It reuses the entire solc front-end (lexer, parser, AST), ensuring full Solidity support and compatibility with language updates. From there, solc lowers the AST to Yul IR, which we translate into LLVM IR.</p><p>We also support solc’s legacy pipeline. Since it doesn&apos;t expose an IR, we lift the generated EVM assembly into LLVM IR. Because we observed some contracts that compile cleanly with the legacy pipeline fail or behave inconsistently under <code>--via-ir</code>, we’ve made the legacy path the default - just like solc does today. Users must explicitly pass <code>--via-ir</code> to use the Yul-based flow.</p><p>Once in LLVM IR, solx applies standard LLVM optimizations, then hands off to our custom EVM backend. This handles instruction selection, scheduling, stackification, and assembly or binary emission - reusing as much of LLVM’s infrastructure as possible.</p><p>This design let us deliver a working pre-alpha with two man-years of engineering effort, but it comes with trade-offs: some optimizations are currently inhibited, and binaries can be larger. We briefly touched on these issues in Part 1. To address them, we&apos;re developing a new high-level Solidity IR based on LLVM&apos;s MLIR framework.</p><p>But let’s start with focusing on what solx as a compiler infrastructure is offering today.</p><h2 id="h-why-modularity-matters-solidity-for-risc-v-rust-for-evm" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Why Modularity Matters: Solidity for RISC-V, Rust for EVM</h2><p>One of LLVM’s most important innovations dating back to the early 2000s was its <strong>Intermediate Representation</strong>. At the time, most compilers tightly coupled language-specific ASTs with target-specific code generators. LLVM IR introduced a <strong>complete and self-contained representation</strong> of programs, including type information and debug metadata. This let compiler components and tools operate entirely at the IR level without requiring access to language-specific internals.</p><p>Frontend developers started to rely on a simple and stable interface - LLVM IR - without needing to understand code generation or debug formats. Backend developers only needed to support that IR format, regardless of how the source language worked. The optimizer, meanwhile, transformed IR and automatically updated associated metadata and debug info. And in 2025, LLVM’s optimizer preserves debug information in optimized builds reasonably well, thanks in large part to demands from the gaming industry, which needs fully optimized code to remain debuggable.</p><p>LLVM’s modularity is what makes <strong>solx</strong> adaptable.</p><p>Vitalik Buterin recently floated the idea of <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://ethereum-magicians.org/t/long-term-l1-execution-layer-proposal-replace-the-evm-with-risc-v/23617#:~:text=would%20adapt%20to%20add%20RISC,barely%20notice%20the%20change%20at">replacing the EVM with a RISC-V–based machine</a> for Ethereum’s execution layer. If that ever happens, <strong>solx is ready -</strong> we estimate that adapting our LLVM IR from EVM to RISC-V would require less than 10% of the IR to change. In contrast, compilers like <strong>solc</strong> and <strong>Vyper</strong> would face a much steeper challenge. They would either need to start emitting LLVM IR or implement instruction selection, scheduling, register allocation, and binary emission for RISC-V from scratch.</p><p>This flexibility goes beyond backends. With LLVM, writing a new language for Ethereum requires just two entry points: <code>IRBuilder</code> for IR construction, and <code>DIBuilder</code> for debug info. You don’t need to know how the EVM works, or what <code>ethdebug</code> expects. You just write to the IR.</p><p>It makes the widespread idea of <strong>Rust for EVM</strong> within reach. We’re not working on this right now, and Rust isn’t a language designed for smart contract development. Still, supporting the EVM subset of LLVM IR we designed in Rust could be done <strong>with about one engineer-year of effort</strong>.</p><p>Modularity also means the ability to focus - without the necessity to maintain large bases of code.</p><h2 id="h-smaller-codebase-easier-maintenance" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0"><strong>Smaller Codebase, Easier Maintenance</strong></h2><p>At first glance, relying on LLVM might seem counterintuitive - it&apos;s a large system, and integrating it can appear to add complexity. But think of the alternative. Without reuse, not just optimizations, but all the foundational infrastructure - IR design, printing, parsing, assembly emission, and more - must be built from scratch and then maintained. In contrast, for solx we only maintains translation to LLVM IR and a custom LLVM backend for the EVM. To give you a sense of the difference, below is the <code>cloc</code> output for the EVM backend in solx compared to <code>libyul</code> and <code>libevmasm</code> from solc.</p><pre data-type="codeBlock" text="&gt; cloc solidity/libyul
---------------------------------------------------------------------------
Language                     files          blank        comment           code
---------------------------------------------------------------------------
C++                             96           2652           2269          15585
C/C++ Header                   108           1784           3781           5597
CMake                            1              2              0            207
Markdown                         1              2              0              3
---------------------------------------------------------------------------
SUM:                           206           4440           6050          21392
---------------------------------------------------------------------------
"><code><span class="hljs-operator">></span> cloc solidity<span class="hljs-operator">/</span>libyul
<span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span>
Language                     files          blank        comment           code
<span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span>
C<span class="hljs-operator">+</span><span class="hljs-operator">+</span>                             <span class="hljs-number">96</span>           <span class="hljs-number">2652</span>           <span class="hljs-number">2269</span>          <span class="hljs-number">15585</span>
C<span class="hljs-operator">/</span>C<span class="hljs-operator">+</span><span class="hljs-operator">+</span> Header                   <span class="hljs-number">108</span>           <span class="hljs-number">1784</span>           <span class="hljs-number">3781</span>           <span class="hljs-number">5597</span>
CMake                            <span class="hljs-number">1</span>              <span class="hljs-number">2</span>              <span class="hljs-number">0</span>            <span class="hljs-number">207</span>
Markdown                         <span class="hljs-number">1</span>              <span class="hljs-number">2</span>              <span class="hljs-number">0</span>              <span class="hljs-number">3</span>
<span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span>
SUM:                           <span class="hljs-number">206</span>           <span class="hljs-number">4440</span>           <span class="hljs-number">6050</span>          <span class="hljs-number">21392</span>
<span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span>
</code></pre><pre data-type="codeBlock" text="&gt; cloc solidity/libevmasm
---------------------------------------------------------------------------
Language                     files          blank        comment           code
---------------------------------------------------------------------------
C++                             20            716            649           6603
C/C++ Header                    24            583            995           2601
CMake                            1              1              0             47
---------------------------------------------------------------------------
SUM:                            45           1300           1644           9251
---------------------------------------------------------------------------
"><code><span class="hljs-operator">></span> cloc solidity<span class="hljs-operator">/</span>libevmasm
<span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span>
Language                     files          blank        comment           code
<span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span>
C<span class="hljs-operator">+</span><span class="hljs-operator">+</span>                             <span class="hljs-number">20</span>            <span class="hljs-number">716</span>            <span class="hljs-number">649</span>           <span class="hljs-number">6603</span>
C<span class="hljs-operator">/</span>C<span class="hljs-operator">+</span><span class="hljs-operator">+</span> Header                    <span class="hljs-number">24</span>            <span class="hljs-number">583</span>            <span class="hljs-number">995</span>           <span class="hljs-number">2601</span>
CMake                            <span class="hljs-number">1</span>              <span class="hljs-number">1</span>              <span class="hljs-number">0</span>             <span class="hljs-number">47</span>
<span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span>
SUM:                            <span class="hljs-number">45</span>           <span class="hljs-number">1300</span>           <span class="hljs-number">1644</span>           <span class="hljs-number">9251</span>
<span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span>
</code></pre><pre data-type="codeBlock" text="&gt; cloc --force-lang=&quot;C/C++ Header&quot;,def llvm/lib/Target/EVM
---------------------------------------------------------------------------
Language                     files          blank        comment           code
---------------------------------------------------------------------------
C++                             39           1180           1400           5661
C/C++ Header                    24            366            434           1198
TableGen                         4            241            191            915
CMake                            4             16              0            106
LLVM IR                          1             15              0             69
---------------------------------------------------------------------------
SUM:                            72           1818           2025           7949
"><code><span class="hljs-operator">></span> cloc <span class="hljs-operator">-</span><span class="hljs-operator">-</span>force<span class="hljs-operator">-</span>lang<span class="hljs-operator">=</span><span class="hljs-string">"C/C++ Header"</span>,def llvm<span class="hljs-operator">/</span>lib<span class="hljs-operator">/</span>Target<span class="hljs-operator">/</span>EVM
<span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span>
Language                     files          blank        comment           code
<span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span>
C<span class="hljs-operator">+</span><span class="hljs-operator">+</span>                             <span class="hljs-number">39</span>           <span class="hljs-number">1180</span>           <span class="hljs-number">1400</span>           <span class="hljs-number">5661</span>
C<span class="hljs-operator">/</span>C<span class="hljs-operator">+</span><span class="hljs-operator">+</span> Header                    <span class="hljs-number">24</span>            <span class="hljs-number">366</span>            <span class="hljs-number">434</span>           <span class="hljs-number">1198</span>
TableGen                         <span class="hljs-number">4</span>            <span class="hljs-number">241</span>            <span class="hljs-number">191</span>            <span class="hljs-number">915</span>
CMake                            <span class="hljs-number">4</span>             <span class="hljs-number">16</span>              <span class="hljs-number">0</span>            <span class="hljs-number">106</span>
LLVM IR                          <span class="hljs-number">1</span>             <span class="hljs-number">15</span>              <span class="hljs-number">0</span>             <span class="hljs-number">69</span>
<span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span>
SUM:                            <span class="hljs-number">72</span>           <span class="hljs-number">1818</span>           <span class="hljs-number">2025</span>           <span class="hljs-number">7949</span>
</code></pre><p>But it’s not the end, LLVM does not natively support <strong>stack machines</strong>, so we implemented <strong>stackification</strong> ourselves. In doing so, we drew inspiration from both the <strong>designs used in solc</strong> and the <strong>WASM backend in LLVM</strong>. This significantly increased the amount of code we need to maintain today.</p><p>Still, one can imagine generalizing stackification across stack-based targets - similar to how LLVM handles register machines through declarative target descriptions and shared algorithms. In LLVM, most of the code generation logic - like instruction selection, register allocation, and scheduling - is written once and reused across architectures. Targets such as x86, ARM, or RISC-V don’t each implement these from scratch; instead, they define their register sets, constraints, and instruction mappings declaratively. The LLVM backend then uses a shared pipeline to apply this information in a uniform way.</p><p>If integrated upstream, stackification generalization would be a meaningful contribution to LLVM itself - advancing support for all stack-based architectures and saving significant human-hours across the compiler ecosystem. It would also reduce solx maintenance burden in the long run. Here is the number of LoCs for stackification logic we have.</p><pre data-type="codeBlock" text="---------------------------------------------------------------------------
Language                     files          blank        comment           code
---------------------------------------------------------------------------
C++                              9            530            701           2759
C/C++ Header                     4            103            120            467
---------------------------------------------------------------------------
SUM:                            13            633            821           3226
---------------------------------------------------------------------------
"><code><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span>
Language                     files          blank        comment           code
<span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span>
C<span class="hljs-operator">+</span><span class="hljs-operator">+</span>                              <span class="hljs-number">9</span>            <span class="hljs-number">530</span>            <span class="hljs-number">701</span>           <span class="hljs-number">2759</span>
C<span class="hljs-operator">/</span>C<span class="hljs-operator">+</span><span class="hljs-operator">+</span> Header                     <span class="hljs-number">4</span>            <span class="hljs-number">103</span>            <span class="hljs-number">120</span>            <span class="hljs-number">467</span>
<span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span>
SUM:                            <span class="hljs-number">13</span>            <span class="hljs-number">633</span>            <span class="hljs-number">821</span>           <span class="hljs-number">3226</span>
<span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span><span class="hljs-operator">-</span>
</code></pre><p>This reflects a broader paradigm common in Web2 tooling: upstream whatever can be upstreamed. Maintaining compilers is expensive, and reducing custom logic is a proven way to keep development velocity high in long run.</p><h2 id="h-tooling-drives-compiler-development-speed" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Tooling Drives Compiler Development Speed</h2><p>Small teams rarely have time to build tools that support compiler development. But since solx is built on LLVM, it gets them for free. Here are three tools that, in our experience, have each saved us at least a human-day during the week we were working on this blogpost.</p><p><strong>Note:</strong> To try these tools yourself, you’ll need to build our <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/matter-labs/era-compiler-llvm">LLVM fork</a> - these tools aren’t bundled with solx directly.</p><h3 id="h-opt-and-llc-step-by-step-transformation-tracking" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0"><code>opt</code> and <code>llc</code>: Step-by-Step Transformation Tracking</h3><p><code>opt</code> and <code>llc</code> are LLVM’s command-line tools for running optimization passes and lowering IR to target code, respectively—and they’re invaluable for understanding what the compiler is doing.</p><p>In Part 1, we analyzed a contract’s performance and identified which transformations contributed to the observed gas savings. With LLVM, this kind of investigation is straightforward: <code>opt -print-changed</code> shows which passes modified the IR, and <code>--debug</code> reveals how those transformations were applied—or why some didn’t happen. The same applies to <code>llc</code>, which provides similar insights for the code generation phase.</p><h3 id="h-bugpoint-automatic-test-case-reduction" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0"><code>bugpoint</code>: Automatic Test Case Reduction</h3><p><code>bugpoint</code> is LLVM’s built-in tool for automatically minimizing test cases that trigger miscompilations or crashes.</p><p>While working on a stack-too-deep issue we found in a contract, we used <code>bugpoint</code> to reduce the size of problematic LLVM IR inputs—shrinking one from 67.6 KB to 8.6 KB of textual LLVM IR representation, and another from 75.3 KB to just 5.9 KB. These reductions made debugging faster and more focused.</p><h3 id="h-llvm-lit-and-updatellctestcheckspy-making-regression-testing-simple" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0"><code>llvm-lit</code> and <code>update_llc_test_checks.py</code>: Making Regression Testing Simple</h3><p>The contract reductions from the previous example were saved along with the bug fixes they exposed. Stackification is difficult to debug, and minimal test cases that trigger specific corner cases are worth preserving. LLVM’s testing tools make that easy: with <code>llvm-lit</code>, you can add IR-based tests that specify how to run the compiler and what to check. <code>update_llc_test_checks.py</code> then auto-generates assembly checks based on the current output.</p><p>These tools haven’t saved us a day yet on stackification - but based on prior experience, we know they will.</p><h2 id="h-llvm-for-ethereum" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">LLVM for Ethereum</h2><p>solx isn&apos;t only a command-line compiler - it’s a rethink of how Ethereum tooling can be built.</p><p>By leveraging LLVM, solx provides a modular, maintainable, and extensible compiler infrastructure. Teams can specialize, collaborate, and reuse tooling instead of rebuilding everything from scratch.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/903af10469ac1e8c87ad8a00476fe3bdc935930655d070388fcb71972b3ff82f.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>It also challenges a long-standing belief: that the EVM is too different for general-purpose tooling. Yes, the EVM has unique constraints. But it shares more with other platforms than often acknowledged. Like embedded systems, it imposes strict size limits, making optimization a correctness issue. Like game engines, debugging optimized builds is essential - replaying transactions of optimized bytecode requires it. And EVM isn’t even the only stack-based VM; LLVM already supports WebAssembly.</p><p>LLVM for Ethereum isn’t theoretical anymore - it’s here.</p><p>And with LLVM, tools like <code>llvm-cov</code> for coverage, <code>lldb</code> and VS Code for step-debugging, and other mainstream dev tools are within reach.</p><h2 id="h-building-with-us" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Building With Us</h2><p>If you&apos;re working on dev tools, solx is ready to be integrated, and extended to your needs. Here’s how you can start collaborating with us.</p><ul><li><p><strong>🧪 Integrate solx into dev tools:</strong> From a CLI perspective, solx works as a drop-in <code>solc</code> replacement. But if you encounter edge cases, we’re happy to help. If you need access to internal LLVM options not exposed in the CLI or to LLVM tools, we’re happy to assist with that as well.</p></li><li><p><strong>🤝 Contribute to solx:</strong> solx is an open-source project, and we welcome contributions - with no gatekeeping. Small additions like tests, bug fixes, or features are always welcome. If you’re planning something larger, we recommend reaching out early - it helps align efforts and avoid duplicate work. We do expect major contributions to be maintained.</p></li><li><p><strong>💬 Stay in touch:</strong> You can reach us via <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://t.me/+75Mv1Nh6SKEzNTAy">Telegram</a> or by email at <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="mailto:solx@matterlabs.dev"><strong>solx@matterlabs.dev</strong></a>. We’re always interested in hearing what you’re building, what you need, and where we can make things easier.</p></li></ul>]]></content:encoded>
            <author>zksync@newsletter.paragraph.com (ZKsync)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/a12af1c87957d121b7de0d0bd508a1c0c9b3a9f8cc457c58e46d4a988cc33c6c.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[solx: The New Solidity Compiler - Why It Matters to You]]></title>
            <link>https://paragraph.com/@zksync/solx-the-new-solidity-compiler-why-it-matters-to-you</link>
            <guid>cs5Af935Zu2VU6vEm6po</guid>
            <pubDate>Thu, 08 May 2025 12:01:14 GMT</pubDate>
            <description><![CDATA[For Solidity Developers - Write Clean Code, Spend Less Gassolx is a new optimizing compiler for Ethereum smart-contracts that could change the way you write and optimize Solidity code. Built on LLVM, solx focuses on improving runtime gas efficiency while reducing the need for manual workarounds. If you&apos;re a smart-contracts developer and gas costs matter to you, solx could help - some low-level tweaks you’re used to making might already be unnecessary, and more improvements are on the way...]]></description>
            <content:encoded><![CDATA[<h1 id="h-for-solidity-developers-write-clean-code-spend-less-gas" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">For Solidity Developers - Write Clean Code, Spend Less Gas</h1><p><strong>solx</strong> is <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://solx.zksync.io/">a new optimizing compiler for Ethereum</a> smart-contracts that could change the way you write and optimize Solidity code. Built on LLVM, solx focuses on improving <strong>runtime gas efficiency</strong> while reducing the need for manual workarounds.</p><p>If you&apos;re a <strong>smart-contracts developer</strong> and gas costs matter to you, solx could help - some low-level tweaks you’re used to making might already be unnecessary, and more improvements are on the way.</p><p>If you&apos;re a <strong>tooling or compiler engineer</strong>, or someone thinking about the future of Ethereum’s developer tooling, <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href=""><strong>Part 2</strong></a> explores solx as a modular compiler infrastructure — ready to support new languages, EVM extensions, or even <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://ethereum-magicians.org/t/long-term-l1-execution-layer-proposal-replace-the-evm-with-risc-v/23617">compiling Solidity to RISC-V</a>. We still suggest starting here to see what solx delivers today, in practice.</p><h2 id="h-solx-today" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">solx Today</h2><p>solx was built to improve runtime gas efficiency - but there’s no single number that captures the effect, as different contracts benefit differently. The best way to see the impact is to try solx yourself using <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://solx.zksync.io">the demo</a> we prepared. It’s streamlined for quick gas measurements, and adding new contracts is easy. The picture below shows some improvements from the demo - if it looks convincing, feel free to pause here and give it a try.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/4d606daeb95dfcabd54c6f277332d30afd85425a0dd97b598e4fcfa49868ebb9.png" alt="Gas consumption across different contracts" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">Gas consumption across different contracts</figcaption></figure><p><strong>solx is currently in pre-alpha.</strong> It passes our internal test suite, including all tests from the Solidity compiler repository and a number of real-world contracts such as Uniswap V2 and Solmate. We haven’t observed code generation issues except for <strong>stack-too-deep</strong> errors in larger projects. A breakdown is included below. The numbers indicate how many contracts compiled successfully out of the total for each project.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/b20c0e75ee8906404569c6f4d40fc8c54ad0319a2dcad19d0cf5eac43370eb08.png" alt="Number of contracts compiled successfully" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">Number of contracts compiled successfully</figcaption></figure><p><strong>Basic Foundry integration already works.</strong> solx can be used as a drop-in replacement for <code>solc</code> in Foundry workflows, although contract linking is not fully supported yet. Hardhat integration is more challenging and requires further work.</p><p>Still, don’t assume solx can be dropped into production just because it works as a <code>solc</code> replacement in Foundry. You will still need to <strong>retest your contracts</strong>. Even if the contracts have worked reliably with solc, solx may expose different edge cases - and vice versa. When switching back from solx to solc, especially its modern optimizing pipeline <code>solc --via-ir --optimize</code> retesting is essential as well.</p><p>Aiming for 100% code coverage almost excludes the possibility of compiler bugs affecting your project. Fuzzing and other forms of testing are welcome too - in our experience, when developers rigorously test their own code, compiler bugs simply don’t go unnoticed. Still, until we address the remaining stack-too-deep issues and check solx more broadly against real-world contracts, we recommend holding off on production use.</p><p>Or, if you&apos;re interested in doing more than just waiting - let us know about your project and your intent to use solx. We can add your contracts to our benchmarking suite and start optimizing for your use case. You can reach us via <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://t.me/+75Mv1Nh6SKEzNTAy">Telegram</a>, or by email at <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="mailto:solx@matterlabs.dev"><strong>solx@matterlabs.dev</strong></a>.</p><p>The next section explains when solx works well, where it might fall short, and how it compares to <code>solc</code> across common usage patterns.</p><h2 id="h-when-gas-usage-drops" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">When Gas Usage Drops</h2><p>Don&apos;t worry - we won&apos;t explain every classical compiler optimization here. Instead, this section will walk you through four simple examples that highlight what solx can do in practice.</p><p>The examples are intentionally simple and focus on extremes to make the patterns obvious. But the broader guidance is:</p><ul><li><p>The more computations vs. storage operations your contract has, the more likely you’ll benefit from solx.</p></li><li><p>The more branches and loops your code contains, the more likely you’ll benefit from solx.</p></li><li><p>The cleaner your code and the fewer manual optimizations, the more solx can help.</p><p>If you’ve manually inlined functions, precomputed constants, or reordered expressions to save gas, you probably did a good job. But solx might make that manual optimization unnecessary.</p></li></ul><p>For each example, we share a link to <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://godbolt.org/">Compiler Explorer</a>, a tool that lets you inspect the generated EVM assembly and compare outputs from different compilers side by side. To keep things simple, we compare <code>solc --optimize</code> with <code>solx</code> using default parameters or <code>solc --via-ir --optimize</code> with <code>solx --via-ir</code>. You’re welcome to experiment with other options or LLVM-specific flags.</p><p>Note: solx emits a slightly different textual format for EVM assembly, but we’ve tried to make it comprehensible without needing to explain the syntax here.</p><h3 id="h-example-1-caching-storage-variables" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Example 1: Caching Storage Variables</h3><pre data-type="codeBlock" text="// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract FactorialStorage {
    uint256 private result;

    // 57! fits in uint256, 58! does not
    uint256 constant MAX_SAFE_N = 57;

    function computeFactorial(uint256 n) external {
        if (n &gt; MAX_SAFE_N) {
            revert(&quot;Overflow: n too large&quot;);
        }

        result = 1;
        unchecked {
            for (uint256 i = 2; i &lt;= n; ++i) {
                result *= i;
            }
        }
    }

    function getResult() external view returns (uint256) {
        return result;
    }
}
"><code><span class="hljs-comment">// SPDX-License-Identifier: MIT</span>
<span class="hljs-meta"><span class="hljs-keyword">pragma</span> <span class="hljs-keyword">solidity</span> ^0.8.0;</span>

<span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">FactorialStorage</span> </span>{
    <span class="hljs-keyword">uint256</span> <span class="hljs-keyword">private</span> result;

    <span class="hljs-comment">// 57! fits in uint256, 58! does not</span>
    <span class="hljs-keyword">uint256</span> <span class="hljs-keyword">constant</span> MAX_SAFE_N <span class="hljs-operator">=</span> <span class="hljs-number">57</span>;

    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">computeFactorial</span>(<span class="hljs-params"><span class="hljs-keyword">uint256</span> n</span>) <span class="hljs-title"><span class="hljs-keyword">external</span></span> </span>{
        <span class="hljs-keyword">if</span> (n <span class="hljs-operator">></span> MAX_SAFE_N) {
            <span class="hljs-keyword">revert</span>(<span class="hljs-string">"Overflow: n too large"</span>);
        }

        result <span class="hljs-operator">=</span> <span class="hljs-number">1</span>;
        <span class="hljs-keyword">unchecked</span> {
            <span class="hljs-keyword">for</span> (<span class="hljs-keyword">uint256</span> i <span class="hljs-operator">=</span> <span class="hljs-number">2</span>; i <span class="hljs-operator">&#x3C;</span><span class="hljs-operator">=</span> n; <span class="hljs-operator">+</span><span class="hljs-operator">+</span>i) {
                result <span class="hljs-operator">*</span><span class="hljs-operator">=</span> i;
            }
        }
    }

    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">getResult</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">external</span></span> <span class="hljs-title"><span class="hljs-keyword">view</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span> (<span class="hljs-params"><span class="hljs-keyword">uint256</span></span>) </span>{
        <span class="hljs-keyword">return</span> result;
    }
}
</code></pre><p>In the <code>FactorialStorage</code> example (<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://godbolt.org/z/f171467Th">view on Compiler Explorer</a>), both of solc&apos;s optimizing pipelines — the legacy path and <code>--via-ir --optimize</code> — keep storage accesses (<code>sstore</code> and <code>sload</code>) inside the loop. Specifically, solc emits:</p><ul><li><p>an initial <code>sstore</code> before the loop,</p></li><li><p>and a <code>sload</code>/<code>sstore</code> pair on every loop iteration.</p></li></ul><p>In contrast, <strong>solx</strong> recognizes the pattern and restructures the code:</p><ul><li><p>it uses a temporary variable for the loop computation,</p></li><li><p>and lifts the <code>sstore</code> <strong>out of the loop</strong>.</p></li></ul><p>Note that <code>unchecked</code> is essential — without it, the compiler cannot assume that multiplication won&apos;t overflow, so updating storage on each iteration becomes necessary for correctness. Still, <strong>solx</strong> will eliminate the <code>sload</code> from the loop even in that case.</p><p>The initial <code>sstore</code> before the loop remains, even though it’s possible to optimize it away. Except for that, the generated binary works as the following loop.</p><pre data-type="codeBlock" text="uint tmp = 1;
for (uint i = 2; i &lt;= n; ++i) {
    tmp *= i;
}
result = tmp;
"><code><span class="hljs-keyword">uint</span> tmp <span class="hljs-operator">=</span> <span class="hljs-number">1</span>;
<span class="hljs-keyword">for</span> (<span class="hljs-keyword">uint</span> i <span class="hljs-operator">=</span> <span class="hljs-number">2</span>; i <span class="hljs-operator">&#x3C;</span><span class="hljs-operator">=</span> n; <span class="hljs-operator">+</span><span class="hljs-operator">+</span>i) {
    tmp <span class="hljs-operator">*</span><span class="hljs-operator">=</span> i;
}
result <span class="hljs-operator">=</span> tmp;
</code></pre><h3 id="h-example-2-a-complex-case-of-constant-folding" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Example 2: A Complex Case of Constant Folding</h3><pre data-type="codeBlock" text="// SPDX-License-Identifier: MIT
pragma solidity &gt;=0.4.16;

contract Foldable {
    function entry() public pure returns(uint64) {
        return test() + test() + test();
    }

    function test() private pure returns(uint64) {
        for (uint8 i = 0; i &lt; 2; i++) {
            uint8 j = 1;
            while (j &lt; 4) {
                uint8 p = 0;
                do {
                    p += 2;
                    if (p == 8)
                        break;
                    for (uint8 h = 1; h &lt;= 4; h++) {
                        if (h &gt; 2)
                            break;
                        for (uint8 k = 10; k &lt; 12; k++) {
                            uint8 x = 6;
                            do {
                                x -= 1;
                                if (x == 0)
                                    break;
                                uint8 y = 10;
                                while (y &lt; 17) {
                                    y += 1;
                                }
                            } while (true);
                        }
                    }
                } while (true);
                j *= 2;
            }
        }
        return 1;
    }
}
"><code><span class="hljs-comment">// SPDX-License-Identifier: MIT</span>
<span class="hljs-meta"><span class="hljs-keyword">pragma</span> <span class="hljs-keyword">solidity</span> >=0.4.16;</span>

<span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">Foldable</span> </span>{
    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">entry</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">pure</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span>(<span class="hljs-params"><span class="hljs-keyword">uint64</span></span>) </span>{
        <span class="hljs-keyword">return</span> test() <span class="hljs-operator">+</span> test() <span class="hljs-operator">+</span> test();
    }

    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">test</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">private</span></span> <span class="hljs-title"><span class="hljs-keyword">pure</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span>(<span class="hljs-params"><span class="hljs-keyword">uint64</span></span>) </span>{
        <span class="hljs-keyword">for</span> (<span class="hljs-keyword">uint8</span> i <span class="hljs-operator">=</span> <span class="hljs-number">0</span>; i <span class="hljs-operator">&#x3C;</span> <span class="hljs-number">2</span>; i<span class="hljs-operator">+</span><span class="hljs-operator">+</span>) {
            <span class="hljs-keyword">uint8</span> j <span class="hljs-operator">=</span> <span class="hljs-number">1</span>;
            <span class="hljs-keyword">while</span> (j <span class="hljs-operator">&#x3C;</span> <span class="hljs-number">4</span>) {
                <span class="hljs-keyword">uint8</span> p <span class="hljs-operator">=</span> <span class="hljs-number">0</span>;
                do {
                    p <span class="hljs-operator">+</span><span class="hljs-operator">=</span> <span class="hljs-number">2</span>;
                    <span class="hljs-keyword">if</span> (p <span class="hljs-operator">=</span><span class="hljs-operator">=</span> <span class="hljs-number">8</span>)
                        <span class="hljs-keyword">break</span>;
                    <span class="hljs-keyword">for</span> (<span class="hljs-keyword">uint8</span> h <span class="hljs-operator">=</span> <span class="hljs-number">1</span>; h <span class="hljs-operator">&#x3C;</span><span class="hljs-operator">=</span> <span class="hljs-number">4</span>; h<span class="hljs-operator">+</span><span class="hljs-operator">+</span>) {
                        <span class="hljs-keyword">if</span> (h <span class="hljs-operator">></span> <span class="hljs-number">2</span>)
                            <span class="hljs-keyword">break</span>;
                        <span class="hljs-keyword">for</span> (<span class="hljs-keyword">uint8</span> k <span class="hljs-operator">=</span> <span class="hljs-number">10</span>; k <span class="hljs-operator">&#x3C;</span> <span class="hljs-number">12</span>; k<span class="hljs-operator">+</span><span class="hljs-operator">+</span>) {
                            <span class="hljs-keyword">uint8</span> x <span class="hljs-operator">=</span> <span class="hljs-number">6</span>;
                            do {
                                x <span class="hljs-operator">-</span><span class="hljs-operator">=</span> <span class="hljs-number">1</span>;
                                <span class="hljs-keyword">if</span> (x <span class="hljs-operator">=</span><span class="hljs-operator">=</span> <span class="hljs-number">0</span>)
                                    <span class="hljs-keyword">break</span>;
                                <span class="hljs-keyword">uint8</span> y <span class="hljs-operator">=</span> <span class="hljs-number">10</span>;
                                <span class="hljs-keyword">while</span> (y <span class="hljs-operator">&#x3C;</span> <span class="hljs-number">17</span>) {
                                    y <span class="hljs-operator">+</span><span class="hljs-operator">=</span> <span class="hljs-number">1</span>;
                                }
                            } <span class="hljs-keyword">while</span> (<span class="hljs-literal">true</span>);
                        }
                    }
                } <span class="hljs-keyword">while</span> (<span class="hljs-literal">true</span>);
                j <span class="hljs-operator">*</span><span class="hljs-operator">=</span> <span class="hljs-number">2</span>;
            }
        }
        <span class="hljs-keyword">return</span> <span class="hljs-number">1</span>;
    }
}
</code></pre><p>The <code>Foldable</code>example (<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://godbolt.org/z/ab87vxT3T">view on Compiler Explorer</a>) shows how LLVM is able to precompute even complex expressions that are doable at compile time.</p><p>While solc with --via-ir --optimize performs most of the computations written in the source, solx --via-ir detects that the final result is 3 and replaces the entire computation with the constant directly.</p><p>If you had previously put precomputed numbers into your contract, you can now leave computations written explicitly - it is often more robust than writing comments explaining what specific numbers mean.</p><p>More importantly, constant folding is not limited to precomputing standalone constants. Constant expressions often appear as a side effect of other optimization passes or logic lowering, such as addressing an array element by index. solx can fold such expressions even across branches and loops whenever they are statically determinable.</p><h3 id="h-example-3-loop-optimizations" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Example 3: Loop Optimizations</h3><p>We observed that general-purpose sorting algorithms with no storage interaction work significantly better in solx than in Solidity’s current optimizers.</p><p>In particular, in our benchmarks on random input, <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://godbolt.org/z/z3fMfxz6j">Bubble Sort</a> used 64% less gas and <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://godbolt.org/z/65TzaYosf">Quick Sort</a> 51% less gas compared to solc --via-ir --optimize (with solc --optimize performing even worse).</p><p>One of the reasons why is that in solc, the base address of an array is recomputed on every iteration, while solx extracts loop-counter independent computations out of the loop and fold constants.</p><p>If computations with arrays are in your hot code, solx can automatically optimize them without requiring manual restructuring.</p><h3 id="h-example-4-loop-unrolling-and-arrays" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Example 4: Loop Unrolling And Arrays</h3><p>Manual loop unrolling is common in Solidity libraries. In Uniswap V4’s <code>TickMath.getSqrtPriceAtTick</code>, 19 steps are unrolled explicitly instead of using a loop (<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://godbolt.org/z/ovW6jrb44">view on Compiler Explorer</a>).</p><p>We rewrote the logic using a <code>for</code> loop and an array of constants (<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://godbolt.org/z/7363e6dKd">view on Compiler Explorer</a>):</p><ul><li><p>With <strong>solc</strong>, gas usage rose from <strong>1365</strong> to <strong>3524</strong> - a 2.5× increase.</p></li><li><p>With <strong>solx</strong>, gas increased from <strong>965</strong> to <strong>2451</strong> - again about 2.5×.</p></li><li><p>But solx can automatically unroll loops when the number of iterations is known at compile time.</p></li></ul><p>To enable this, use:</p><pre data-type="codeBlock" text="--llvm-options=&apos;--unroll-count=20&apos;
"><code><span class="hljs-operator">-</span><span class="hljs-operator">-</span>llvm<span class="hljs-operator">-</span>options<span class="hljs-operator">=</span><span class="hljs-string">'--unroll-count=20'</span>
</code></pre><p>This brings gas down to <strong>1197</strong> - just a 24% increase instead of 150%, and already better than solc’s manually unrolled version.</p><p>We don’t enable this unrolling by default because it involves a trade-off: unrolling reduces runtime gas but increases bytecode size. Since Solidity contracts have a size cap, applying this optimization indiscriminately could backfire. That’s why solx leaves it up to you.</p><p>Some of the remaining overhead comes from inefficient constant array initialization- another area we’re targeting for improvement in our upcoming MLIR-based frontend.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/a310217f143140b6f228ae5e0fdaed1341fd3dec5224063bd2e0a3bc6aadb1fd.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><h2 id="h-whats-coming-next" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">What’s Coming Next</h2><p>Here are the areas we currently consider most important - some are already in progress, others are next on our list:</p><ul><li><p><strong>Stack-too-deep resolution</strong> is underway. This is our top priority and will remove one of the last blockers for solx adoption in large contracts.</p></li><li><p><strong>MLIR-based Solidity IR</strong> is in active development. Currently, solx reuses parts of solc’s frontend up to intermediate representation emission. This helped us deliver a pre-alpha faster, but it comes at the cost of bloated binaries and missed optimization opportunities. By replacing these components with our own frontend, we aim to unlock optimizations solc can’t support - like constant array folding (see Example 4) and eliminating redundant heap allocations, as shown in the example below.</p></li></ul><pre data-type="codeBlock" text="// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

contract HeapLoopExample {
    struct Item {
        uint256 x;
        uint256 y;
    }

    function compute() public pure returns (uint256 sum) {
        for (uint256 i = 0; i &lt; 100; ++i) {
            // This allocates memory for a struct in each iteration
            Item memory item = Item({x: i, y: i * 2});
            sum += item.x + item.y;
        }
    }
}
"><code><span class="hljs-comment">// SPDX-License-Identifier: MIT</span>
<span class="hljs-meta"><span class="hljs-keyword">pragma</span> <span class="hljs-keyword">solidity</span> ^0.8.20;</span>

<span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">HeapLoopExample</span> </span>{
    <span class="hljs-keyword">struct</span> <span class="hljs-title">Item</span> {
        <span class="hljs-keyword">uint256</span> x;
        <span class="hljs-keyword">uint256</span> y;
    }

    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">compute</span>(<span class="hljs-params"></span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> <span class="hljs-title"><span class="hljs-keyword">pure</span></span> <span class="hljs-title"><span class="hljs-keyword">returns</span></span> (<span class="hljs-params"><span class="hljs-keyword">uint256</span> sum</span>) </span>{
        <span class="hljs-keyword">for</span> (<span class="hljs-keyword">uint256</span> i <span class="hljs-operator">=</span> <span class="hljs-number">0</span>; i <span class="hljs-operator">&#x3C;</span> <span class="hljs-number">100</span>; <span class="hljs-operator">+</span><span class="hljs-operator">+</span>i) {
            <span class="hljs-comment">// This allocates memory for a struct in each iteration</span>
            Item <span class="hljs-keyword">memory</span> item <span class="hljs-operator">=</span> Item({x: i, y: i <span class="hljs-operator">*</span> <span class="hljs-number">2</span>});
            sum <span class="hljs-operator">+</span><span class="hljs-operator">=</span> item.x <span class="hljs-operator">+</span> item.y;
        }
    }
}
</code></pre><ul><li><p><strong>ethdebug support</strong> is within reach. LLVM tracks debug info through optimization passes; solx will emit LLVM debug metadata in the frontend and translate it to ethdebug in the backend - making optimized contracts easier to debug.</p></li></ul><p>Our priorities aren’t set in stone. Your input could help us focus on features that are truly in demand. If we’ve missed something - don’t hesitate to tell us.</p><h2 id="h-how-to-get-involved" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">How to Get Involved</h2><p>If you’ve made it this far, chances are you’re interested in solx. Here’s how you can get started and contribute:</p><ul><li><p><strong>🔥 Try the Demo:</strong> If you haven’t already, take a moment to try the <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://solx.zksync.io/">demo</a>. It includes everything you need to start working with solx. But don’t stop at the bundled examples — <strong>compile your own contracts</strong>, compare gas usage, bytecode, and behavior. It’s the fastest way to see what solx can do.</p></li><li><p><strong>📝 Share Feedback:</strong> As you experiment, let us know what you find. Did solx reduce gas for a specific function? Did it behave unexpectedly in some edge case? We’re listening. The best way to reach us is via our <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://t.me/+75Mv1Nh6SKEzNTAy">telegram channel</a>. You can also send questions or feedback via email: <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="mailto:solx@matterlabs.dev"><strong>solx@matterlabs.dev</strong></a>.</p></li><li><p><strong>📣 Spread the Word:</strong> If you found solx interesting or useful, share it with your team, post your findings, or just mention it in developer forums. The more people experiment with it, the faster we can identify real-world needs and improve. We also promote blog posts, benchmarks, and feedback shared by the community - so if you write or record something about solx, let us know!</p></li></ul><h1 id="h-" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0"></h1>]]></content:encoded>
            <author>zksync@newsletter.paragraph.com (ZKsync)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/99f0cf4ce3c6b4b6fa76cf33384a965af64b7637c4ffacd76fb95ffdb8fde0f0.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[Incident Report: Compromised admin key to unclaimed airdrop tokens]]></title>
            <link>https://paragraph.com/@zksync/incident-report-compromised-admin-key-to-unclaimed-airdrop-tokens</link>
            <guid>3Kacu8tYx3i3cLepSiG5</guid>
            <pubDate>Fri, 25 Apr 2025 13:55:41 GMT</pubDate>
            <description><![CDATA[Incident SummaryOn April 13th, a compromised admin account minted the remaining unclaimed tokens from the ZK token Merkle distributors used for the ZKsync June 17th 2024 airdrop. The hacker successfully took control of 111,881,122 ZK tokens (equivalent to ~$5M at the moment of the initial transaction). The transaction can be viewed here. On the morning of April 15th, Matter Labs engineering team identified the scope of the compromise. Together with the ZKsync Association and ZKsync Foundation...]]></description>
            <content:encoded><![CDATA[<h1 id="h-incident-summary" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0"><strong>Incident Summary</strong></h1><p>On April 13th, a compromised admin account minted the remaining unclaimed tokens from the ZK token Merkle distributors used for the ZKsync June 17th 2024 airdrop. The hacker successfully took control of 111,881,122 ZK tokens (equivalent to ~$5M at the moment of the initial transaction). The transaction can be viewed <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://explorer.zksync.io/tx/0x14b120ff26e8d678fdaa26eef81cf166cb8bc1a20e9bdef6a02fd2af2ee0071e">here</a>.</p><p>On the morning of April 15th, Matter Labs engineering team identified the scope of the compromise. Together with the ZKsync Association and ZKsync Foundation, Matter Labs started investigating and initiated initial incident response measures.</p><p>This incident was contained to three specific ZK token Merkle distributor contracts from the June 2024 ZK airdrop with a compromised admin key. No additional ZK tokens can be minted from any of the distributors, as the total capped supply of each has been fully minted. No further exploits of these distributor contracts via this admin key are possible.</p><p>On April 23rd, following a safe harbor offer from the ZKsync Security Council, the hacker <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://x.com/TheZKNation/status/1915110305790660939">returned the funds</a>, thus resolving the case. The funds are now in custody of the Security Council, and the decision on what will be done with the funds will be made by governance.</p><p>The compromise was possible due to a procedural error which misclassified the risks of the airdrop distributor contracts, resulting in a failure to update their security configuration.</p><p>The investigation has not uncovered any issues regarding distributor code standards, development, or implementation. The investigation also confirmed that the ZKsync protocol, ZK token contract, all three governance contracts, and all active Token Program capped minters were not impacted by this incident.</p><p>The identity of the hacker, and the exact method they used to compromise the key on the admin multisig, is still unknown at this time. The multisig that was the admin of the ZK token Merkle distributors was generated by a former ZKsync contributor who has not been employed at any ZKsync affiliated entity since last year. The investigation has not found evidence of malicious intent by the former contributor.</p><h2 id="h-exploit-methodology" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Exploit Methodology</h2><p>The abnormal activity was identified to be linked to the three <strong>Merkle distributor</strong> contracts from the ZK airdrop in June 2024:</p><ul><li><p>ZK token Merkle distributor 1: <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://explorer.zksync.io/address/0x66fd4fc8fa52c9bec2aba368047a0b27e24ecfe4">0x66fd4fc8fa52c9bec2aba368047a0b27e24ecfe4</a></p></li><li><p>ZK token Merkle distributor 2: <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://explorer.zksync.io/address/0xb294F411cB52c7C6B6c0B0b61DBDf398a8b0725d">0xb294F411cB52c7C6B6c0B0b61DBDf398a8b0725d</a></p></li><li><p>ZK token Merkle distributor 3: <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://explorer.zksync.io/address/0xf29d698e74ef1904bcfdb20ed38f9f3ef0a89e5b">0xf29d698e74ef1904bcfdb20ed38f9f3ef0a89e5b</a></p></li></ul><p>Upon investigation, the Matter Labs engineering team discovered that a breached key compromised the ZK token Merkle distributors’ admin, set as a 1/1 multisig (<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://app.safe.global/transactions/history?safe=zksync:0x842822c797049269A3c29464221995C56da5587D">0x842822c797049269A3c29464221995C56da5587D)</a>.</p><p>The admin was not assigned to the Token Governor as expected after the initial setup process and was not set up as the standard 3/5 minimum used across all other contracts. The admin, unchanged since contract deployment, had access to a single function: <code>sweepUnclaimed()</code>. This function could not be initiated until after the end of the airdrop distribution period on January 3rd 2025. The multisig that was the admin of distribution contracts is not related to any other contracts.</p><p>The hacker called the <code>sweepUnclaimed()</code> function through the multisig and minted 111,881,122 unclaimed ZK tokens (tx:<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://explorer.zksync.io/tx/0x14b120ff26e8d678fdaa26eef81cf166cb8bc1a20e9bdef6a02fd2af2ee0071e">0x14b120ff26e8d678fdaa26eef81cf166cb8bc1a20e9bdef6a02fd2af2ee0071e</a>).</p><p>The ZKsync Association has confirmed that the <code>sweepUnclaimed()</code> function called on the ZK token Merkle distributors was not a governance authorized action. Unclaimed ZK token supply was to remain unminted, unless actioned by the Token Assembly. The function design was included to give the Token Assembly the option to mint the unclaimed tokens and distribute them through a Token Program after the claim period was complete.</p><p>The method to access the secret key for the admin multisig signer has not been identified.</p><h2 id="h-impact" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Impact</h2><p>From 12:32 UTC on Sunday April 13th 2025 to 12:05 UTC on Tuesday April 15th 2025, the hacker swapped a total ~67,193,843 ZK tokens for ETH (<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://explorer.zksync.io/address/0xb1027ed67f89c9f588e097f70807163fec1005d3?page=1&amp;pageSize=100#transfers">swaps linked here</a>). The swap from ZK to ETH took place via repeated transactions. Subsequently, the hacker withdrew ~1,116 ETH to Ethereum mainnet (transactions linked <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://etherscan.io/address/0xb1027ED67f89c9F588E097f70807163feC1005d3#internaltx">here</a>) to the same address.</p><p>The ZKsync Security Council sent an <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://etherscan.io/tx/0xca7b921ae9174616fc443e36f4aec8610ee3c7da0f8dc49b3cd97f9d38a05b1b">onchain message</a> to the hacker on Monday, April 21st at 15:03 UTC. In an effort to resolve this matter in the spirit of safe harbor, they offered a 10% bounty for returning 90% of the funds involved in the exploit. The return window was available for 72 hours from the time of publication of this message on Ethereum. On Wednesday, April 23rd at 14:39 UTC, 90% of the funds were returned to the <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://explorer.zksync.io/address/0xfFB6126FF8401665081b771bB11cCD0e09f95D5A#transfers">Era</a> and <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://etherscan.io/tx/0xa344a0e759652246e51b1def91c8081b3527bdbbcab92128100f8fbc11c204df">Ethereum L1</a> addresses controlled by the Security Council. As the funds were returned before the deadline, no legal action is being taken with regards to this incident. <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://x.com/TheZKNation/status/1915110305790660939">This post</a> acknowledges their cooperation and closed the case without further action.</p><h2 id="h-scope" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Scope</h2><p>This incident is isolated to the admin of the ZK token Merkle distributor contracts used for the ZK airdrop in June 2024. The ongoing investigation has identified that this incident was enabled by a compromised airdrop admin key of the 1/1 admin multisig controlling these distributor contracts. No additional ZK tokens can be minted from any of the distributors, as the total capped supply of each has been fully minted. No further exploits of these distributor contracts via this method are possible. The compromised admin key was not in control of any other contracts and could not perform any actions besides minting unclaimed tokens from the airdrop after the claim window expired.</p><p>The ZKsync protocol, ZK token contract, all three governance contracts and timelocks, and all active Token Program capped minters were not impacted by this incident.</p><h2 id="h-investigation-results" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Investigation Results</h2><ul><li><p>The ZK token Merkle distributors were not classified as high risk. The security review processes completed at the launch of the ZK token and governance system addressed all critical issues related to the in-scope protocol and governance system. However, the investigation confirmed that the ZK token Merkle distributors used for the airdrop were not included in the same review process; they were not considered the same risk profile. As a result, the security review did not uncover risks related to administrative controls of the ZK token Merkle distributors after the airdrop claim window closed. The security review also did not identify the distributors as a recommendation to include in the <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.tally.xyz/gov/zksync/proposal/35395412545014978447594654620386134175315194219985614464693911512436668500487?govId=eip155:324:0x496869a7575A1f907D1C5B1eca28e4e9E382afAb">Token Assembly’s Safe Harbor</a> agreement.</p></li><li><p>The ZK token Merkle distributor contracts included the <code>sweepUnclaimed()</code> function, which was not necessary given the design of the ZKsync token governance, based on minting rights. The function should have been omitted from the initial design.</p></li><li><p>There were insufficient monitoring methods on the ZK token distributors. Monitoring has been in place for all critical functions of the token, Merkle distributor contracts, and capped minters, including the mint function. However, it wasn’t triggered due to and error in its implementation.</p></li><li><p>The multisig that was the admin of the ZK token Merkle distributors remained a 1/1 after creation. The standard process of creating multisigs for contract admins is to initially configure a multisig as a 1/1. This provided flexibility to deploy the Merkle distributor contract, and update it with the appropriate target configuration. Should there have been an active admin role, the role should have been transferred to the ZKsync Token Governor upon governance launch. This transition did not happen. The security review of onchain access management conducted as a part of the current investigation has not identified any other contract with access misconfigurations.</p></li><li><p>The multisig that was the admin of the ZK token Merkle distributors was generated by a former ZKsync contributor. This individual has not been employed at any ZKsync affiliated entity (ZKsync Association, ZKsync Foundation, Matter Labs) since last year. The investigation has not found evidence of malicious intent by the former contributor.</p></li><li><p>The identity of the hacker, and the exact method they used to compromise the key on the admin multisig, is still unknown at this time.</p></li></ul><h2 id="h-mitigation-efforts" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Mitigation Efforts</h2><p>The hacker continued to swap ZK into ETH until measures were taken to prevent further transactions on April 15th.</p><p>At 12:05 UTC on April 15th Matter Labs implemented temporary transaction filtering for the compromised account on the ZKsync Era sequencer, preventing the account from completing any additional transactions and moving any additional funds. At 12:16 UTC on April 15th, transaction filtering for this account was applied on L1 forced inclusion queue as well. After the funds had been returned, Matter Labs fully disabled the temporary transaction filter—removing it from the sequencer and L1 contracts at 13:42 UTC on April 24th.</p><p>Matter Labs, as the ZKsync Era Mainnet chain sole sequencer, implemented transaction filtering to protect the funds that should have been in control by the Token Assembly. This action was taken by Matter Labs once they confirmed with the ZKsync Association that the minting of unclaimed ZK tokens was an unauthorized action.</p><p>While the work is under way to upgrade ZKsync to Stage 1 and implement decentralized sequencing, Era is currently operating as a Stage 0 rollup, which made this measure possible. At the point that Stage 1 is reached or a decentralized sequencing is implemented, any sequencer has the technical ability to refuse serving specific transactions. It is important to emphasize that ZKsync governance and the Security Council have the ability to replace the sequencer at any point and remove all filters.</p><h2 id="h-preventative-recommendations" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0"><strong>Preventative Recommendations</strong></h2><p>This incident primarily highlighted a failure in security risk assessment. However, contract design, multisig management, and monitoring processes on ZK token distributors can be improved to further mitigate risks related to potential future incidents.</p><p>The following measures will be implemented:</p><ul><li><p>Implementation of scheduled key rotation for every critical multisig associated with ZK token and protocol.</p></li><li><p>Development and adherence to an updated contract risk assessment policy and governance contract multisig policy, to be documented publicly on the <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.zknation.io/">ZK Nation Documentation</a> portal.</p></li><li><p>Deployment and e2e testing of real-time monitoring and alerting infrastructure for all onchain contracts with access to the ZK token or Protocol.</p></li><li><p>Amendment of Token Program guidelines to require usage of <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://forum.zknation.io/t/zk-capped-minter-v2-nested-minters-start-time-expiration-pause-and-cancel/417">Capped Minter V2</a> introduced in December 2024 for all token programs, which includes a pre-specified end-date that automatically prevents minting outside of the token program window.</p></li><li><p>Finalization of ongoing Minter Modifiers development which include security enhancements such as Rate Limits, Mint Delay, and Minter Eligibility (<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://forum.zknation.io/t/capped-minter-framework-update-r-d-on-minter-mods-and-zk-token-return/647">read more here</a>).</p></li></ul><h2 id="h-path-forward-for-returned-funds" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Path Forward for Returned Funds</h2><p>The ZKsync Association is working with the Security Council to explore options to exchange the recovered ETH into ZK tokens over time, and return the final ZK to the Token Assembly. Feedback on the plan will be requested from Guardians, Security Council, Delegates, and the ZKsync Foundation.</p><p>Once the plan is agreed, a proposal will then be put forward and voted on by the Token Assembly following the standard proposal guidelines. Additional information regarding ZKsync governance proposals can be found at <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.zknation.io">docs.zknation.io</a>.</p><h2 id="h-closing-statement" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Closing Statement</h2><p>ZKsync Association, ZKsync Foundation, and Matter Labs appreciate the patience and support of the ZKsync community during the investigation of this incident.</p><p>Thank you to technical partners, security experts, and exchanges for their support in the incident investigation to date. We are grateful for the active and engaged Telegram and Discord community who raised the issue to community mods which helped identify the incident and respond. If you have questions or concerns, please reach out at <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://incident@zksync.io">incident@zksync.io</a>.</p><hr><h2 id="h-appendix-1-list-of-contracts-and-addresses" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Appendix 1: List of Contracts and Addresses</h2><ul><li><p><strong>ZK token Merkle distributor contracts on ZKsync Era L2</strong></p><ul><li><p>ZK token Merkle distributor 1: <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://explorer.zksync.io/address/0x66fd4fc8fa52c9bec2aba368047a0b27e24ecfe4">0x66fd4fc8fa52c9bec2aba368047a0b27e24ecfe4</a></p></li><li><p>ZK token Merkle distributor 2: <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://explorer.zksync.io/address/0xb294F411cB52c7C6B6c0B0b61DBDf398a8b0725d">0xb294F411cB52c7C6B6c0B0b61DBDf398a8b0725d</a></p></li><li><p>ZK token Merkle distributor 3: <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://explorer.zksync.io/address/0xf29d698e74ef1904bcfdb20ed38f9f3ef0a89e5b">0xf29d698e74ef1904bcfdb20ed38f9f3ef0a89e5b</a></p></li></ul></li><li><p><strong>Compromised Multisig on ZKsync Era L2</strong></p><ul><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://explorer.zksync.io/address/0x842822c797049269A3c29464221995C56da5587D">0x842822c797049269A3c29464221995C56da5587D</a></p></li></ul></li><li><p><strong>Compromised Signer on ZKsync Era L2</strong></p><ul><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://explorer.zksync.io/address/0x649CDf36A1cc0E27A0D157a161E4Fe4E92B29E6f">0x649CDf36A1cc0E27A0D157a161E4Fe4E92B29E6f</a></p></li></ul></li><li><p><strong>Hacker</strong> <code>sweepUnclaimed()</code> <strong>transaction on ZKsync Era L2</strong></p><ul><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://explorer.zksync.io/tx/0x14b120ff26e8d678fdaa26eef81cf166cb8bc1a20e9bdef6a02fd2af2ee0071e">0x14b120ff26e8d678fdaa26eef81cf166cb8bc1a20e9bdef6a02fd2af2ee0071e</a></p></li></ul></li><li><p><strong>Hacker Address</strong></p><ul><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://etherscan.io/address/0xb1027ED67f89c9F588E097f70807163feC1005d3">0xb1027ED67f89c9F588E097f70807163feC1005d3</a></p></li></ul></li><li><p><strong>ZK to ETH Swap Transaction List</strong></p><ul><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://era.zksync.network/address/0xb1027ED67f89c9F588E097f70807163feC1005d3#tokentxns">https://era.zksync.network/address/0xb1027ED67f89c9F588E097f70807163feC1005d3#tokentxns</a></p></li></ul></li><li><p><strong>Withdrawal Transaction from ZKsync Era L1 to Ethereum Mainnet L1</strong></p><ul><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.google.com/spreadsheets/d/1rDgIy50PTMn4775FJR1_hiL0eTo4dtVkDYscqwL88_A/edit?gid=279392287#gid=279392287">https://docs.google.com/spreadsheets/d/1rDgIy50PTMn4775FJR1_hiL0eTo4dtVkDYscqwL88_A/edit?gid=279392287#gid=279392287</a></p></li><li><p>Bridge Withdrawal txn on L1 for 1,002 ETH: <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://etherscan.io/tx/0x334a716559dd95b368af1dc1b4587b9c555cc94711b7018c9551537974a80030">https://etherscan.io/tx/0x334a716559dd95b368af1dc1b4587b9c555cc94711b7018c9551537974a80030</a></p></li></ul></li><li><p><strong>Onchain message from Security Council to hacker:</strong> <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://etherscan.io/tx/0xca7b921ae9174616fc443e36f4aec8610ee3c7da0f8dc49b3cd97f9d38a05b1b">https://etherscan.io/tx/0xca7b921ae9174616fc443e36f4aec8610ee3c7da0f8dc49b3cd97f9d38a05b1b</a></p></li><li><p><strong>Return Transaction to ZKsync Security Council on ZKsync Era and Ethereum Mainnet L1</strong></p><ul><li><p>ZKsync Era: <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://explorer.zksync.io/address/0xfFB6126FF8401665081b771bB11cCD0e09f95D5A#transfers">https://explorer.zksync.io/address/0xfFB6126FF8401665081b771bB11cCD0e09f95D5A#transfers</a></p></li><li><p>Ethereum L1: <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://etherscan.io/tx/0xa344a0e759652246e51b1def91c8081b3527bdbbcab92128100f8fbc11c204df">https://etherscan.io/tx/0xa344a0e759652246e51b1def91c8081b3527bdbbcab92128100f8fbc11c204df</a></p></li></ul></li></ul><h2 id="h-appendix-2-detailed-timeline-of-incident-events" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0"><strong>Appendix 2: Detailed Timeline of Incident Events</strong></h2><ul><li><p><strong>Sunday, June 16th 2024</strong></p><ul><li><p>[19:45 UTC] The first ZK Token Merkle distributors deployed</p></li></ul></li><li><p><strong>Monday, June 17th 2024</strong></p><ul><li><p>[06:45 UTC] The first round of ZK Token Airdrop begins</p></li></ul></li><li><p><strong>Friday, June 21st 2024</strong></p><ul><li><p>[17:40 UTC] The second ZK Token Merkle distributors deployed</p></li></ul></li><li><p><strong>Monday, June 24th 2024</strong></p><ul><li><p>[07:00 UTC] The second round of ZK Token Airdrop begins</p></li></ul></li><li><p><strong>Tuesday, June 25th 2024</strong></p><ul><li><p>[21:09 UTC] The third ZK Token Merkle distributors deployed</p></li></ul></li><li><p><strong>Thursday, June 27th 2024</strong></p><ul><li><p>[07:00 UTC] The third round of ZK Token Airdrop begins</p></li></ul></li><li><p><strong>Friday, January 3rd 2025</strong></p><ul><li><p>[10:59 UTC] The first ZK Token Airdrop claim window ends and <code>sweepUnclaimed()</code> function becomes active.</p></li><li><p>[22:59 UTC] The second and the third ZK Token Airdrop claim window ends and <code>sweepUnclaimed()</code> function becomes active.</p></li></ul></li><li><p><strong>Sunday, April 13th 2025</strong></p><ul><li><p>[12:18 UTC] Hacker calls sweepUnclaimed() to mint the remaining unclaimed ZK from three Merkle distributor contracts used during the initial ZK token airdrop in June 2024.</p></li><li><p>[12:32 UTC] Hacker begins swapping ZK for ETH.</p></li></ul></li><li><p><strong>Monday, April 14th 2025</strong></p><ul><li><p>[20:05 UTC] Community discussion on Telegram and Discord raises questions whether the token movements might be an exploit or an OTC sell.</p></li><li><p>[20:47 UTC] Individual Matter Labs team member explains to community members that Matter Labs Team and Investors have locked tokens and, as a result, would not be selling.</p></li></ul></li><li><p><strong>Tuesday, April 15th 2025</strong></p><ul><li><p>[7:14 UTC] Discord community members escalate report of continued abnormal activity to Matter Labs community manager. Community manager gathers facts related to possible incident.</p></li><li><p>[7:40 UTC] Matter Labs team is internally alerted by community manager to confirm abnormal activity from an unknown account.</p></li><li><p>[9:27 UTC] Matter Labs engineering team begins internal inquiry to try and determine the owner of the wallet and analyze the token movements.</p></li><li><p>[9:39 UTC] ZKsync Association is notified by Matter Labs and Discord Community mods of ongoing discussion regarding suspicious activity related to recent mint transaction. ZKsync Association begins internal review of active capped minters.</p></li><li><p>[10:09 UTC] Upon review, ZKsync Association confirms the mint activity is not related to any active Token Program capped minters. The ZKsync Foundation confirms the minting activity is not related to capped minters under their control. ZKsync Association, Matter Labs, and ZKsync Foundation escalate incident priority.</p></li><li><p>[10:20 UTC] Incident investigation call started with members of Matter Labs, ZKSync Association, and ZKsync Foundation.</p></li><li><p>[10:25 UTC] The joint investigation confirms ZK token Merkle Distributor contracts deployed in June 2025 were the source of minted tokens and admin configuration was compromised.</p></li><li><p>[10:32 UTC] Guardians and Security Council notified of the incident.</p></li><li><p>[11:00 UTC] ZKsync Association begins internal security review of all ZKsync token related contracts to determine if any other contracts are at risk.</p></li><li><p>[13:35 UTC]: Matter Labs confirms transaction filter deployed on ZKsync Era L2 contracts and ZKsync protocol L1 contracts to reject transactions related to hacker address.</p></li><li><p>[13:49 UTC] <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://x.com/zksync/status/1912141160744632737">First X post</a> was published from ZKSync’s X account notifying the community of the known details of the incident.</p></li><li><p>[14:05 UTC] Seal 911 establishes contact with Matter Labs to confirm the hacker’s address.</p></li><li><p>[14:13 UTC] Seal 911 reported hacker address to major centralized exchanges and instant-swap providers.</p></li><li><p>[14:43 UTC]: ZKsync Foundation confirms contact with CEX’s to prevent further fund movement.</p></li><li><p>[15:25 UTC] <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://x.com/zksync/status/1912165357642473488">Second X post</a> was published from ZKSync’s X account updating the community with additional known details of the incident.</p></li><li><p>[15:31 UTC] <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://x.com/gluk64/status/1912166820498329643">X AMA thread </a>started by Alex Gluchowski, CEO of Matter Labs, from his X account.</p></li></ul></li><li><p><strong>Wednesday, April 16th 2025</strong></p><ul><li><p>[18:11 UTC] <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://x.com/zksync/status/1912569616150458389">X update post</a> confirming attack contained to airdrop distribution contracts and no additional ZK tokens can be minted from this contract.</p></li><li><p>[20:16 UTC] Matter Labs prepares emergency upgrade calldata that would burn ZK tokens held by the hacker on the ZKsync Era network, to be executed only if additional issues are identified.</p></li><li><p>[21:11 UTC] Guardians convene to assess the emergency upgrade proposal based on ZK Credo principles.</p></li></ul></li><li><p><strong>Thursday, April 17th 2025</strong></p><ul><li><p>[11:53 UTC] Security Council, Guardians, and ZKsync Foundation begin gathering signatures for Emergency-upgrade proposal, in line with governance procedures.</p></li></ul></li><li><p><strong>Friday, April 18th 2025</strong></p><ul><li><p>[10:17 UTC] Emergency upgrade transaction receives all required signatures and is queued for execution in case further issues would be detected.</p></li><li><p>[19:59 UTC] Security Council discusses Safe Harbor offer that would grant the hacker a 10% bounty for returning the funds.</p></li></ul></li><li><p><strong>Saturday, April 19th 2025</strong></p><ul><li><p>[15:12 UTC] Security Council begins gathering signatures for the on-chain message addressed to the hacker.</p></li></ul></li><li><p><strong>Monday, April 21st 2025</strong></p><ul><li><p>[15:03 UTC] <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://etherscan.io/tx/0xca7b921ae9174616fc443e36f4aec8610ee3c7da0f8dc49b3cd97f9d38a05b1b">Onchain message</a> sent from Security Council to hacker.</p></li><li><p>[15:19 UTC] <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://x.com/zksync/status/1914338083983499593">X post</a> from ZKsync with update on ongoing investigation, mitigation efforts, and path forward.</p></li><li><p>[15:20 UTC] <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://x.com/TheZKNation/status/1914338338804244511">X post</a> from ZK Nation announcing onchain message from the Security Council to hacker with a 10% bounty offer for 72 hours.</p></li></ul></li><li><p><strong>Tuesday, April 22nd 2025</strong></p><ul><li><p>Finalization of communications and response measures based on bounty offer outcomes.</p></li></ul></li><li><p><strong>Wednesday, April 23th 2025</strong></p><ul><li><p>[14:39 UTC] Hacker returns 100% of ZK on L2 to Security Council address (<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://explorer.zksync.io/tx/0x4d79d0ffcca0098e69f642930de90d58adcda42ee649870a68f9279fcfcd418e">see transaction</a>).</p></li><li><p>[14:45 UTC] Hacker returns 100% of ETH on L2 to Security Council address (<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://explorer.zksync.io/tx/0xfb4ae0efd38aedee7712046317397fe695ab8b90e7169870875c611887dce166">see transaction</a>).</p></li><li><p>[14:53 UTC] Hacker returns 776 ETH on L1 to Security Council address (<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://etherscan.io/tx/0xa344a0e759652246e51b1def91c8081b3527bdbbcab92128100f8fbc11c204df">see transaction</a>).</p></li><li><p>[18:27 UTC] <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://x.com/TheZKNation/status/1915110305790660939">X post</a> from ZK Nation announcing funds has been returned to Security Council addresses.</p></li></ul></li><li><p><strong>Thursday, April 24th 2025</strong></p><ul><li><p>[15:49 UTC] <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://etherscan.io/tx/0x0f328dff43f3c2d30a1dcb7ee51a800b62452c0f6f568a9bb6e9e4a783b8ffa2">Transaction</a> removing the Transaction Filterer is executed.</p></li><li><p>Finalization of incident report and publishing plan.</p></li></ul></li><li><p><strong>Friday, April 25th 2025</strong></p><ul><li><p>Publication of incident report.</p></li></ul></li></ul>]]></content:encoded>
            <author>zksync@newsletter.paragraph.com (ZKsync)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/5d912086902239f90ead3bd67551f0e5d0b8bd94a393213201539083c90f9ea4.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[EVM Bytecode Compatibility Is Now Live on ZKsync Era]]></title>
            <link>https://paragraph.com/@zksync/evm-bytecode-compatibility-is-now-live-on-zksync-era</link>
            <guid>qFTy6mzIc87z71ibiaqr</guid>
            <pubDate>Wed, 02 Apr 2025 13:55:23 GMT</pubDate>
            <description><![CDATA[ZKsync has achieved EVM equivalence with EVM Interpreter:Developers can run unmodified EVM bytecode.This means tools like Foundry and Hardhat just work out of the box.EVM bytecode interpreter features:Deploy Solidity & Vyper contracts without recompilation — just like on Ethereum.Works with Foundry, Hardhat, and Remix natively, no plugins needed.Same address derivation (create, create2) as Ethereum.Pre-deployed contracts (Create2 Proxy, Safe Factory, Multicall3…) for seamless onboarding.Some ...]]></description>
            <content:encoded><![CDATA[<blockquote><p>ZKsync has achieved <strong>EVM equivalence</strong> with <strong>EVM Interpreter</strong>:</p><ul><li><p>Developers can run unmodified EVM bytecode.</p></li><li><p>This means tools like Foundry and Hardhat <em>just work</em> out of the box.</p></li></ul><p>EVM bytecode interpreter features:</p><ul><li><p>Deploy <strong>Solidity &amp; Vyper contracts without recompilation</strong> — just like on Ethereum.</p></li><li><p><strong>Works with Foundry, Hardhat, and Remix</strong> natively, no plugins needed.</p></li><li><p><strong>Same address derivation</strong> (create, create2) as Ethereum.</p></li><li><p><strong>Pre-deployed contracts</strong> (Create2 Proxy, Safe Factory, Multicall3…) for seamless onboarding.</p></li><li><p><strong>Some limitations remain</strong> (e.g., higher gas costs than native EraVM, no delegatecall between EVM and EraVM).</p></li></ul></blockquote><h2 id="h-enabling-evm-bytecode-compatibility-on-zksync-era" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Enabling EVM Bytecode Compatibility on ZKsync Era</h2><p>When Matter Labs started working on ZKsync Era, achieving full EVM compatibility in a general-purpose ZK rollup was widely viewed as a major technical challenge. There were no existing general-purpose ZK virtual machines or open-source circuits for proving Ethereum opcodes. The team had to build everything from scratch, making trade-offs to bring ZKsync to production.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/a8cb66966b51e9ffc2322f5c8f8ee68c315b8475e8dc3c48f763d8dbfd564a36.png" alt="ZKsync Protocol &lt;= v27" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">ZKsync Protocol &lt;= v27</figcaption></figure><p>One of those trade-offs was not implementing a Type 2 ZK-EVM (which fully matches EVM bytecode) but instead designing a <strong>ZK-optimized and stable virtual machine</strong>: <strong>EraVM</strong>. This allowed ZKsync to launch much sooner, but it introduced differences from the EVM that affected developer experience and tooling compatibility.</p><p>Over the past two years, the team has made significant improvements to <strong>developer experience</strong>, refining tooling and addressing key pain points. However, despite these efforts, some teams were still unable to deploy their projects due to incompatibilities with EraVM, while others simply required full EVM equivalence to maintain consistency with their existing codebase. The demand for a solution that allows unmodified EVM bytecode to run seamlessly on ZKsync was clear and today we’re addressing that.</p><hr><h2 id="h-the-path-forward" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">The Path Forward</h2><p>While EVM Equivalence is here today, we want to make it even better in the future:</p><ol><li><p><strong>EVM Interpreter (Today):</strong> The first step is an <strong>EVM Interpreter</strong> that runs on top of EraVM and allows EVM bytecode execution. This enables EVM tools like Foundry and Hardhat to work out of the box on ZK chains like Era, without requiring plugins or extensions.</p></li><li><p><strong>Native EVM Execution (Coming Soon):</strong> The next step will come with Boojum 2.0, a new proving system and VM that will enable <strong>native</strong> EVM execution. We shared some technical details during ETH Denver with more to come in the following weeks. For an overview, refer to <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://forum.zknation.io/t/matter-labs-q1-planning-high-level-overview/495?u=anthonyrose">this post from Anthony Rose in the ZK Nation forum</a>.</p></li></ol><p>The EVM Interpreter, <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://forum.zknation.io/t/zip-9-v27-evm-emulation-upgrade/626">included in protocol upgrade v27</a>, is a significant milestone, adding EVM equivalence to ZKsync Sepolia testnet, and soon to all ZK Chains.</p><hr><h2 id="h-what-developers-can-expect" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">What Developers Can Expect</h2><p>With the introduction of the EVM Bytecode Interpreter, developers can now deploy and execute unmodified EVM bytecode, eliminating the need for custom compilers or modified tooling.</p><ul><li><p>The interpreter targets the <strong>Cancun EVM version</strong>, which was activated on Ethereum mainnet in March 2024.</p></li><li><p>Developers can deploy <strong>EVM bytecode contracts without recompilation</strong>, using standard Solidity and Vyper compilers. Foundry, Hardhat, and Remix work out of the box without requiring special plugins or modifications.</p></li><li><p>Address derivation follows Ethereum’s behavior, meaning contracts deployed using <code>create</code> and <code>create2</code> generate the same addresses as they would on Ethereum.</p></li><li><p><strong>EVM bytecode contracts and EraVM contracts can interact normally,</strong> except for <code>delegatecall</code>, which is not supported across environments.</p></li></ul><p>To further improve compatibility, the interpreter includes pre-deployed contracts for common use cases:</p><ul><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/Arachnid/deterministic-deployment-proxy"><strong>Create2 proxy</strong></a> (Arachnid) – <code>0x4e59b44847b379578588920cA78FbF26c0B4956C</code></p></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/pcaversaccio/create2deployer"><strong>Create2 deployer</strong></a> (pcaversaccio) - <code>0x13b0D85CcB8bf860b6b79AF3029fCA081AE9beF2</code></p></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://eips.ethereum.org/EIPS/eip-2470"><strong>ERC2470 singleton factory</strong></a> – <code>0xce0042B868300000d44A59004Da54A005ffdcf9f</code></p></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/safe-global/safe-singleton-factory"><strong>Safe Singleton Factory</strong></a> – <code>0x914d7Fec6aaC8cd542e72Bca78B30650d45643d7</code></p></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/mds1/multicall"><strong>Multicall3</strong></a> (mds1) – <code>0xcA11bde05977b3631167028862bE2a173976CA11</code></p></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/Zoltu/deterministic-deployment-proxy"><strong>Create2 proxy</strong></a> (Zoltu) - <code>0x7A0D94F55792C434d74a40883C6ed8545E406D12</code></p></li></ul><h2 id="h-how-it-works" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">How It Works</h2><p>ZKsync’s <strong>EVM Interpreter</strong> allows developers to deploy and run unmodified EVM bytecode on top of EraVM. Instead of requiring contracts to be compiled into EraVM-specific bytecode, the interpreter interprets EVM opcodes at runtime, making it possible to use standard Ethereum tooling without modifications.</p><p>At a high level, here’s how it works:</p><ul><li><p><strong>EraVM remains the core execution environment.</strong> The EVM Interpreter does not replace EraVM but runs as a translation layer inside it. This means both native EraVM contracts and EVM bytecode contracts can coexist.</p></li><li><p><strong>EVM contracts are flagged and routed through the interpreter.</strong> When an EVM contract is deployed, it is tagged with a special identifier. Instead of executing native bytecode, the EVM Interpreter is invoked to process its logic.</p></li><li><p><strong>Opcodes are interpreted in real-time.</strong> The interpreter translates EVM instructions into EraVM operations as they execute, ensuring compatibility with Ethereum’s behavior.</p></li><li><p><strong>EraVM gas (ergs) is used, not EVM gas.</strong> Gas fees are paid in <strong>ergs</strong> (EraVM gas units), and while the costs may differ from Ethereum’s pricing model, transactions remain significantly cheaper than on Layer 1.</p></li></ul><p>For more details, read the <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.zksync.io/zksync-protocol/evm-emulator/overview">EVM Emulator documentation</a>.</p><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/f4caeef0bceeae36c676c9aa482a9884e41c36d2bb240aa9e69ba62e847c984e.png" alt="ZKsync Protocol v27" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="">ZKsync Protocol v27</figcaption></figure><h3 id="h-evm-emulation-vs-native-eravm-execution" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">EVM Emulation vs. Native EraVM Execution</h3><p>While the EVM Interpreter makes it easy to bring existing Ethereum contracts to ZKsync, EraVM-native bytecode remains the best choice for most projects due to its better performance and lower gas costs.</p><p>We recommend:</p><ul><li><p><strong>Use native EraVM bytecode</strong> whenever possible for optimal efficiency.</p></li><li><p><strong>Use the EVM Emulator</strong> only if you need features like <strong>exact</strong> <code>create2</code> address derivation or other EVM-specific behaviors.</p></li></ul><hr><h2 id="h-limitations-and-unsupported-features" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Limitations &amp; Unsupported Features</h2><p>While the EVM Interpreter significantly improves developer experience, there are still some limitations due to the underlying EraVM architecture:</p><ul><li><p><strong>Gas Behavior:</strong> EVM bytecode is translated at execution time, making transaction fees higher than running native EraVM bytecode.</p></li><li><p><strong>Debugging Limitations:</strong> Some EVM debugging tools and RPC methods are unavailable due to differences between EVM and EraVM execution.</p></li><li><p><strong>Opcodes and precompiles:</strong> <code>CALLCODE</code>, <code>SELFDESTRUCT</code>, <code>BLOBHASH</code>, <code>BLOBBASEFEE</code> and <code>modexp</code>, <code>blake2f</code>, <code>pointEvaluation</code> are <strong>not</strong> supported as they’re not implemented in EraVM yet.</p></li><li><p><strong>No Access Lists (EIP-2930):</strong> The interpreter does not support access lists for optimizing gas costs.</p></li><li><p><strong>Different Warm/Cold Storage Mechanics:</strong> Only contracts accessed within the EVM environment are considered warm.</p></li><li><p><code>delegatecall</code> Between EVM and EraVM Contracts is Not Supported.</p></li></ul><p>Learn more in the <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.zksync.io/zksync-protocol/evm-emulator/evm-differences">EVM Emulator documentation</a>.</p><hr><h2 id="h-whats-next-and-getting-started" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">What’s Next &amp; Getting Started</h2><p>The <strong>EVM Interpreter is live on the ZKsync Era Sepolia testnet</strong> with mainnet activation planned in the weeks ahead, pending governance approval. The feature is available across the Elastic Network, meaning other ZK chains running v27 can enable the interpreter at any time.</p><p>The next version of the proof system, Boojum2.0, will allow <strong>native</strong> EVM execution, significantly reducing the costs of EVM equivalence.</p><p>We encourage developers to test the EVM Interpreter and share their feedback on our <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/zkSync-Community-Hub/zksync-developers/discussions">developer forum</a>. Deploying an EVM contract on ZKsync Era is now <strong>as straightforward as deploying on Ethereum</strong> — no special compilers or modifications are required.</p><h2 id="h-resources" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Resources</h2><p><strong>EVM Bytecode Interpreter Docs</strong></p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.zksync.io/zksync-protocol/evm-emulator/overview">https://docs.zksync.io/zksync-protocol/evm-emulator/overview</a></p><ul><li><p><strong>[ZIP-9] V27 EVM Emulation Upgrade</strong></p></li></ul><div data-type="embedly" src="https://forum.zknation.io/t/zip-9-v27-evm-emulation-upgrade/626" data="{&quot;provider_url&quot;:&quot;https://forum.zknation.io&quot;,&quot;description&quot;:&quot;Proposal Type ZIP One Sentence Summary ZIP-9 proposes the V27 upgrade for ZKsync with two key features: (1) EVM emulation, and (2) Fflonk verifier. Proposal Author Matter Labs Proposal Sponsor Cyfrin Date Created TBC Version v1 Summary of Action Upgrade ZKsync to V27 Link to Contracts GitHub - matter-labs/era-contracts at release-v27 Abstract ZIP-9 proposes the V27 upgrade for ZKsync.&quot;,&quot;title&quot;:&quot;[ZIP-9] V27 EVM Emulation Upgrade&quot;,&quot;author_name&quot;:&quot;VladislavVolosnikov&quot;,&quot;thumbnail_width&quot;:400,&quot;url&quot;:&quot;https://forum.zknation.io/t/zip-9-v27-evm-emulation-upgrade/626&quot;,&quot;thumbnail_url&quot;:&quot;https://storage.googleapis.com/papyrus_images/35077b73085f5f6183854f1a99df27ecb605f5e07642b6af6635f6ee453eb8ec.png&quot;,&quot;author_url&quot;:&quot;https://forum.zknation.io/u/VladislavVolosnikov&quot;,&quot;version&quot;:&quot;1.0&quot;,&quot;provider_name&quot;:&quot;ZK Nation Forum&quot;,&quot;type&quot;:&quot;link&quot;,&quot;thumbnail_height&quot;:400,&quot;image&quot;:{&quot;img&quot;:{&quot;width&quot;:400,&quot;height&quot;:400,&quot;src&quot;:&quot;https://storage.googleapis.com/papyrus_images/35077b73085f5f6183854f1a99df27ecb605f5e07642b6af6635f6ee453eb8ec.png&quot;}}}" format="small"><link rel="preload" as="image" href="https://storage.googleapis.com/papyrus_images/35077b73085f5f6183854f1a99df27ecb605f5e07642b6af6635f6ee453eb8ec.png"/><div class="react-component embed my-5" data-drag-handle="true" data-node-view-wrapper="" style="white-space:normal"><a class="link-embed-link" href="https://forum.zknation.io/t/zip-9-v27-evm-emulation-upgrade/626" target="_blank" rel="noreferrer"><div class="link-embed"><div class="flex-1"><div><h2>[ZIP-9] V27 EVM Emulation Upgrade</h2><p>Proposal Type ZIP One Sentence Summary ZIP-9 proposes the V27 upgrade for ZKsync with two key features: (1) EVM emulation, and (2) Fflonk verifier. Proposal Author Matter Labs Proposal Sponsor Cyfrin Date Created TBC Version v1 Summary of Action Upgrade ZKsync to V27 Link to Contracts GitHub - matter-labs/era-contracts at release-v27 Abstract ZIP-9 proposes the V27 upgrade for ZKsync.</p></div><span><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link h-3 w-3 my-auto inline mr-1"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg>https://forum.zknation.io</span></div><img src="https://storage.googleapis.com/papyrus_images/35077b73085f5f6183854f1a99df27ecb605f5e07642b6af6635f6ee453eb8ec.png"/></div></a></div></div>]]></content:encoded>
            <author>zksync@newsletter.paragraph.com (ZKsync)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/6720a66dda28938aba981b9b60e2c47bd71c47fa3faabea67690c33cf91f3c41.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[ZKsync is Evolving, and the Community is at the Core]]></title>
            <link>https://paragraph.com/@zksync/zksync-is-evolving-and-the-community-is-at-the-core-3</link>
            <guid>uhk70SlIWUhjMgXU75HV</guid>
            <pubDate>Fri, 28 Feb 2025 21:30:15 GMT</pubDate>
            <description><![CDATA[The story of ZKsync has always been about scalability, decentralization, and building a better way forward for Web3. With the expansion of the Elastic Network, governance shifts, and a new era of interconnected ZK Chains, the community plays a greater role than ever. This evolution brings new opportunities for contributors to engage, shape discussions, and drive ecosystem growth. That’s where the ZKsync Community Program comes in: a structured six-month initiative designed to empower contribu...]]></description>
            <content:encoded><![CDATA[<p>The story of ZKsync has always been about scalability, decentralization, and building a better way forward for Web3.</p><p>With the expansion of the <strong>Elastic Network</strong>, governance shifts, and a new era of interconnected ZK Chains, the community plays a greater role than ever. This evolution brings new opportunities for contributors to engage, shape discussions, and drive ecosystem growth.</p><p>That’s where the <strong>ZKsync Community Program</strong> comes in: a structured six-month initiative designed to empower contributors, reward meaningful participation, and provide clear pathways for community members to play an active role in expanding the ecosystem.</p><p>With over <strong>5 million ZK tokens funded by ZKsync Foundation and allocated to Gitcoin for distribution over the next six months</strong>, the program ensures that active community contributors are recognized and rewarded monthly based on their engagement, impact, and participation. Eligibility criteria, including the roles and responsibilities of participants, will be outlined by Gitcoin as part of the program’s rollout.</p><h3 id="h-who-can-participate-and-how-are-rewards-distributed" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0"><strong>Who Can Participate and How Are Rewards Distributed?</strong></h3><p>The <strong>ZKsync Community Program</strong> is designed to recognize <strong>key contributors</strong> who actively support and grow the ecosystem. Eligibility is based on designated community roles within the program, which include:</p><p>🔹 <strong>Community Moderators</strong> – Maintaining and moderating a welcoming and informed environment across Discord and other platforms.</p><p>🔹 <strong>Captains</strong> – Leading discussions, mentoring members, and organizing key initiatives.</p><p>🔹 <strong>Mateys</strong> – Actively participating in campaigns, amplifying messages, and onboarding new users.</p><p>Contributions will be assessed monthly through a structured <strong>self-reporting process</strong>, where participants submit their activities via a dedicated form. These reports will be reviewed by Gitcoin — managing the program — in collaboration with Community Moderators and verified against engagement data from community platforms, including activity metrics, event participation, and interaction logs. This evaluation ensures that contributions meet the program’s criteria before rewards are distributed at the end of each month.</p><h3 id="h-how-participants-will-contribute" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0"><strong>How Participants Will Contribute</strong></h3><p>The program offers <strong>structured activities</strong> designed to strengthen engagement and ecosystem growth. Participants will be able to:</p><p>🔹 <strong>Engage in community discussions</strong> to help onboard new users and maintain an active, positive environment.</p><p>🔹 <strong>Take part in ecosystem campaigns and weekly activities</strong> to play games, participate to new launches, help spread awareness and support the Elastic Network, ZK Chains, and dApps.</p><p>🔹 <strong>Join Squads</strong>, dedicated working groups focused on areas like Governance, Security, Onboarding, and Event Coordination.</p><p>🔹 <strong>Host and participate in community events and AMAs</strong> to drive meaningful engagement.</p><h3 id="h-who-manages-the-program" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0"><strong>Who Manages the Program?</strong></h3><p>The <strong>ZKsync Community Program</strong> will be managed collaboratively to ensure fairness, transparency, and efficiency throughout its six-month duration:</p><p>🔹 <strong>Gitcoin</strong> – Responsible for program ideation, execution, rewards distribution, and participant evaluations, ensuring a structured and transparent process.</p><p>🔹 <strong>Discord Admins</strong> – Supporting community engagement by facilitating discussions, assisting contributors, and ensuring smooth day-to-day operations.</p><p>🔹 <strong>Community Moderators</strong> – Helping onboard new participants, maintaining a positive and constructive environment, and guiding contributors through the program’s structure.</p><p>This management structure ensures that the program remains well-organized, scalable, and effectively supports all participants as they take an active role in the ZKsync ecosystem.</p><h3 id="h-what-makes-the-program-unique" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0"><strong>What Makes The Program Unique?</strong></h3><p>A decentralized ecosystem grows <strong>with</strong> its community, shaping the future through participation and collaboration.</p><p>🔹 <strong>Opportunities to Grow</strong> – Through structured activities, advocacy, and ecosystem engagement, the community actively contributes to expansion.</p><p>🔹 <strong>Community Ownership</strong> – A step toward a more aligned community model where participation actively shapes the ecosystem.</p><p>🔹 <strong>Transparency and Fairness</strong> – Managed by <strong>Gitcoin</strong>, ensuring an open and fair process that includes community contributions from early 2024. Eligibility criteria and selection processes will be communicated by Gitcoin.</p><p>🔹 <strong>Expanding Local Communities</strong> – The program supports localized communities, known as <strong>Elastic Teams</strong>, starting with <strong>ZK Amigos</strong> in Argentina. These teams focus on <strong>regional engagement, education, and ecosystem growth</strong>, creating stronger connections between local users and the broader ZKsync network.</p><h3 id="h-what-does-that-mean-for-you" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0"><strong>What does that mean for you?</strong></h3><p>🔹 <strong>Be part of the growth</strong> – The Elastic Network is introducing <strong>new ZK Chains and dApps every day.</strong> This program gives the community opportunities to contribute to its development.</p><p>🔹 <strong>New ways to participate and be rewarded</strong> – Whether by joining ecosystem campaigns, supporting new users, or helping shape discussions, the program provides clear roles and incentives.</p><p>🔹 <strong>A future-proof community</strong> – This program strengthens the role of the community in the <strong>Elastic Network’s</strong> ongoing expansion.</p><p>🔹 <strong>A path to governance</strong> – Over the next six months, the community will have direct opportunities to <strong>influence the future of the program</strong> through Squads, structured governance discussions, and surveys. Community input will shape improvements to fairness, reward structures, and long-term participation models, ensuring the program evolves based on real needs.</p><h3 id="h-what-does-the-onboarding-process-look-like" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0"><strong>What Does the Onboarding Process Look Like?</strong></h3><p>The onboarding process, managed by Gitcoin, will assess the eligibility of participants before they officially join the program. Once onboarded, participants will:</p><p>🔹 Gain access to structured activities, Squads, and engagement opportunities.</p><p>🔹 Start contributing through discussions, ecosystem campaigns, and community initiatives.</p><p>🔹 Receive guidance on how to track and report their contributions to qualify for rewards.</p><p>Gitcoin will provide further details on onboarding and reporting guidelines, ensuring participants have everything needed to engage effectively from day one.</p><h3 id="h-whats-next" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0"><strong>What’s Next?</strong></h3><ul><li><p><strong>March 5</strong> – The Community Program details will be communicated by Gitcoin, and available on the <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://zknation.gitbook.io/zksync-community-hub"><strong>ZKsync Community Hub</strong></a>. A <strong>dedicated Q&amp;A channel</strong> will also open on <strong>Discord</strong>, providing a space for the community to ask questions and get insights.</p></li><li><p><strong>March 7</strong> – A <strong>Discord AMA</strong> at <strong>4PM UTC</strong> will offer a deep dive into the program, its roles, and the rewards structure. The <strong>onboarding process</strong> will officially begin, inviting eligible participants to start their journey in the program.</p></li></ul><p>This is just the beginning: <strong>how far the program grows depends on the community.</strong> Get ready to participate, contribute, and help shape the future of ZKsync! 🚀</p>]]></content:encoded>
            <author>zksync@newsletter.paragraph.com (ZKsync)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/50d04ea375f7e0ded82b61e412fd0cd130c6d275799f1372417f483912015416.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[WonderFi Labs Launches ZK Chain and Wallet on ZKsync]]></title>
            <link>https://paragraph.com/@zksync/wonderfi-labs-launches-zk-chain-and-wallet-on-zksync</link>
            <guid>pVTcyKkbMIyTLi26piyf</guid>
            <pubDate>Thu, 20 Feb 2025 13:28:51 GMT</pubDate>
            <description><![CDATA[WonderFi Labs Launches ZK Chain and Wallet on ZKsync, Pioneering Mainstream Onchain Finance Adoption WonderFi provides access to DeFi through ZKsync’s Ethereum-level security, with scalability and cost-efficiency WonderFi, a global leader in centralized and decentralized financial services and products, has launched a Layer 2 (“L2”) blockchain, powered by ZKsync, and a digital wallet on ZKsync’s Elastic Network, through its innovation arm WonderFi Labs. The new ZK Chain and wallet provide use...]]></description>
            <content:encoded><![CDATA[<p><strong>WonderFi Labs Launches ZK Chain and Wallet on ZKsync, Pioneering Mainstream Onchain Finance Adoption</strong></p><p><em>WonderFi provides access to DeFi through ZKsync’s Ethereum-level security, with scalability and cost-efficiency</em></p><p>WonderFi, a global leader in centralized and decentralized financial services and products, has launched a Layer 2 (“<strong>L2</strong>”) blockchain, powered by ZKsync, and a digital wallet on ZKsync’s Elastic Network, through its innovation arm WonderFi Labs. The new ZK Chain and wallet provide users with premier, innovative services and applications and connect them to decentralized finance (“<strong>DeFi</strong>”) through industrial-grade security and scalability at a competitive cost.</p><p>The decision to launch on the Elastic Network strategically positions WonderFi as a first-mover using ZKsync technology to give retail users seamless access to decentralized finance. Importantly, this integration unlocks a new universe of financial applications and services for WonderFi users, including lending, borrowing, staking, and decentralized exchange trading, subject to geo-restrictions. Acting as a gateway to DeFi and leveraging access to an ever-expanding network of applications and services within ZKsync’s Elastic Network, WonderFi’s ZK Chain and wallet will also be an innovation hub for crypto developers, allowing them to build and ship next-generation decentralized applications. This network and wallet will be available globally, but access may be restricted and geo-blocked based on the jurisdiction of a user.</p><p>&quot;WonderFi is committed to continuously innovating our offerings to provide our users with a best-in-class experience. Launching on ZKsync marks the next phase of increasing the accessibility and scalability of WonderFi’s products – positioning us at the forefront of tech innovation in the crypto space. By integrating ZKsync technology, we gain scalability while ensuring unparalleled ease of use for new entrants to the DeFi space,” <strong>said Dean Skurka</strong>, <strong>President and CEO of WonderFi.</strong></p><p>“WonderFi’s deployment into the Elastic Network showcases the capabilities of ZKsync’s technology to meet the needs of retail users while creating scalable blockchain solutions”, <strong>said Alex Gluchowski</strong>, <strong>Co-Inventor of ZKsync</strong>. ZKsync’s advanced ZK technology will empower WonderFi to offer its users unparalleled scalability, security, and low transaction fees. This integration drives a more accessible and inclusive onchain finance ecosystem, creating a seamless and accessible web3 experience that accelerates mass adoption, aligning with ZKsync’s mission to build web3 without compromise.”</p><p>WonderFi’s L2 joins ZKsync’s Elastic Network of ZK Chains that are designed to be natively interoperable and leverage ZK Stack to handle a significantly higher volume of transactions, thus reducing congestion and lowering fees. The launch of WonderFi’s L2 in testnet demonstrates how ZKsync’s scalable infrastructure can unlock mainstream adoption for retail-focused financial platforms. Furthermore, WonderFi’s freemium, gasless wallet - powered by ZKsync’s native account abstraction - will offer seamless access to the world of DeFi and NFTs, eliminating barriers to entry for new users.</p><p><strong>Key Features</strong></p><p>Through the launch of these products in testnet, WonderFi:</p><ul><li><p>Eliminates the &quot;gas token paradox&quot; where users need tokens just to start using the network</p></li><li><p>Creates a sustainable economic model through power user fees rather than relying on external subsidies</p></li><li><p>Removes complex fee calculations and gas management for casual users</p></li><li><p>Maintains network efficiency through intelligent transaction prioritization</p></li><li><p>Enables true decentralization without compromising user experience</p></li><li><p>Leverages ZKsync to ensure the products can scale to meet any level of future demand</p></li></ul><p>Now that the wallet and testnet for the L2 are live, users can:</p><ul><li><p>Start using DeFi applications immediately without any upfront costs</p></li><li><p>Execute basic transactions and dApp interactions completely free</p></li><li><p>Access premium features like priority processing when needed</p></li><li><p>Seamlessly transition between free and premium services based on usage patterns</p></li><li><p>Engage with DeFi protocols without technical barriers</p></li></ul><p>More information on both products can be found at labs.wonder.fi.</p><p><strong>About WonderFi</strong></p><p>WonderFi is a global leader in centralized and decentralized financial services and products. With over $2.1 billion in client assets under custody, WonderFi&apos;s regulated trading platforms are well-positioned to service crypto participants on a global scale with trading, payments and decentralized products, including purpose-built blockchains and non-custodial wallet applications. Designed to provide investors with diversified investment exposure across the global digital asset ecosystem, the Company has a proven track record of launching new products and obtaining registrations. It is also the owner of market-leading brands, including Bitbuy, Coinsquare, SmartPay, Bitcoin.ca and Tetra Trust. As the world continues to move on- chain, WonderFi is strategically placed to capture both market and wallet share through ongoing innovation within the digital asset space.</p><p>For more information, visit <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="http://www.wonder.fi">www.wonder.fi</a></p><p><strong>About ZKsync</strong></p><p>ZKsync is the pioneering zero-knowledge technology powering the next generation of builders with improved scale. Secured by math and designed for native interoperability, ZKsync enables the Elastic Network, an ever-expanding ecosystem of customizable chains. Deeply rooted in its mission to advance personal freedom for all, the ZKsync technology makes digital self-ownership widely available.</p><p>To learn more about ZKsync, visit <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="http://www.zksync.io">http://www.zksync.io</a></p>]]></content:encoded>
            <author>zksync@newsletter.paragraph.com (ZKsync)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/f399f8f2c37221ad6d0dd3d0c3e13191ade5ad26d160974fb65b08becc811c9f.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[DevEx 2025. You asked, we heard]]></title>
            <link>https://paragraph.com/@zksync/devex-2025-you-asked-we-heard</link>
            <guid>A4KvvpUUNF3vR822jsz3</guid>
            <pubDate>Thu, 13 Feb 2025 10:57:33 GMT</pubDate>
            <description><![CDATA[Recently we published a DevEx 2024 recap, but we’ve got more to share. The whole 2025 is ahead of us, so let’s talk about it. We’re hyped, and we have a lot of plans. But before we start discussing what is going to happen, it’s the right time to talk about why.ReflectionWe heard you: the DevEx on ZKsync wasn’t great. So, if we will just continue doing what we were doing, the situation is unlikely to change. We took our time to analyze what was wrong in the first place, and discovered three ma...]]></description>
            <content:encoded><![CDATA[<p>Recently we published a <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://zksync.mirror.xyz/tzdwKa7VrXPX2ap6-Xuj04ULo5lZaXn9G6UE3seA6Uo">DevEx 2024 recap</a>, but we’ve got more to share. The whole 2025 is ahead of us, so let’s talk about it. We’re hyped, and we have <em>a lot</em> of plans.</p><p>But before we start discussing <em>what</em> is going to happen, it’s the right time to talk about <em>why</em>.</p><h2 id="h-reflection" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Reflection</h2><p>We heard you: the DevEx on ZKsync wasn’t great. So, if we will just continue doing what we were doing, the situation is unlikely to change. We took our time to analyze what was wrong in the first place, and discovered three main issues:</p><p><strong>We focused on quantity, not quality.</strong></p><p>We rushed to get as much stuff as we could in the shortest time possible. <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.zksync.io/zksync-era/sdk">5+ SDKs</a>, <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.zksync.io/zksync-era/tooling/hardhat">hardhat support</a>, <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://portal.zksync.io/">portal</a>, <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://explorer.zksync.io/">explorer</a>, <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.zksync.io/zksync-era/tooling/zksync-cli">zksync-cli</a>, <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.zksync.io/zksync-era/ecosystem">tons of integrations</a>, <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.zksync.io/zksync-era/tooling/local-setup/dockerized-l1-l2-nodes">dockerized setup</a>, <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.zksync.io/zksync-era/tooling/local-setup/anvil-zksync-node">in-memory-node</a>, <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.zksync.io/zksync-era/tooling/foundry/overview">foundry-zksync</a>, and even one-time projects like <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://zkquest.zksync.io/">ZK Quest</a>.</p><p>That’s a lot for a relatively small team. That was justified, to a degree: without this infrastructure, ZKsync wouldn’t be as accessible. But the problem with this workflow is that once something reached a “proof of concept” state, we were moving on to the next thing.</p><p>And the result is predictable: death by thousand cuts. Everything <em>seems</em> to be working fine, but little bugs and inconveniences here and there ruin the experience all the time.</p><p><strong>We haven&apos;t listened enough to feedback.</strong></p><p>Our development was often a black box. We didn’t know about the issues until they were reported, we often didn’t provide updates when bugs were fixed or new features were shipped. We didn’t respond well enough to GitHub issues or GitHub discussions.</p><p>This certainly didn’t provide a good public image.</p><p><strong>We had no clear plan.</strong></p><p>When we had no ecosystem, the plan was clear: to get the ecosystem.</p><p>But after a while, you have most of the things you want, and the question arises: what next? How do you evolve the tooling you have? What are features people need? What bugs need to be prioritized?</p><p>We had no answer. Partially because of that, we often have been choosing to start working on something else.</p><p>These things may seem obvious, but when you’re fully occupied building things non-stop, it becomes pretty hard to realize. So, the conclusion we came to is: we need a <em>new course</em>.</p><h2 id="h-new-course" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">New course</h2><p>The basic principles of the new course we take are the inverse of the problems we discovered:</p><ul><li><p>Focus on quality</p></li><li><p>Be transparent</p></li><li><p>Stick to plan</p></li></ul><p>You can see some movement in this direction already.</p><p>Developer experience has been recognized as a top priority in the <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://zksync.mirror.xyz/QG2Xr4lQdJTbyjeKftPVc6-pj2t9-H9WEGnvCcnusck">protocol roadmap</a>.</p><p>We now have live <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/zkSync-Community-Hub/zksync-developers/discussions">developer support</a> that is actively monitored by our engineers, so every inquiry gets a response.</p><p>DevEx work was moved from a private issue tracker to GitHub issues, and moreover: <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/orgs/matter-labs/projects/12/views/1">our dashboard is now public</a>, so you can see how issues are being prioritized and processed.</p><p>We’re working on actively reacting to the issues in all of our public repositories (although it takes time to set up as a process, so for now using <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/zkSync-Community-Hub/zksync-developers/discussions">developer support</a> is more reliable — bear with us!).</p><p>And we’re only getting started!</p><p>Now, what should you expect in 2025?</p><h2 id="h-elastic-first" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Elastic-first</h2><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/a7ccc5a81cd8d91e3ba9b318f60eb14acff2a1afd266d4024ed8fffac38a4fdb.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>ZKsync Era is the first chain in the Elastic Network family. It still plays <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://x.com/gluk64/status/1884360327829000593">an important role</a> in being a hub for governance and a center for DeFi, but now it’s one of the <em>many</em> chains. With <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://x.com/AbstractChain/status/1883939915169423777">Abstract</a> and <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://x.com/sophon/status/1880274620617474162">Sophon</a> launched, and many more chains coming, ZKsync DevEx is no longer about Era. Or rather, not <em>only</em> about Era.</p><p>We are going to:</p><ul><li><p>Carefully revisit the documentation to make sure that we focus on the entire ecosystem. You can expect more coverage for custom chains, e.g. Validiums and chains with custom base tokens.</p></li><li><p>Adapt our tooling accordingly. Whatever works with Era, must work exactly the same way with any ZK chain in the Elastic Network, regardless of its configuration.</p></li><li><p>Change how we prioritize work. So far it was natural: we were running Era, so we prioritized feature requests and issues for Era. Now, we need to re-learn how we operate. Developer friction on any chain, no matter who runs it, harms the Elastic Network as a whole.</p></li></ul><h2 id="h-full-interop-support" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Full interop support</h2><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/bb8f3c8b8b2bbef0bf83519f500d34a962adecf0b47f317a23d8d96f4d168edc.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>But it’s not only about having N chains, right? All of these chains will be able to <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://x.com/kayprasla/status/1870151666676445659">interact with each other natively</a>.</p><p>The interoperability is much more than <em>just</em> protocol capabilities and <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://matter-labs.github.io/zksync-era/core/latest/specs/interop/overview.html">specifications</a>. The tooling must provide the required level of convenience.</p><p>Sending a cross-chain message should be a simple method in the SDK. You should be able to replay an interop transaction locally, just like you can replay any other transaction with <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/matter-labs/anvil-zksync">anvil-zksync</a>. When you see a cross-chain transaction in the explorer, you should be able to reach the destination counterpart in one click.</p><p>Overall, developing cross-chain applications must be as easy as building common dApps on a single chain.</p><h2 id="h-stable-releases" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Stable releases</h2><p>No more fear of having to update your dependency. No more wondering what’s even inside of the update.</p><p>We’re actively working on raising the bar for our releases. You can expect timely announcements, changelogs with meaningful information, and no accidental breaking changes.</p><p>Our goal for this year is to develop release calendars that would be:</p><ul><li><p>Externally observable (you will know which features will go into the next release)</p></li><li><p>Predictable (you will know when the release should happen)</p></li><li><p>Documented (if something the released, the documentation <em>must</em> be updated).</p></li></ul><h2 id="h-consistent-communication" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Consistent communication</h2><p>We are always working on many exciting features in parallel, but we don’t always promote them as much as they deserve. We added TEE verification to our sequencer as an additional security measure in summer 2024, but it took us half a year to actually write a <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://zksync.mirror.xyz/RlVZHqwt8lO7vYLN-r3156HrEjjBIFd02zYk3jZhleQ">blog post</a> about it.</p><p>Who knows how much else cool stuff is already available on ZKsync or will be available shortly?</p><p>Well, soon you will!</p><p>We are now working with all the internal teams to make sure that any feature gets appropriate coverage, from early announcements through demos and showcases to the release.</p><h2 id="h-smart-sign-on" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Smart Sign-On</h2><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/7f85180721c5744fc71207bc8aa1be38dcefa0b49c104691da5e8c32566a94f5.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>Have you heard about ZKsync Smart Sign-On (SSO)? Hope you did, because that’s a <em>very</em> sleek way to interact with Web3, powered by passkeys and sessions. If you didn’t, definitely <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://nft.zksync.dev/">try it out</a> and <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.zksync.io/zksync-era/unique-features/zksync-sso">check the docs</a>! Or at the very least, <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://x.com/zksync/status/1863650866395283833">check out this video</a> 👀</p><p>ZKsync SSO was rolled out to the ZKsync Era testnet in December, and now our goal is to make it available on many chains in the Elastic Network.</p><p>Besides reaching the mainnet, here’s a sneak peek of what you can expect:</p><ul><li><p>Advanced account recovery options (multiple passkeys, guardian accounts, social recovery)</p></li><li><p>Interop support <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://x.com/kayprasla/status/1870154363311993043">out of the box</a></p></li><li><p>Integrated fiat-to-crypto onramps</p></li></ul><p>Note that SSO on its own is not a wallet, it’s a <em>smart account</em> (with a sprinkle of magic) and it’s <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/matter-labs/zksync-sso">open source</a>. So if you’re interested in providing great UX for your users on ZKsync, it’s certainly worth checking out.</p><h2 id="h-foundry-zksync-10" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">foundry-zksync 1.0</h2><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/foundry-rs/foundry">Foundry</a> is a fantastic toolkit for Ethereum application development. It quickly becomes a central part of the modern Ethereum developer stack. It <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://x.com/gakonst/status/1885051069845430525">will soon reach a 1.0 release</a>, becoming a mature and stable product.</p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/matter-labs/foundry-zksync">Foundry-zksync</a> is a much younger product, and it only recently got out of the alpha stage, but we put a lot of effort into making sure that ZKsync developers get all the power of the Foundry stack, and more.</p><p>And in 2025, we’re going to reach a 1.0 release as well!</p><p>Main criteria here:</p><ul><li><p>foundry-zksync can be installed <em>alongside</em> “vanilla” foundry and you can use both at the same time</p></li><li><p>Feature parity with upstream Foundry</p></li><li><p>Custom features specific to ZKsync, such as interop support.</p></li></ul><h2 id="h-who-are-we" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Who are “we”?</h2><p>We use the word “we” a lot here. But who’s hiding behind this work?</p><p>A lot of people, actually.</p><p>First and foremost, two teams within Matter Labs: DevEx and DevRel. The former is responsible for working on the tooling, the latter works hard to get you great documentation, up-to-date tutorials, and cool events.</p><p>Then, it’s two amazing teams who dedicate a lot of their time to the tooling:</p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.txfusion.io/">TxFusion</a>, who works on the SDKs, hardhat, explorer, and portal.</p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://moonsonglabs.com/">MoonSongLabs</a>, who works on foundry-zksync and <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/matter-labs/zksync-era/tree/main/zkstack_cli">zkstack CLI</a>.</p><p>And now, the exciting part: the developers of many Elastic Chains! We already receive contributions from external teams that both fix issues and bring new cool features, and we hope that the number of such contributions will grow significantly during 2025.</p><p>And finally, maybe, you?</p><p>We have prepared a coordination channel for all the people who want to build ZKsync to make it easier to build <em>on</em> ZKsync. If you want to be on the frontier of ZKsync development, <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://t.me/+2yHR2oGDUtwwNTBk">join us</a>!</p><h3 id="h-and-beyond" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">… and beyond</h3><p>You may notice that there are very few “concrete” promises in this roadmap. That’s intentional.</p><p>As we stated in the beginning, our main focus is to provide a polished, predictable, and hopefully <em>magic</em> experience for all the Elastic Chains developers. That doesn’t mean shipping X new fancy things, that means changing how we work. That’s going to be tough, but we’re up to the challenge.</p><div data-type="embedly" src="https://t.me/+2yHR2oGDUtwwNTBk" data="{&quot;provider_url&quot;:&quot;https://t.me&quot;,&quot;description&quot;:&quot;Home for ZKsync builders. https://x.com/zkSyncDevs&quot;,&quot;title&quot;:&quot;ZKsync Builders Hub&quot;,&quot;url&quot;:&quot;https://t.me/%202yHR2oGDUtwwNTBk&quot;,&quot;thumbnail_width&quot;:320,&quot;thumbnail_url&quot;:&quot;https://storage.googleapis.com/papyrus_images/2ae4f8e0bb11d9f5f8d711834ae229805e9de402b2571aaab373f25901c3c53c.jpg&quot;,&quot;version&quot;:&quot;1.0&quot;,&quot;provider_name&quot;:&quot;Telegram&quot;,&quot;type&quot;:&quot;link&quot;,&quot;thumbnail_height&quot;:320,&quot;image&quot;:{&quot;img&quot;:{&quot;width&quot;:320,&quot;height&quot;:320,&quot;src&quot;:&quot;https://storage.googleapis.com/papyrus_images/2ae4f8e0bb11d9f5f8d711834ae229805e9de402b2571aaab373f25901c3c53c.jpg&quot;}}}" format="small"><link rel="preload" as="image" href="https://storage.googleapis.com/papyrus_images/2ae4f8e0bb11d9f5f8d711834ae229805e9de402b2571aaab373f25901c3c53c.jpg"/><div class="react-component embed my-5" data-drag-handle="true" data-node-view-wrapper="" style="white-space:normal"><a class="link-embed-link" href="https://t.me/+2yHR2oGDUtwwNTBk" target="_blank" rel="noreferrer"><div class="link-embed"><div class="flex-1"><div><h2>ZKsync Builders Hub</h2><p>Home for ZKsync builders. https://x.com/zkSyncDevs</p></div><span><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-link h-3 w-3 my-auto inline mr-1"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg>https://t.me</span></div><img src="https://storage.googleapis.com/papyrus_images/2ae4f8e0bb11d9f5f8d711834ae229805e9de402b2571aaab373f25901c3c53c.jpg"/></div></a></div></div>]]></content:encoded>
            <author>zksync@newsletter.paragraph.com (ZKsync)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/9877016f04650135661fb1b8f5254b070369c4cd4315aacb5ed18cfac71c95ce.jpg" length="0" type="image/jpg"/>
        </item>
        <item>
            <title><![CDATA[Union Chain to Launch a ZK Chain]]></title>
            <link>https://paragraph.com/@zksync/union-chain-to-launch-a-zk-chain</link>
            <guid>PZN4F70BVmALZ7Vwim9k</guid>
            <pubDate>Thu, 13 Feb 2025 03:01:22 GMT</pubDate>
            <description><![CDATA[Singapore – February 13, 2025 – Union Fintech, a Fintech company headquartered in Singapore, today announced the launch of Union Chain, a blockchain platform powered by ZKsync technology and supported by leading regulated exchanges and licensed Real World Assets (RWA) Tokenization platforms in Southeast Asia including Coinhako, Indodax, Coins.ph, Coins.co.th, InvestaX, and IXSwap. Union Chain is a ZK Chain designed to bridge the worlds of Crypto and Traditional Finance (TradFi) by uniting top...]]></description>
            <content:encoded><![CDATA[<p><strong>Singapore – February 13, 2025</strong> – Union Fintech, a Fintech company headquartered in Singapore, today announced the launch of Union Chain, a blockchain platform powered by ZKsync technology and supported by leading regulated exchanges and licensed Real World Assets (RWA) Tokenization platforms in Southeast Asia including Coinhako, Indodax, Coins.ph, Coins.co.th, InvestaX, and IXSwap.</p><p>Union Chain is a ZK Chain designed to bridge the worlds of Crypto and Traditional Finance (TradFi) by uniting top centralized crypto exchanges (CEXs) and licensed real-world asset tokenization leaders with top Blockchain technology to build, issue, distribute, and transact on one chain. This opens up new markets and use cases for digital assets and tokenized financial products to cater to crypto natives and the next billion crypto users.</p><p>Union Chain will be led by Wei Zhou, Chairman of Union Chain (CEO of Coins.ph and former CFO of Binance), and Junde Yu as CEO, (formerly VP at Cobo VP, and MD/GM at Data.ai).</p><p><strong>Union Chain: Bridging TradFi and Crypto</strong></p><p>Union Chain was created to bridge TradFi and Crypto, solving fragmentation, regulatory hurdles, and interoperability issues. Leveraging regional licenses, on/off-ramps, local stablecoins, and the reach of exchanges, Union offers toolkits for licensing, fiat integration, and distribution, enabling seamless interaction between the two worlds. This opens up markets and use cases between TradFi and Crypto.</p><p>Key verticals of Union Chain’s testnet would include:</p><ul><li><p><strong>RWA</strong>: By leveraging the licenses and expertise of InvestaX (CMS, RMO) and the regulated CEXs, Union goes beyond the typical tokenization platform to provide a full stack of RWA solutions with services across structuring, issuance, tokenization, distribution, and fiat on/off ramps to ensure a seamless experience for TradFi companies bridging into Crypto.</p></li><li><p><strong>Payments/Remittance</strong>: Providing access to the on/off-ramps and local stablecoins of Indodax (Indonesia), Coins PH (Philippines), Coinhako (Singapore), and Coins TH (Thailand), Union Chain offers faster, cost-effective remittance solutions tailored for Southeast Asia.</p></li><li><p><strong>Regional enterprise adoption</strong>: Equipped with regional licenses, expertise, user access, and support teams, Union is best positioned to provide regulated blockchain solutions with locally licensed and compliant frameworks to scale adoption for the SEA market and, subsequently, the broader Asian market.</p></li><li><p><strong>Broad Market Access</strong>:  Developers on Union gain access to &gt;20M KYC’ed users in a total addressable market of 600M users. Union is also planning to work with additional CEXs in the future.</p></li></ul><p><strong>ZKsync Technology &amp; The Elastic Network, A New Era For Blockchain Utility</strong></p><p>This strategic initiative represents a significant milestone in the evolution of blockchain technology. By integrating <strong>Union Chain’s regulated infrastructure</strong> with <strong>ZKsync’s scalability and security</strong>, this initiative is poised to transform the landscapes of both web3 and TradFi, delivering unmatched compliance, reach, and technological sophistication.</p><p>Leading regulated crypto exchanges in Southeast Asia choosing to leverage ZKsync technology further demonstrates that the Elastic Network is the key ecosystem for entities looking to tokenize assets. The ZK Stack infrastructure enables financial institutions to tokenize and issue compliant RWAs through the Union Chain. Similarly, by incorporating top regulated exchanges and issuers onto the chain,  Union Chain will facilitate the flow of crypto liquidity and yield into TradFi through enhanced distribution, packaging, and fiat capabilities, giving institutions access to lower transaction costs, more sources of liquidity, and higher yields through trusted on/off-ramps.</p><p><strong>Wei, Chairman of Union Chain and CEO of Coins.PH, stated:</strong><em>&quot;We are excited to work with ZKsync’s cutting-edge ZK technology and the top-regulated exchanges in Asia to bring crypto liquidity and innovation to the world, setting new standards for compliance and user safety.</em></p><p><strong>Alex Gluchowski, Co-Inventor of ZKsync, commented,</strong> <em>“The integration of ZKsync with Union Chain marks a pivotal moment in the evolution of blockchain technology. Combining ZKsync’s scalability and security with Union Chain’s regulated infrastructure is another large step in bridging the gap between crypto and traditional finance while also shaping the future of global finance. This initiative is a testament to the potential of blockchain to drive innovation, unlock new opportunities, and serve millions of users worldwide. ZKsync has established itself as one of the premier infrastructures for those looking to tokenize assets, and the launch of Union Chain is a further testament to that fact.”</em></p><p><strong>Julian, CEO of InvestaX &amp; IX Swap, stated:</strong><em>&quot;Union Chain is delivering what no other protocol has achieved - an institutional-grade RWA Layer 2 on Ethereum, seamlessly connecting millions of crypto users with regulated financial infrastructure. This ecosystem enables fiat-to-stablecoin conversion and direct investment into RWA tokens across six regulated platforms while simultaneously bridging crypto liquidity and yield into TradFi markets. By providing RWAs to crypto exchange users and unlocking new capital flows for traditional finance, Union Chain establishes the full lifecycle for RWA issuance, investment, and trading. With compliance at its core, every partner involved is a licensed entity, ensuring trust and accessibility for both institutional and retail investors.&quot;</em></p><p><strong>William, CTO of Indodax, stated:</strong><em>&quot;“Union Chain is a major step forward for Indonesia and Southeast Asia’s digital economy. As part of the founding team, we see a huge opportunity to leverage blockchain technology, DeFi, and tokenization to solve real financial challenges in emerging markets. By enabling secure and transparent RWA-based lending and funding solutions, we are making SME financing more accessible, helping businesses grow and thrive. At the same time, we are revolutionizing remittance services, ensuring faster, more cost-effective, and seamless cross-border transactions. This initiative bridges the gap between traditional finance and digital assets, creating new financial opportunities for millions across Indonesia and Southeast Asia.”</em></p><p><strong>About Union Chain</strong></p><p>Union Chain is a groundbreaking Layer 2 blockchain that bridges the worlds of crypto and traditional finance (Tradfi) by uniting top-regulated companies with top Blockchain companies to build, issue, distribute, and transact on one chain. This opens up new markets and use cases for digital assets and tokenized financial products to cater to crypto natives and the next billion crypto users.</p><p>For more information or media inquiries, please contact: <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="mailto:press@unionchain.io">press@unionchain.io</a></p><p><strong>About ZKsync</strong></p><p>ZKsync is the pioneering zero-knowledge technology powering the next generation of builders with unlimited scale. Secured by mathematics and designed for native interoperability, ZKsync enables an elastic, ever-expanding network of customizable chains. Deeply rooted in its mission to promote personal freedom for all, ZKsync technology puts digital property within everyone&apos;s reach.</p><p>For more information about ZKsync, visit <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://enterprise.zksync.io/">http://enterprise.zksync.io</a>.</p>]]></content:encoded>
            <author>zksync@newsletter.paragraph.com (ZKsync)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/e3bd50c5d9a624d804a83559e58ddd37df42e1dcb30bb0c5ea1a26d74a8db3c3.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[UBS Trials ZKsync Validium for tokenized Gold ]]></title>
            <link>https://paragraph.com/@zksync/ubs-trials-zksync-validium-for-tokenized-gold</link>
            <guid>9zAbcmpktiTmMvgsQcQN</guid>
            <pubDate>Fri, 31 Jan 2025 14:05:42 GMT</pubDate>
            <description><![CDATA[A strategic step toward modernizing digital gold investments with blockchain technologyOverviewUBS recently conducted a technical proof-of-concept (PoC) for tokenized gold, testing ZKsync Validium, a Layer 2 (L2) blockchain solution designed to scale Ethereum while maintaining privacy. Financial service providers leveraging Ethereum must adopt strategies to maximize the network’s utility. The goal of the technical PoC was to address challenges in scalability, privacy, and interoperability as ...]]></description>
            <content:encoded><![CDATA[<blockquote><p><em>A strategic step toward modernizing digital gold investments with blockchain technology</em></p></blockquote><h1 id="h-overview" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0"><strong>Overview</strong></h1><p>UBS recently conducted a technical proof-of-concept (PoC) for tokenized gold, testing ZKsync Validium, a Layer 2 (L2) blockchain solution designed to scale Ethereum while maintaining privacy. Financial service providers leveraging Ethereum must adopt strategies to maximize the network’s utility.</p><p>The goal of the technical PoC was to address challenges in scalability, privacy, and interoperability as UBS experimented to expand UBS Gold into global markets, in a test environment. Following a thorough evaluation of blockchain options, ZKsync Validium was selected for its ability to meet the specific requirements of a hypothetical tokenized gold network. This PoC reflects UBS’s continued efforts to explore how blockchain can enhance its financial offerings.</p><h1 id="h-selecting-zksync-validium" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0"><strong>Selecting ZKsync Validium</strong></h1><p>To address these challenges, UBS evaluated multiple blockchain technologies and identified ZKsync Validium as a promising choice. ZKsync Validium addresses three critical needs:</p><ul><li><p><strong>Enhanced scalability:</strong> High transaction throughput at lower costs by storing data off-chain</p></li><li><p><strong>Privacy</strong>: Transaction data is stored off-chain, ensuring confidentiality for users</p></li><li><p><strong>Interoperability:</strong> Seamlessly connects to Ethereum, ‘’<em>the foundational layer for Decentralized Finance (DeFi)’’ (-UBS)</em>  enabling cross-network asset transfers</p></li></ul><h1 id="h-the-poc-objectives-and-results" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0"><strong>The PoC: Objectives and Results</strong></h1><p>The PoC simulated a tokenized gold Network on ZKsync Validium, testing the feasibility of meeting all above mentioned requirements, while assessing cost implications. To achieve this, smart contracts were deployed on a testnet to simulate a gold network. These contracts carried out key functionalities, including: gold token issuance, transaction processing and reconciliation.</p><p><strong>Key Objectives:</strong></p><ul><li><p><strong>Technical feasibility:</strong> evaluate operational requirements and implementation options for scalability and privacy</p></li><li><p><strong>Business viability:</strong> Analyze cost implications under various transaction volume scenarios</p></li></ul><h1 id="h-results" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0"><strong>Results</strong></h1><p>The PoC successfully demonstrated UBS’s ability to meet its privacy and interoperability objectives while addressing scalability requirements to a significant extent. By leveraging Validium mode, UBS ensured user privacy, allowing participants to view only their activity while enabling verifiability through Ethereum’s L1 bridge smart contract. Interoperability was also validated in the test as stablecoins bridged from Ethereum were successfully utilized to purchase gold tokens, and dummy tokens were employed to simplify reconciliation processes for back-office operations. While ZKsync’s Validium supported high throughput, achieving optimal cost efficiency would require thousands of transactions per hour, highlighting opportunities for further scalability optimization.</p><h1 id="h-future-opportunities-for-ubs" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0"><strong>Future opportunities for UBS</strong></h1><p>Building on the success of the PoC, the results underscored the broader potential for integrating L2 solutions into UBS’s operations. Key opportunities include:</p><ul><li><p><strong>Future proofing</strong>: Preparing for increased transaction volumes without bottlenecks</p></li><li><p><strong>Customization</strong>: Creating tailored solutions to address specific financial needs</p></li><li><p><strong>Customer demand</strong>: Meeting expectations for real-time, cost-efficient financial services</p></li><li><p><strong>Market access:</strong> Seamlessly participating in multichain ecosystem to access liquidity</p></li><li><p><strong>Cost predictability:</strong> Stabilizing operational expenses to support scalable growth</p></li></ul><h1 id="h-conclusion" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0"><strong>Conclusion</strong></h1><p>This PoC highlighted ZKsync Validium’s capability to support UBS privacy and interoperability requirements. By leveraging blockchain technology, UBS continues to explore innovative ways to enhance its financial offerings.</p><hr><h1 id="h-about-zksync" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0"><strong>About ZKsync</strong></h1><p>ZKsync is the pioneering ZK technology powering the next generation of builders with limitless scale. Secured by math and designed for native interoperability, ZKsync enables an elastic network, an ever-expanding ecosystem of customizable chains. Deeply rooted in its mission to advance personal freedom for all, the ZKsync technology makes digital self-ownership universally available.</p><p>To learn more about ZKsync, visit <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://enterprise.zksync.io/">https://enterprise.zksync.io/</a></p>]]></content:encoded>
            <author>zksync@newsletter.paragraph.com (ZKsync)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/c85690a1b36704d86ce21dbabadc7818a5835c3a1811135ea5adbd0e6e54e32d.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[Abstract, the consumer chain, deploys mainnet on ZKsync]]></title>
            <link>https://paragraph.com/@zksync/abstract-the-consumer-chain-deploys-mainnet-on-zksync</link>
            <guid>T4j1BHGyifoqCFBMHFHK</guid>
            <pubDate>Mon, 27 Jan 2025 18:19:03 GMT</pubDate>
            <description><![CDATA[Abstract joins a half-dozen ZK Chains on mainnet with its deployment to the Elastic Network, powered by ZKsync, to bring Web3 to everyday users.Abstract, the consumer chainAbstract, the industry-leading chain for consumer crypto joins the Elastic Network with its mainnet deployment. This launch is accompanied by over 100 consumer-friendly apps ready for users to play with on day one, along with over 200 more to deploy in the following weeks. Prioritizing user experience without sacrificing cr...]]></description>
            <content:encoded><![CDATA[<blockquote><p><em>Abstract joins a half-dozen ZK Chains on mainnet with its deployment to the Elastic Network, powered by ZKsync, to bring Web3 to everyday users.</em></p></blockquote><h1 id="h-abstract-the-consumer-chain" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Abstract, the consumer chain</h1><p>Abstract, the industry-leading chain for consumer crypto joins the Elastic Network with its mainnet deployment. This launch is accompanied by over 100 consumer-friendly apps ready for users to play with on day one, along with over 200 more to deploy in the following weeks.</p><p>Prioritizing user experience without sacrificing crypto’s core- values, Abstract is on a mission to build the world&apos;s largest onchain community. With nothing more than an email address, anyone can create an Abstract Global Wallet and unlock access to a thriving ecosystem of hundreds of consumer-friendly onchain apps and projects. By combining the ease of Web2 with the transformative potential of Web3, Abstract provides an intuitive, engaging, and accessible experience, bringing the onchain world to the masses like never before.</p><div data-type="twitter" tweetId="1882553378766729613" tweetData="{&quot;__typename&quot;:&quot;Tweet&quot;,&quot;lang&quot;:&quot;en&quot;,&quot;favorite_count&quot;:2595,&quot;possibly_sensitive&quot;:false,&quot;created_at&quot;:&quot;2025-01-23T22:17:56.000Z&quot;,&quot;display_text_range&quot;:[0,181],&quot;entities&quot;:{&quot;hashtags&quot;:[],&quot;urls&quot;:[],&quot;user_mentions&quot;:[],&quot;symbols&quot;:[],&quot;media&quot;:[{&quot;display_url&quot;:&quot;pic.x.com/5Dywl1roUw&quot;,&quot;expanded_url&quot;:&quot;https://x.com/AbstractChain/status/1882553378766729613/photo/1&quot;,&quot;indices&quot;:[182,205],&quot;url&quot;:&quot;https://t.co/5Dywl1roUw&quot;}]},&quot;id_str&quot;:&quot;1882553378766729613&quot;,&quot;text&quot;:&quot;Abstract is only as strong as the teams behind it.\n\nWe&apos;re crafting an ecosystem powered by unmatched infrastructure to make consumer crypto a reality.\n\nCheck out our partners below. https://t.co/5Dywl1roUw&quot;,&quot;user&quot;:{&quot;id_str&quot;:&quot;1806389563788587009&quot;,&quot;name&quot;:&quot;Abstract&quot;,&quot;screen_name&quot;:&quot;AbstractChain&quot;,&quot;is_blue_verified&quot;:false,&quot;profile_image_shape&quot;:&quot;Square&quot;,&quot;verified&quot;:false,&quot;verified_type&quot;:&quot;Business&quot;,&quot;profile_image_url_https&quot;:&quot;https://storage.googleapis.com/papyrus_images/a1bdc43d22acbde0ee328ae747ae1fc2d587fbf7fced170b713a7d4d9aa14efa.jpg&quot;},&quot;edit_control&quot;:{&quot;edit_tweet_ids&quot;:[&quot;1882553378766729613&quot;],&quot;editable_until_msecs&quot;:&quot;1737674276000&quot;,&quot;is_edit_eligible&quot;:false,&quot;edits_remaining&quot;:&quot;5&quot;},&quot;mediaDetails&quot;:[{&quot;display_url&quot;:&quot;pic.x.com/5Dywl1roUw&quot;,&quot;expanded_url&quot;:&quot;https://x.com/AbstractChain/status/1882553378766729613/photo/1&quot;,&quot;ext_media_availability&quot;:{&quot;status&quot;:&quot;Available&quot;},&quot;indices&quot;:[182,205],&quot;media_url_https&quot;:&quot;https://pbs.twimg.com/media/GiAsGw2X0AAStw5.png&quot;,&quot;original_info&quot;:{&quot;height&quot;:1152,&quot;width&quot;:2048,&quot;focus_rects&quot;:[{&quot;x&quot;:0,&quot;y&quot;:0,&quot;w&quot;:2048,&quot;h&quot;:1147},{&quot;x&quot;:499,&quot;y&quot;:0,&quot;w&quot;:1152,&quot;h&quot;:1152},{&quot;x&quot;:570,&quot;y&quot;:0,&quot;w&quot;:1011,&quot;h&quot;:1152},{&quot;x&quot;:787,&quot;y&quot;:0,&quot;w&quot;:576,&quot;h&quot;:1152},{&quot;x&quot;:0,&quot;y&quot;:0,&quot;w&quot;:2048,&quot;h&quot;:1152}]},&quot;sizes&quot;:{&quot;large&quot;:{&quot;h&quot;:1152,&quot;resize&quot;:&quot;fit&quot;,&quot;w&quot;:2048},&quot;medium&quot;:{&quot;h&quot;:675,&quot;resize&quot;:&quot;fit&quot;,&quot;w&quot;:1200},&quot;small&quot;:{&quot;h&quot;:383,&quot;resize&quot;:&quot;fit&quot;,&quot;w&quot;:680},&quot;thumb&quot;:{&quot;h&quot;:150,&quot;resize&quot;:&quot;crop&quot;,&quot;w&quot;:150}},&quot;type&quot;:&quot;photo&quot;,&quot;url&quot;:&quot;https://t.co/5Dywl1roUw&quot;}],&quot;photos&quot;:[{&quot;backgroundColor&quot;:{&quot;red&quot;:204,&quot;green&quot;:214,&quot;blue&quot;:221},&quot;cropCandidates&quot;:[{&quot;x&quot;:0,&quot;y&quot;:0,&quot;w&quot;:2048,&quot;h&quot;:1147},{&quot;x&quot;:499,&quot;y&quot;:0,&quot;w&quot;:1152,&quot;h&quot;:1152},{&quot;x&quot;:570,&quot;y&quot;:0,&quot;w&quot;:1011,&quot;h&quot;:1152},{&quot;x&quot;:787,&quot;y&quot;:0,&quot;w&quot;:576,&quot;h&quot;:1152},{&quot;x&quot;:0,&quot;y&quot;:0,&quot;w&quot;:2048,&quot;h&quot;:1152}],&quot;expandedUrl&quot;:&quot;https://x.com/AbstractChain/status/1882553378766729613/photo/1&quot;,&quot;url&quot;:&quot;https://storage.googleapis.com/papyrus_images/b01b8375eebce41d749563c674d4833fc8cda38548227ad2349e502147777b48.png&quot;,&quot;width&quot;:2048,&quot;height&quot;:1152}],&quot;conversation_count&quot;:271,&quot;news_action_type&quot;:&quot;conversation&quot;,&quot;isEdited&quot;:false,&quot;isStaleEdit&quot;:false}"> 
  <div class="twitter-embed embed">
    <div class="twitter-header">
        <div style="display:flex">
          <a target="_blank" href="https://twitter.com/AbstractChain">
              <img alt="User Avatar" class="twitter-avatar" src="https://storage.googleapis.com/papyrus_images/a1bdc43d22acbde0ee328ae747ae1fc2d587fbf7fced170b713a7d4d9aa14efa.jpg" />
            </a>
            <div style="margin-left:4px;margin-right:auto;line-height:1.2;">
              <a target="_blank" href="https://twitter.com/AbstractChain" class="twitter-displayname">Abstract</a>
              <p><a target="_blank" href="https://twitter.com/AbstractChain" class="twitter-username">@AbstractChain</a></p>
    
            </div>
            <a href="https://twitter.com/AbstractChain/status/1882553378766729613" target="_blank">
              <img alt="Twitter Logo" class="twitter-logo" src="https://paragraph.com/editor/twitter/logo.png" />
            </a>
          </div>
        </div>
      
    <div class="twitter-body">
      Abstract is only as strong as the teams behind it.<br /><br />We're crafting an ecosystem powered by unmatched infrastructure to make consumer crypto a reality.<br /><br />Check out our partners below. 
      <div class="twitter-media"><img class="twitter-image" src="https://storage.googleapis.com/papyrus_images/b01b8375eebce41d749563c674d4833fc8cda38548227ad2349e502147777b48.png" /></div>
      
       
    </div>
    
     <div class="twitter-footer">
          <a target="_blank" href="https://twitter.com/AbstractChain/status/1882553378766729613" style="margin-right:16px; display:flex;">
            <img alt="Like Icon" class="twitter-heart" src="https://paragraph.com/editor/twitter/heart.png">
            2,595
          </a>
          <a target="_blank" href="https://twitter.com/AbstractChain/status/1882553378766729613"><p>4:17 PM • Jan 23, 2025</p></a>
        </div>
    
  </div> 
  </div><blockquote><p>“For too long, the industry has prioritized technology over user experience, creating barriers to mainstream adoption,” said <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://x.com/lucanetz"><strong>Luca Netz</strong></a><strong>, Abstract Co-Inventor.</strong> “The launch of Abstract is more than just a technical milestone—it’s a shift in how everyday users – and not just crypto natives – experience blockchain. We’ve built Abstract to strip away the complexities of crypto, offering an intuitive and enjoyable experience that empowers users to explore and create effortlessly.”</p></blockquote><p>Abstract is built for enjoyment, while under the hood, ZKsync’s tech stack powers this enhanced experience, seamlessly connecting users on the internet, to the internet of money. Abstract’s unique approach is that it isn’t catered towards crypto people, it’s intuitive for the TikTok generation of consumers. In the same way that people don’t select Zoom over Google Meet due to which cloud infrastructure they&apos;re using, in the near future, people won’t select Web3 apps based on the underlying technology stack. Instead, the technology, user experience, and benefits to consumers and creators needs to be an order of magnitude better than what they had before.</p><p>A key feature of Abstract is the network’s <strong>Portal</strong> which aims to be a  “Digital Disneyland of Fun” for not only seasoned Web3 power-users, but for anyone with access to the Internet. In addition to applications, NFTs, gamified experiences, and the gamut of web3 projects we’ve seen to date, Abstract’s Portal will put streaming front-and-center. The creator economy, connected directly to their communities, but offering real token-based rewards for both creators and consumers alike will drive a unique behavior blending the power of platforms like Twitch with Web3 incentive models.</p><blockquote><p>“Look at the rise of gaming, sports, hip-hop, and streetwear—an entire generation transformed entertainment, music, and luxury. They shifted the narrative from publisher to streamer, owner to athlete, corporation to artist, and from price tags to culture,” <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://x.com/CashBowie"><strong>Michael Lee</strong></a><strong>, Abstract co-inventor and CEO of Cube Labs</strong>, explained, “Consumer crypto is the tech evolution of this revolution. Abstract brings back what the internet lost—fun, ownership, and creativity—while making it accessible to everyone.&quot;</p></blockquote><h1 id="h-powered-by-zksync" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Powered by ZKsync</h1><p>Abstract joins the ever-growing Elastic Network, powered by ZKsync, to become the 7th chain deployed to mainnet, with several more launching this year. The Elastic Network is an ever-expanding network of chains that deliver convenience, performance, security, verifiability and connectivity all at once. Building and deploying using the ZK Stack enables organizations to focus on developing the platform, its features, and the user-experience, while also supporting their ecosystem and communities without the need to focus resources on maintaining core underlying infrastructures. ZKsync’s ZK Stack touts easy-to-use developer kits that enable any developer  or organization to deploy their own customized L2.</p><div data-type="twitter" tweetId="1879964696654291416" tweetData="{&quot;__typename&quot;:&quot;Tweet&quot;,&quot;lang&quot;:&quot;en&quot;,&quot;favorite_count&quot;:262,&quot;possibly_sensitive&quot;:false,&quot;created_at&quot;:&quot;2025-01-16T18:51:26.000Z&quot;,&quot;display_text_range&quot;:[0,181],&quot;entities&quot;:{&quot;hashtags&quot;:[],&quot;urls&quot;:[],&quot;user_mentions&quot;:[{&quot;id_str&quot;:&quot;1503873189105053697&quot;,&quot;indices&quot;:[13,26],&quot;name&quot;:&quot;Empire 🟪&quot;,&quot;screen_name&quot;:&quot;theempirepod&quot;},{&quot;id_str&quot;:&quot;1415078650039443456&quot;,&quot;indices&quot;:[53,67],&quot;name&quot;:&quot;Pudgy Penguins&quot;,&quot;screen_name&quot;:&quot;pudgypenguins&quot;},{&quot;id_str&quot;:&quot;1806389563788587009&quot;,&quot;indices&quot;:[72,86],&quot;name&quot;:&quot;Abstract&quot;,&quot;screen_name&quot;:&quot;AbstractChain&quot;},{&quot;id_str&quot;:&quot;807982663000674305&quot;,&quot;indices&quot;:[101,110],&quot;name&quot;:&quot;Luca Netz 🐧✳️&quot;,&quot;screen_name&quot;:&quot;LucaNetz&quot;},{&quot;id_str&quot;:&quot;1191702416971968512&quot;,&quot;indices&quot;:[128,135],&quot;name&quot;:&quot;ZKsync&quot;,&quot;screen_name&quot;:&quot;zksync&quot;}],&quot;symbols&quot;:[],&quot;media&quot;:[{&quot;display_url&quot;:&quot;pic.x.com/9hXOzi90af&quot;,&quot;expanded_url&quot;:&quot;https://x.com/zksync/status/1879964696654291416/video/1&quot;,&quot;indices&quot;:[182,205],&quot;url&quot;:&quot;https://t.co/9hXOzi90af&quot;}]},&quot;id_str&quot;:&quot;1879964696654291416&quot;,&quot;text&quot;:&quot;Luca went on @theempirepod, to talk about all things @pudgypenguins and @AbstractChain.\n\nHere’s what @LucaNetz had to say about @ZKsync, the tech powering the cultural revolution ✳️ https://t.co/9hXOzi90af&quot;,&quot;user&quot;:{&quot;id_str&quot;:&quot;1191702416971968512&quot;,&quot;name&quot;:&quot;ZKsync&quot;,&quot;screen_name&quot;:&quot;zksync&quot;,&quot;is_blue_verified&quot;:false,&quot;profile_image_shape&quot;:&quot;Square&quot;,&quot;verified&quot;:false,&quot;verified_type&quot;:&quot;Business&quot;,&quot;profile_image_url_https&quot;:&quot;https://storage.googleapis.com/papyrus_images/a26a017ebd725596502e384207a0e0043eec1619b1033ac2725dc41bd70af313.jpg&quot;},&quot;edit_control&quot;:{&quot;edit_tweet_ids&quot;:[&quot;1879964696654291416&quot;],&quot;editable_until_msecs&quot;:&quot;1737057086000&quot;,&quot;is_edit_eligible&quot;:false,&quot;edits_remaining&quot;:&quot;5&quot;},&quot;mediaDetails&quot;:[{&quot;additional_media_info&quot;:{},&quot;display_url&quot;:&quot;pic.x.com/9hXOzi90af&quot;,&quot;expanded_url&quot;:&quot;https://x.com/zksync/status/1879964696654291416/video/1&quot;,&quot;ext_media_availability&quot;:{&quot;status&quot;:&quot;Available&quot;},&quot;indices&quot;:[182,205],&quot;media_url_https&quot;:&quot;https://pbs.twimg.com/ext_tw_video_thumb/1879963834888208384/pu/img/9z_BAolRNiFGklSg.jpg&quot;,&quot;original_info&quot;:{&quot;height&quot;:1080,&quot;width&quot;:1920,&quot;focus_rects&quot;:[]},&quot;sizes&quot;:{&quot;large&quot;:{&quot;h&quot;:1080,&quot;resize&quot;:&quot;fit&quot;,&quot;w&quot;:1920},&quot;medium&quot;:{&quot;h&quot;:675,&quot;resize&quot;:&quot;fit&quot;,&quot;w&quot;:1200},&quot;small&quot;:{&quot;h&quot;:383,&quot;resize&quot;:&quot;fit&quot;,&quot;w&quot;:680},&quot;thumb&quot;:{&quot;h&quot;:150,&quot;resize&quot;:&quot;crop&quot;,&quot;w&quot;:150}},&quot;type&quot;:&quot;video&quot;,&quot;url&quot;:&quot;https://t.co/9hXOzi90af&quot;,&quot;video_info&quot;:{&quot;aspect_ratio&quot;:[16,9],&quot;duration_millis&quot;:18733,&quot;variants&quot;:[{&quot;content_type&quot;:&quot;application/x-mpegURL&quot;,&quot;url&quot;:&quot;https://video.twimg.com/ext_tw_video/1879963834888208384/pu/pl/aFhsYe9z1cEVJkLQ.m3u8?tag=12&amp;v=ec0&quot;},{&quot;bitrate&quot;:256000,&quot;content_type&quot;:&quot;video/mp4&quot;,&quot;url&quot;:&quot;https://video.twimg.com/ext_tw_video/1879963834888208384/pu/vid/avc1/480x270/eOj7DgT0R8FlBXlX.mp4?tag=12&quot;},{&quot;bitrate&quot;:832000,&quot;content_type&quot;:&quot;video/mp4&quot;,&quot;url&quot;:&quot;https://video.twimg.com/ext_tw_video/1879963834888208384/pu/vid/avc1/640x360/JFIv8qUu1gkTAIxw.mp4?tag=12&quot;},{&quot;bitrate&quot;:2176000,&quot;content_type&quot;:&quot;video/mp4&quot;,&quot;url&quot;:&quot;https://video.twimg.com/ext_tw_video/1879963834888208384/pu/vid/avc1/1280x720/1foYdZYkyPSTfHXf.mp4?tag=12&quot;}]}}],&quot;photos&quot;:[],&quot;video&quot;:{&quot;aspectRatio&quot;:[16,9],&quot;contentType&quot;:&quot;media_entity&quot;,&quot;durationMs&quot;:18733,&quot;mediaAvailability&quot;:{&quot;status&quot;:&quot;available&quot;},&quot;poster&quot;:&quot;https://pbs.twimg.com/ext_tw_video_thumb/1879963834888208384/pu/img/9z_BAolRNiFGklSg.jpg&quot;,&quot;variants&quot;:[{&quot;type&quot;:&quot;application/x-mpegURL&quot;,&quot;src&quot;:&quot;https://video.twimg.com/ext_tw_video/1879963834888208384/pu/pl/aFhsYe9z1cEVJkLQ.m3u8?tag=12&amp;v=ec0&quot;},{&quot;type&quot;:&quot;video/mp4&quot;,&quot;src&quot;:&quot;https://video.twimg.com/ext_tw_video/1879963834888208384/pu/vid/avc1/480x270/eOj7DgT0R8FlBXlX.mp4?tag=12&quot;},{&quot;type&quot;:&quot;video/mp4&quot;,&quot;src&quot;:&quot;https://video.twimg.com/ext_tw_video/1879963834888208384/pu/vid/avc1/640x360/JFIv8qUu1gkTAIxw.mp4?tag=12&quot;},{&quot;type&quot;:&quot;video/mp4&quot;,&quot;src&quot;:&quot;https://video.twimg.com/ext_tw_video/1879963834888208384/pu/vid/avc1/1280x720/1foYdZYkyPSTfHXf.mp4?tag=12&quot;}],&quot;videoId&quot;:{&quot;type&quot;:&quot;tweet&quot;,&quot;id&quot;:&quot;1879964696654291416&quot;},&quot;viewCount&quot;:0},&quot;conversation_count&quot;:45,&quot;news_action_type&quot;:&quot;conversation&quot;,&quot;isEdited&quot;:false,&quot;isStaleEdit&quot;:false}"> 
  <div class="twitter-embed embed">
    <div class="twitter-header">
        <div style="display:flex">
          <a target="_blank" href="https://twitter.com/zksync">
              <img alt="User Avatar" class="twitter-avatar" src="https://storage.googleapis.com/papyrus_images/a26a017ebd725596502e384207a0e0043eec1619b1033ac2725dc41bd70af313.jpg" />
            </a>
            <div style="margin-left:4px;margin-right:auto;line-height:1.2;">
              <a target="_blank" href="https://twitter.com/zksync" class="twitter-displayname">ZKsync</a>
              <p><a target="_blank" href="https://twitter.com/zksync" class="twitter-username">@zksync</a></p>
    
            </div>
            <a href="https://twitter.com/zksync/status/1879964696654291416" target="_blank">
              <img alt="Twitter Logo" class="twitter-logo" src="https://paragraph.com/editor/twitter/logo.png" />
            </a>
          </div>
        </div>
      
    <div class="twitter-body">
      Luca went on <a class="twitter-content-link"  href="https://twitter.com/theempirepod" target="_blank">@theempirepod</a>, to talk about all things <a class="twitter-content-link"  href="https://twitter.com/pudgypenguins" target="_blank">@pudgypenguins</a> and <a class="twitter-content-link"  href="https://twitter.com/AbstractChain" target="_blank">@AbstractChain</a>.<br /><br />Here’s what <a class="twitter-content-link"  href="https://twitter.com/LucaNetz" target="_blank">@LucaNetz</a> had to say about @ZKsync, the tech powering the cultural revolution <img class="twitter-emoji" draggable="false" alt="✳️" src="https://abs-0.twimg.com/emoji/v2/72x72/2733.png"/> 
      <div class="twitter-media">
      <img class="twitter-image" src="https://pbs.twimg.com/ext_tw_video_thumb/1879963834888208384/pu/img/9z_BAolRNiFGklSg.jpg"> 
    </div>
      
       
    </div>
    
     <div class="twitter-footer">
          <a target="_blank" href="https://twitter.com/zksync/status/1879964696654291416" style="margin-right:16px; display:flex;">
            <img alt="Like Icon" class="twitter-heart" src="https://paragraph.com/editor/twitter/heart.png">
            262
          </a>
          <a target="_blank" href="https://twitter.com/zksync/status/1879964696654291416"><p>12:51 PM • Jan 16, 2025</p></a>
        </div>
    
  </div> 
  </div><p>Hear from Abstract’s Co-Inventor, Luca Netz, on why they chose to build on ZKsync.</p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://zksync.mirror.xyz/aHYcSWlY2cB-jDd96TdNBmmQosQ77kOVqLqphsbCe6w">https://zksync.mirror.xyz/aHYcSWlY2cB-jDd96TdNBmmQosQ77kOVqLqphsbCe6w</a></p><p>Abstract’s mission is to build the largest onchain community and drive the mainstream adoption of Web3. To achieve this, the platform is designed to make developing decentralized apps easier, cheaper, and safer than ever before. By leveraging cutting-edge zero-knowledge (ZK) cryptography, Abstract delivers low-cost, lightning-fast, and highly secure transactions for both users and builders. The platform integrates ZK Stack by ZKsync and Celestia data availability to streamline the development process, while Abstract provides dedicated support to builders, brands and creators ensuring a seamless onboarding experience.</p><blockquote><p>“We&apos;ve spent the past year reimagining what it means to create crypto experiences that put consumers first. What we&apos;re unveiling today reflects those efforts—a first-of-its-kind consumer terminal, a frictionless wallet with limitless capabilities, and a chain powering dozens of consumer-friendly crypto applications,” said <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://x.com/0xcygaar"><strong>Cygaar</strong></a><strong>, CTO of Cube Labs</strong>. “None of this would have been possible without our incredible engineering, product, and design teams.&quot;</p></blockquote><blockquote><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://x.com/gluk64"><strong>Alex Gluchowski</strong></a><strong>, Co-Founder of ZKsync,</strong> commented, “For blockchain to reach the masses, we must abstract away the complexity. Users need to experience better apps, builders need to have more engaged users, and creators need to be rewarded for their efforts - while cutting out unnecessary middlemen. Abstract building for everyone, not just Web3 power-users, is the path to get the next billion onchain.</p></blockquote><p>Abstract joins Cronos (Crypto[dot]com’s zkEVM L2), Zero Network (Zerion wallet’s native L2), Treasure (the leading Web3 gaming community’s L2), Sophon (general purpose L2), GRVT (the hybrid crypto exchange’s L2), and ZKsync Era (the flagship L2 for the elastic network).</p><p>To learn more about Abstract, explore The Portal, and join in on the wave of consumer crypto learn more at <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://abs.xyz/">abs.xyz</a>.</p>]]></content:encoded>
            <author>zksync@newsletter.paragraph.com (ZKsync)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/39a8c4ba83f75beef206fbae9d20b8f6586dc6c2ef794e4a100157f80ac59407.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[2024 Recap: Transforming Developer Experience on ZKsync]]></title>
            <link>https://paragraph.com/@zksync/2024-recap-transforming-developer-experience-on-zksync</link>
            <guid>8CWJrc3Sm7qy13UymO2D</guid>
            <pubDate>Fri, 24 Jan 2025 17:12:04 GMT</pubDate>
            <description><![CDATA[TL;DR: Over the past year, we’ve made building on ZKsync easier and more enjoyable with better tools, integrations, and resources. Highlights include a unified Hardhat plugin, enhanced Foundry and Viem support, the launch of ZKsync SSO and the ZK Stack CLI, and integrations with Alchemy, Chainlink, and Etherscan. Combined with redesigned docs, new tutorials, and exciting updates for 2025 like EVM bytecode equivalence, there’s never been a better time to build on ZKsync!Over the last year, we’...]]></description>
            <content:encoded><![CDATA[<blockquote><p><strong>TL;DR:</strong> Over the past year, we’ve made building on ZKsync easier and more enjoyable with better tools, integrations, and resources. Highlights include a unified Hardhat plugin, enhanced Foundry and Viem support, the launch of ZKsync SSO and the ZK Stack CLI, and integrations with Alchemy, Chainlink, and Etherscan. Combined with redesigned docs, new tutorials, and exciting updates for 2025 like EVM bytecode equivalence, there’s never been a better time to build on ZKsync!</p></blockquote><p>Over the last year, we’ve been on a mission to make building on ZKsync easier, faster, and more enjoyable. Developer experience has been a big focus for us, and a lot has changed in just 12 months.</p><p>It’s not just about the tools we’ve built (though we’re pretty excited about those too). We’ve reworked our documentation to make it clearer and more useful, added deeper integrations with popular frameworks, and made using third-party tools with ZKsync easier. Whether you’re building apps on Era or want to launch your own ZK chain, we want everything to feel seamless.</p><p>In this post, we’ll walk you through the key improvements we’ve made and how they’ve transformed the developer experience on ZKsync.</p><h1 id="h-developer-tools-faster-smarter-development" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Developer tools: faster, smarter development</h1><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/b62c829c4beaaa920ac0b2b64b2f4324b4f74b75d6276d7fac15e04d9d8b2639.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>We’ve introduced new tools and strengthened integrations with leading frameworks and services.</p><p>One of the biggest ways we’ve improved the developer experience on ZKsync is by leveling up our tooling. Whether you use Foundry or Hardhat to write smart contracts or explore new ways to enhance your app’s UX, we’ve got you covered. Here’s what’s new.</p><h3 id="h-hardhat-simplified" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Hardhat simplified</h3><p>We’ve combined all ZKsync plugins (like <code>hardhat-zksync-deploy</code>, <code>hardhat-zksync-upgradable</code>, <code>hardhat-zksync-solc</code>, etc) into a single, streamlined plugin: <code>hardhat-zksync</code>. Now, you get all ZKsync-specific features with one installation. But that’s not all. The updated plugin now supports EVM-like scripts, so there’s no need to rewrite your deployment or proxy upgrade scripts for ZKsync. Migrating your projects to ZKsync just got a whole lot easier.</p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.zksync.io/zksync-era/tooling/hardhat/guides/migrating-to-zksync">Find more info in our docs</a>.</p><h3 id="h-foundry-zksync" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Foundry-zksync</h3><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/foundry-rs/foundry">Foundry</a> has quickly become the go-to framework for smart contract developers, and for good reason—its performance and testing capabilities are unmatched. We knew we had to prioritize Foundry support, and now, <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/matter-labs/foundry-zksync">Foundry-zksync</a> offers an almost identical experience as its Ethereum counterpart.</p><p>Here’s what’s new:</p><ul><li><p><strong>EraVM Support</strong>: Full integration with our custom compilers and virtual machine ensures smooth testing and deployment.</p></li><li><p><strong>Anvil-zksync</strong>: Formerly known as <code>era-test-node</code>, this tool is now automatically installed and allows super fast testing and network forks.</p></li><li><p><strong>Foundry Book for ZKsync</strong>: We’ve written a dedicated version of the <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://foundry-book.zksync.io/">Foundry Book</a> that includes step-by-step tutorials to help you get started.</p></li></ul><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://book.getfoundry.sh/getting-started/installation">See the foundry-zksync installation details</a>.</p><h3 id="h-viem-and-wagmi-first-class-support" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Viem and Wagmi: First-class support</h3><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://viem.sh/">Viem</a> is one of the most popular JavaScript libraries, thanks to its speed, modularity, and developer-friendly APIs. With <code>viem/zksync</code>, you now get first-class support for ZKsync-specific features, including:</p><ul><li><p><strong>Native Account Abstraction</strong>: Smart account classes and helpers for paymaster transactions.</p></li><li><p><strong>Contract Deployment</strong>: Simplify and streamline your smart contract workflows.</p></li><li><p><strong>L1-L2 Communication</strong>: Easily bridge the gap between Ethereum and ZKsync chains.</p></li></ul><p>This integration ensures compatibility with tools like <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://wagmi.sh/">Wagmi</a>, a popular library for building Web3 frontends. Developers can now use Wagmi out of the box with ZKsync to create modern, responsive, and feature-rich dApp interfaces.</p><p>Check out the <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://viem.sh/zksync">Viem ZKsync docs</a>.</p><h3 id="h-zksync-sso-revolutionizing-ux" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">ZKsync SSO: Revolutionizing UX</h3><p>User experience is key to onboarding millions of people to Web3, and ZKsync SSO takes things to the next level. This SDK is designed to make integrating modular smart accounts into web applications easier than ever. Here’s what it offers:</p><ul><li><p><strong>Modular Smart Accounts</strong>: Based on ERC-7579 for maximum flexibility.</p></li><li><p><strong>Passkeys</strong>: Enable biometric authentication for a passwordless experience.</p></li><li><p><strong>Sessions</strong>: No more manually signing every transaction—users can enjoy seamless interactions.</p></li><li><p><strong>Spending Limits</strong>: Add an extra layer of security with controlled transaction parameters.</p></li></ul><p>With ZKsync SSO, building user-friendly dApps becomes simpler than ever. Y</p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://nft.zksync.dev/">Try a live demo of SSO here</a> and <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.zksync.io/zksync-era/unique-features/zksync-sso/getting-started">get started in our docs</a>.</p><h3 id="h-zk-stack-cli-a-new-tool-for-chain-operators" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">ZK Stack CLI: a new tool for chain operators</h3><p>With the launch of the Elastic Network, we knew many developers would want to explore running a ZK chain locally. The ZK Stack CLI simplifies the process of creating and managing an Elastic Chain ecosystem and ZK chains, giving developers more control and flexibility to build and test their ideas.</p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.zksync.io/zk-stack/running/quickstart">Try ZK Stack CLI</a>.</p><h3 id="h-compiler-updates" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Compiler Updates</h3><p>In 2024, both the <strong>zksolc</strong> and <strong>zkvyper</strong> compilers closely tracked their L1 counterparts, unifying the interfaces and supporting new Solidity and Vyper releases within a week of their release.</p><p>Alongside compatibility updates, we introduced the following performance improvements and features:</p><ul><li><p><strong>Deploy-Time Linking:</strong> We introduced support for <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://matter-labs.github.io/era-compiler-solidity/latest/05-linker.html">deploy-time linking</a>, which allows you to resolve addresses of libraries after a contract is compiled.</p></li><li><p><strong>Faster Compilation Times:</strong> Compilation times were halved by implementing the industry-standard LLVM-based post-compile-time (deploy-time) linker. If you&apos;re working on a large project and regularly compiling contracts, upgrading to the latest version could significantly speed up the development.</p></li><li><p><strong>Gas Consumption Reduction:</strong> As per our benchmarks contracts are now consuming 10% less gas. If you’re preparing an upgrade for your contracts, make sure to update the version of the compiler. Your users may notice the difference in a good way.</p></li><li><p><strong>Vyper v0.4.0 Support:</strong> Despite numerous <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/vyperlang/vyper/releases/tag/v0.4.0">breaking changes</a>, we duplicated our test database to allow running our CI for both vyper v0.3.x and v0.4.x languages.</p></li><li><p><strong>Unification of Interfaces:</strong> <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://matter-labs.github.io/era-compiler-solidity/latest/03-standard-json.html">Standard JSON</a> and <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://matter-labs.github.io/era-compiler-solidity/latest/04-combined-json.html">combined JSON</a> I/O have been unified to become closer to their solc counterparts, as well as to provide a predictable protocol for tooling such Foundry and Hardhat.</p></li><li><p><strong>Disassembler:</strong> We implemented an LLVM-based disassembler. If you&apos;re interested in inspecting the EraVM bytecode of your contract, <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://matter-labs.github.io/era-compiler-solidity/latest/02-command-line-interface.html#--disassemble">pass the compiled contract</a> to <code>zksolc</code> with the <code>--disassemble</code> option.</p></li><li><p><strong>IPFS Hash Format:</strong> Unblocked several large projects by allowing them to use this method of metadata hashing with IPFS services.</p></li><li><p><strong>Multi-Language Support:</strong> Allowed compilation Yul, LLVM IR, EraVM Assembly with the same workflow as Solidity and Vyper. The support on the tooling side is yet to come.</p></li></ul><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.zksync.io/zksync-protocol/compiler/toolchain">Learn more about the ZKsync compilers.</a></p><h3 id="h-remix-plugin-code-in-your-browser" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Remix Plugin: Code in your browser</h3><p>In collaboration with Nethermind, we launched a plugin for the beloved browser-based IDE, <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://remix.ethereum.org/">Remix</a>. This makes it possible to build and deploy contracts directly from your browser.</p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://medium.com/nethermind-eth/the-zksync-era-remix-plugin-a-how-to-guide-fc54e8d24bd3">Check out the guide to get started</a>.</p><h1 id="h-third-party-integrations" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Third-party integrations</h1><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/aa1f78e8a0c9ff0853dbba4327631d1b60e898ce48155e0640debf531d607e89.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>Over the past year, we’ve worked closely with some of the most popular tools and services in the Web3 space to make ZKsync Era even more developer-friendly. Here’s a quick rundown of the key integrations.</p><h3 id="h-etherscan-your-favourite-explorer-now-on-era" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Etherscan: your favourite explorer, now on Era</h3><p>The most popular block explorer, <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://twitter.com/zksync/status/1744343399417737266">Etherscan, is now available on ZKsync Era</a>. Whether you’re debugging, tracking transactions, or just exploring the ZKsync Era network, you can do it all in a familiar interface. <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://era.zksync.network/">Start exploring Era on Etherscan</a>.</p><h3 id="h-chainlink-price-feeds-and-ccip" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Chainlink: price feeds and CCIP</h3><p>Chainlink price feeds are now live on ZKsync Era, providing secure and accurate data for DeFi protocols. Additionally, Cross-Chain Interoperability Protocol (CCIP) integration opens up new possibilities for cross-chain applications. These two products were top requirements from many teams and we’re excited to have them available now.</p><h3 id="h-alchemy-full-suite-of-tools" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Alchemy: full suite of tools</h3><p>One of the most popular RPC and tooling providers, Alchemy has fully integrated ZKsync Era. Developers now have access to robust support for RPC nodes as well as additional APIs like the Token API, NFT API, Transfers API, Webhooks, Subgraphs, and more—making it easier than ever to build and scale dApps on ZKsync. <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.alchemy.com/zksync">Start building with Alchemy on ZKsync</a>.</p><h3 id="h-native-usdc-powered-by-circle" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Native USDC powered by Circle</h3><p>Native USDC issued directly by Circle is now available on ZKsync Era. This is a big step for DeFi and payments on the network. To avoid confusion, the bridged version of USDC (used in most DeFi apps on ZKsync Era) was renamed to <strong>USDC.e</strong>. <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.circle.com/blog/native-usdc-now-available-on-zksync">Read the announcement here</a>.</p><h3 id="h-thirdweb-all-in-one-development-tools" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Thirdweb: all-in-one development tools</h3><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://thirdweb.com/zksync">Thirdweb</a> has added full support for ZKsync Era across all their tools, including:</p><ul><li><p>Template smart contracts</p></li><li><p>CLIs</p></li><li><p>Developer utilities</p></li></ul><p>If you’re using Thirdweb to kickstart your projects, you can now leverage their entire suite of tools on ZKsync Era without extra setup.</p><h1 id="h-documentation-and-support-empowering-developers" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Documentation &amp; Support: Empowering Developers</h1><p>We’ve reimagined how developers interact with our resources, from updated documentation to improved support.</p><ul><li><p><strong>Redesigned Docs</strong>: A cleaner, more intuitive site for faster navigation. <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.zksync.io/">See the new docs</a>.</p></li><li><p><strong>Content Reorganization</strong>: Whether you’re building apps on Era, exploring the protocol, or running your own ZK chain, finding what you need is easier than ever.</p></li><li><p><strong>Developer Discussions Portal</strong>: the ZKsync developer discussions portal has become the to go-to place for devs to get support and help each other. We’ve doubled down our efforts to make sure no question gets unanswered. <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/zkSync-Community-Hub/zksync-developers/discussions">Visit the discussions portal</a>.</p></li></ul><h1 id="h-tutorials-and-education-leveling-up-your-skills" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Tutorials and Education: Leveling up your skills</h1><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/3e8b34d25462345681efdb3df7d5c20e574de543173fdb7e4cf898b696ae280b.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>We’ve also introduced new educational content to help developers sharpen their skills and explore ZKsync:</p><ul><li><p><strong>Quickstart Guides and Tutorials</strong>: With the new documentation, we released <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.zksync.io/zksync-era/guides/quick-start">a new quickstart</a> and <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.zksync.io/zksync-era/guides/zksync-101">101 sections</a> to help you hit the ground running.</p></li><li><p><strong>Cyfrin Updraft Courses</strong>: We partnered up with Patrick Collins, one of the most popular educators in the web3 space, and all their courses are now updated with new sections on ZKsync topics. Courses cover blockchain basics, Solidity, Foundry, and Python/Vyper fundamentals. <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://updraft.cyfrin.io/courses">See all courses.</a></p></li><li><p><strong>Community Code</strong>: An open source <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://code.zksync.io/">portal with more than 25 tutorials</a> submitted by Matter Labs and community members.</p></li><li><p><strong>Hands-On Video Tutorials</strong>:</p><ul><li><br></li><li><br></li><li><br></li><li><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.youtube.com/live/joR2E0VP9aA?feature=shared&amp;t=7106">Building web3 apps with web2 UX with SSO</a></p></li><li><p>Alchemy Learn series:</p><ul><li><br></li><li><br></li><li><p>Build a web3 app: <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.youtube.com/watch?v=wB56Ht_4zbU">Part 1</a> &amp; <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.youtube.com/watch?v=nH4J_LuWkuQ">Part 2</a></p></li></ul></li></ul></li></ul><h1 id="h-looking-ahead-whats-next-for-2025" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Looking ahead: What’s Next for 2025</h1><p>With the <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://zksync.mirror.xyz/QG2Xr4lQdJTbyjeKftPVc6-pj2t9-H9WEGnvCcnusck">recently announced 2025 protocol roadmap</a>, we’re excited to keep pushing the boundaries of what’s possible on ZKsync. Big updates like EVM bytecode equivalence are on the way, and we’re doubling down on improving the developer experience.</p><p>Here are some of the areas we’re focusing on:</p><ul><li><p><strong>Foundry</strong>: Ensuring complete ZKsync support for all remaining features, so building with Foundry feels seamless and intuitive.</p></li><li><p><strong>Improved Debugging Tools</strong>: Giving developers better ways to troubleshoot, test, and optimize their smart contracts.</p></li><li><p><strong>Third-Party Integrations</strong>: Expanding our Chainlink partnership and bringing more tools into the ecosystem.</p></li><li><p><strong>ZKsync SSO</strong>: Launching the first stable version of the library to make Web3 onboarding smoother than ever.</p></li></ul><p><strong>We’ll share a detailed developer experience roadmap for 2025 in the upcoming weeks. Stay tunned!</strong></p><p>We’re dedicated to making ZKsync the best platform for building the future of Web3. With everything we’ve accomplished and what’s coming next, there’s no better time to dive in.</p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.zksync.io/zksync-era/guides">Visit our docs to start building on ZKsync</a>. Let’s create something amazing together!</p>]]></content:encoded>
            <author>zksync@newsletter.paragraph.com (ZKsync)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/bfa5064a544d9ae4d5406e4d58b280d99a44698895baef8a9382d3c737919b24.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[Cultural Innovation in Blockchain: Luca Netz on ZKsync]]></title>
            <link>https://paragraph.com/@zksync/cultural-innovation-in-blockchain-luca-netz-on-zksync</link>
            <guid>RcNFt1S2uwg7wbsjiAUL</guid>
            <pubDate>Thu, 16 Jan 2025 18:41:14 GMT</pubDate>
            <description><![CDATA[In the ever-evolving blockchain world, where technological breakthroughs often outpace mainstream understanding, a few visionary leaders stand out. Luca Netz, CEO of Pudgy Penguins, is one such leader. Known for transforming the Pudgy Penguins NFT collection into a cultural phenomenon, Netz’s insights extend far beyond his own brand. In a recent appearance on the Blockworks Empire podcast, hosted by Jason Yanowitz and Santiago R Santos, Luca speaks clearly on ZKsync’s competitive edge as the ...]]></description>
            <content:encoded><![CDATA[<p>In the ever-evolving blockchain world, where technological breakthroughs often outpace mainstream understanding, a few visionary leaders stand out. Luca Netz, CEO of Pudgy Penguins, is one such leader. Known for transforming the Pudgy Penguins NFT collection into a <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.walmart.com/search?q=%22pudgy+penguins%22">cultural phenomenon</a>, Netz’s insights extend far beyond his own brand.</p><p>In a recent appearance on the <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://blockworks.co/podcast/empire">Blockworks Empire podcast</a>, hosted by <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://x.com/JasonYanowitz">Jason Yanowitz</a> and <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://x.com/santiagoroel">Santiago R Santos</a>, Luca speaks clearly on ZKsync’s competitive edge as the leading tech stack to deploy an L2.</p><blockquote><p>“ZKsync does all the things I need it to. They’re ahead of the curve by a Texas mile on account abstraction. They have low fees, fast transactions, and I believe in that tech stack to power the types of chains we want to build.”</p></blockquote><p>Listen to the full episode <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://blockworks.co/podcast/empire/cf61bcfa-be53-11ef-bbb7-ef91780b5749">here</a>.</p><div data-type="twitter" tweetId="1879964696654291416" tweetData="{&quot;__typename&quot;:&quot;Tweet&quot;,&quot;lang&quot;:&quot;en&quot;,&quot;favorite_count&quot;:262,&quot;possibly_sensitive&quot;:false,&quot;created_at&quot;:&quot;2025-01-16T18:51:26.000Z&quot;,&quot;display_text_range&quot;:[0,181],&quot;entities&quot;:{&quot;hashtags&quot;:[],&quot;urls&quot;:[],&quot;user_mentions&quot;:[{&quot;id_str&quot;:&quot;1503873189105053697&quot;,&quot;indices&quot;:[13,26],&quot;name&quot;:&quot;Empire 🟪&quot;,&quot;screen_name&quot;:&quot;theempirepod&quot;},{&quot;id_str&quot;:&quot;1415078650039443456&quot;,&quot;indices&quot;:[53,67],&quot;name&quot;:&quot;Pudgy Penguins&quot;,&quot;screen_name&quot;:&quot;pudgypenguins&quot;},{&quot;id_str&quot;:&quot;1806389563788587009&quot;,&quot;indices&quot;:[72,86],&quot;name&quot;:&quot;Abstract&quot;,&quot;screen_name&quot;:&quot;AbstractChain&quot;},{&quot;id_str&quot;:&quot;807982663000674305&quot;,&quot;indices&quot;:[101,110],&quot;name&quot;:&quot;Luca Netz 🐧✳️&quot;,&quot;screen_name&quot;:&quot;LucaNetz&quot;},{&quot;id_str&quot;:&quot;1191702416971968512&quot;,&quot;indices&quot;:[128,135],&quot;name&quot;:&quot;ZKsync&quot;,&quot;screen_name&quot;:&quot;zksync&quot;}],&quot;symbols&quot;:[],&quot;media&quot;:[{&quot;display_url&quot;:&quot;pic.x.com/9hXOzi90af&quot;,&quot;expanded_url&quot;:&quot;https://x.com/zksync/status/1879964696654291416/video/1&quot;,&quot;indices&quot;:[182,205],&quot;url&quot;:&quot;https://t.co/9hXOzi90af&quot;}]},&quot;id_str&quot;:&quot;1879964696654291416&quot;,&quot;text&quot;:&quot;Luca went on @theempirepod, to talk about all things @pudgypenguins and @AbstractChain.\n\nHere’s what @LucaNetz had to say about @ZKsync, the tech powering the cultural revolution ✳️ https://t.co/9hXOzi90af&quot;,&quot;user&quot;:{&quot;id_str&quot;:&quot;1191702416971968512&quot;,&quot;name&quot;:&quot;ZKsync&quot;,&quot;screen_name&quot;:&quot;zksync&quot;,&quot;is_blue_verified&quot;:false,&quot;profile_image_shape&quot;:&quot;Square&quot;,&quot;verified&quot;:false,&quot;verified_type&quot;:&quot;Business&quot;,&quot;profile_image_url_https&quot;:&quot;https://storage.googleapis.com/papyrus_images/a26a017ebd725596502e384207a0e0043eec1619b1033ac2725dc41bd70af313.jpg&quot;},&quot;edit_control&quot;:{&quot;edit_tweet_ids&quot;:[&quot;1879964696654291416&quot;],&quot;editable_until_msecs&quot;:&quot;1737057086000&quot;,&quot;is_edit_eligible&quot;:false,&quot;edits_remaining&quot;:&quot;5&quot;},&quot;mediaDetails&quot;:[{&quot;additional_media_info&quot;:{},&quot;display_url&quot;:&quot;pic.x.com/9hXOzi90af&quot;,&quot;expanded_url&quot;:&quot;https://x.com/zksync/status/1879964696654291416/video/1&quot;,&quot;ext_media_availability&quot;:{&quot;status&quot;:&quot;Available&quot;},&quot;indices&quot;:[182,205],&quot;media_url_https&quot;:&quot;https://pbs.twimg.com/ext_tw_video_thumb/1879963834888208384/pu/img/9z_BAolRNiFGklSg.jpg&quot;,&quot;original_info&quot;:{&quot;height&quot;:1080,&quot;width&quot;:1920,&quot;focus_rects&quot;:[]},&quot;sizes&quot;:{&quot;large&quot;:{&quot;h&quot;:1080,&quot;resize&quot;:&quot;fit&quot;,&quot;w&quot;:1920},&quot;medium&quot;:{&quot;h&quot;:675,&quot;resize&quot;:&quot;fit&quot;,&quot;w&quot;:1200},&quot;small&quot;:{&quot;h&quot;:383,&quot;resize&quot;:&quot;fit&quot;,&quot;w&quot;:680},&quot;thumb&quot;:{&quot;h&quot;:150,&quot;resize&quot;:&quot;crop&quot;,&quot;w&quot;:150}},&quot;type&quot;:&quot;video&quot;,&quot;url&quot;:&quot;https://t.co/9hXOzi90af&quot;,&quot;video_info&quot;:{&quot;aspect_ratio&quot;:[16,9],&quot;duration_millis&quot;:18733,&quot;variants&quot;:[{&quot;content_type&quot;:&quot;application/x-mpegURL&quot;,&quot;url&quot;:&quot;https://video.twimg.com/ext_tw_video/1879963834888208384/pu/pl/aFhsYe9z1cEVJkLQ.m3u8?tag=12&amp;v=ec0&quot;},{&quot;bitrate&quot;:256000,&quot;content_type&quot;:&quot;video/mp4&quot;,&quot;url&quot;:&quot;https://video.twimg.com/ext_tw_video/1879963834888208384/pu/vid/avc1/480x270/eOj7DgT0R8FlBXlX.mp4?tag=12&quot;},{&quot;bitrate&quot;:832000,&quot;content_type&quot;:&quot;video/mp4&quot;,&quot;url&quot;:&quot;https://video.twimg.com/ext_tw_video/1879963834888208384/pu/vid/avc1/640x360/JFIv8qUu1gkTAIxw.mp4?tag=12&quot;},{&quot;bitrate&quot;:2176000,&quot;content_type&quot;:&quot;video/mp4&quot;,&quot;url&quot;:&quot;https://video.twimg.com/ext_tw_video/1879963834888208384/pu/vid/avc1/1280x720/1foYdZYkyPSTfHXf.mp4?tag=12&quot;}]}}],&quot;photos&quot;:[],&quot;video&quot;:{&quot;aspectRatio&quot;:[16,9],&quot;contentType&quot;:&quot;media_entity&quot;,&quot;durationMs&quot;:18733,&quot;mediaAvailability&quot;:{&quot;status&quot;:&quot;available&quot;},&quot;poster&quot;:&quot;https://pbs.twimg.com/ext_tw_video_thumb/1879963834888208384/pu/img/9z_BAolRNiFGklSg.jpg&quot;,&quot;variants&quot;:[{&quot;type&quot;:&quot;application/x-mpegURL&quot;,&quot;src&quot;:&quot;https://video.twimg.com/ext_tw_video/1879963834888208384/pu/pl/aFhsYe9z1cEVJkLQ.m3u8?tag=12&amp;v=ec0&quot;},{&quot;type&quot;:&quot;video/mp4&quot;,&quot;src&quot;:&quot;https://video.twimg.com/ext_tw_video/1879963834888208384/pu/vid/avc1/480x270/eOj7DgT0R8FlBXlX.mp4?tag=12&quot;},{&quot;type&quot;:&quot;video/mp4&quot;,&quot;src&quot;:&quot;https://video.twimg.com/ext_tw_video/1879963834888208384/pu/vid/avc1/640x360/JFIv8qUu1gkTAIxw.mp4?tag=12&quot;},{&quot;type&quot;:&quot;video/mp4&quot;,&quot;src&quot;:&quot;https://video.twimg.com/ext_tw_video/1879963834888208384/pu/vid/avc1/1280x720/1foYdZYkyPSTfHXf.mp4?tag=12&quot;}],&quot;videoId&quot;:{&quot;type&quot;:&quot;tweet&quot;,&quot;id&quot;:&quot;1879964696654291416&quot;},&quot;viewCount&quot;:0},&quot;conversation_count&quot;:45,&quot;news_action_type&quot;:&quot;conversation&quot;,&quot;isEdited&quot;:false,&quot;isStaleEdit&quot;:false}"> 
  <div class="twitter-embed embed">
    <div class="twitter-header">
        <div style="display:flex">
          <a target="_blank" href="https://twitter.com/zksync">
              <img alt="User Avatar" class="twitter-avatar" src="https://storage.googleapis.com/papyrus_images/a26a017ebd725596502e384207a0e0043eec1619b1033ac2725dc41bd70af313.jpg" />
            </a>
            <div style="margin-left:4px;margin-right:auto;line-height:1.2;">
              <a target="_blank" href="https://twitter.com/zksync" class="twitter-displayname">ZKsync</a>
              <p><a target="_blank" href="https://twitter.com/zksync" class="twitter-username">@zksync</a></p>
    
            </div>
            <a href="https://twitter.com/zksync/status/1879964696654291416" target="_blank">
              <img alt="Twitter Logo" class="twitter-logo" src="https://paragraph.com/editor/twitter/logo.png" />
            </a>
          </div>
        </div>
      
    <div class="twitter-body">
      Luca went on <a class="twitter-content-link"  href="https://twitter.com/theempirepod" target="_blank">@theempirepod</a>, to talk about all things <a class="twitter-content-link"  href="https://twitter.com/pudgypenguins" target="_blank">@pudgypenguins</a> and <a class="twitter-content-link"  href="https://twitter.com/AbstractChain" target="_blank">@AbstractChain</a>.<br /><br />Here’s what <a class="twitter-content-link"  href="https://twitter.com/LucaNetz" target="_blank">@LucaNetz</a> had to say about @ZKsync, the tech powering the cultural revolution <img class="twitter-emoji" draggable="false" alt="✳️" src="https://abs-0.twimg.com/emoji/v2/72x72/2733.png"/> 
      <div class="twitter-media">
      <img class="twitter-image" src="https://pbs.twimg.com/ext_tw_video_thumb/1879963834888208384/pu/img/9z_BAolRNiFGklSg.jpg"> 
    </div>
      
       
    </div>
    
     <div class="twitter-footer">
          <a target="_blank" href="https://twitter.com/zksync/status/1879964696654291416" style="margin-right:16px; display:flex;">
            <img alt="Like Icon" class="twitter-heart" src="https://paragraph.com/editor/twitter/heart.png">
            262
          </a>
          <a target="_blank" href="https://twitter.com/zksync/status/1879964696654291416"><p>12:51 PM • Jan 16, 2025</p></a>
        </div>
    
  </div> 
  </div><h1 id="h-luca-netzs-vision-beyond-memes-and-markets" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0"><strong>Luca Netz’s Vision: Beyond Memes and Markets</strong></h1><p>Pudgy Penguins has become synonymous with creativity and inclusivity in the crypto space. Netz champions an important principle that blockchain can—and should—reach every demographic, from seasoned crypto investors to youth encountering digital assets for the first time. For Netz, the future of blockchain isn’t just about building infrastructure; it’s about crafting experiences that resonate universally.</p><blockquote><p>“Everybody loves the penguin,” Netz says, underscoring the universal appeal of the Pudgy Penguins brand. From toys on retail shelves to viral social media content, Pudgy Penguins demonstrates how blockchain-backed IP can connect with diverse audiences.</p></blockquote><h3 id="h-zksync-the-technology-empowering-visionaries" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0"><strong>ZKsync: The Technology Empowering Visionaries</strong></h3><p>A critical enabler of Netz’s vision is ZKsync due to its account abstraction and interoperability. With ZKsync, founders like Netz can focus on building consumer-facing experiences without worrying about the technical friction that often deters mainstream users.</p><blockquote><p>“The ZK stack is lightyears ahead,” Netz noted, praising ZKsync for solving hurdles like low fees, fast transactions, and seamless user interactions. This combination of advanced technology and intuitive usability makes ZKsync a cornerstone for projects that want to focus on building consumer applications without reinventing the underlying technology</p></blockquote><h3 id="h-cultural-phenomena-the-key-to-mass-adoption" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0"><strong>Cultural Phenomena: The Key to Mass Adoption</strong></h3><p>Netz’s emphasis on creating cultural relevance within blockchain is a guiding principle for projects looking to succeed in web3. He argues that memes, tokens, and NFTs shouldn’t remain stagnant symbols. Instead, they should evolve into cultural phenomena that inspire demand and emotional connection.</p><blockquote><p>“Why stop with a singular image or a token?” Netz asked. “The highest upside for these tokens is for them to become cultural phenomena.” Pudgy Penguins exemplifies this philosophy, blending blockchain innovation with mass-market appeal through retail partnerships, viral media, and community engagement.</p></blockquote><h3 id="h-zksyncs-role-in-fostering-innovation" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0"><strong>ZKsync’s Role in Fostering Innovation</strong></h3><p>For Netz, ZKsync is not just another platform, but a tool for creators and entrepreneurs to push boundaries. By eliminating barriers like high transaction fees and clunky user interfaces, ZKsync enables projects like Pudgy Penguins to thrive on a global scale. Its commitment to open-source development and inclusivity mirrors Netz’s belief in making blockchain accessible to everyone.</p><blockquote><p>“We’re not just building for Ethereum or Solana; we’re building for crypto,” Netz says, highlighting ZKsync’s chain-agnostic appeal and its role in fostering collaboration across ecosystems.</p></blockquote><h3 id="h-looking-ahead-a-blueprint-for-blockchain-success" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0"><strong>Looking Ahead: A Blueprint for Blockchain Success</strong></h3><p>As blockchain technology matures, the lessons from Netz and ZKsync’s collaboration offer a blueprint for success. By combining technological innovation with cultural resonance, projects can break free from niche markets and capture the imagination of the mainstream.</p><p>Whether it’s through the charm of a penguin or the efficiency of ZKsync’s architecture, the future of blockchain lies in creating experiences that are as engaging as they are empowering. As Netz continues to build bridges between cultures and technology, ZKsync stands ready to support those who dare to dream bigger.</p><h3 id="h-about-zksync" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0"><strong>About ZKsync</strong></h3><p>ZKsync is the pioneering zero-knowledge technology powering the next generation of builders with limitless scale. Secured by math and designed for native interoperability, ZKsync enables an elastic, ever-expanding network of customizable chains. Deeply rooted in its mission to advance personal freedom for all, the ZKsync technology makes digital self-ownership universally available.</p><p>To learn more about ZKsync, visit <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="http://www.zksync.io">http://www.zksync.io</a></p>]]></content:encoded>
            <author>zksync@newsletter.paragraph.com (ZKsync)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/690b4ce509f6d91ac1cc941efad8fb7365be39257297d468aa45ada256c4438c.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[Tradable Brings $1.7 Billion in Tokenized Alternative Assets to ZKsync]]></title>
            <link>https://paragraph.com/@zksync/tradable-brings-1-7-billion-in-tokenized-alternative-assets-to-zksync</link>
            <guid>H5p1nj4OW79A5apDyA5J</guid>
            <pubDate>Thu, 16 Jan 2025 14:28:26 GMT</pubDate>
            <description><![CDATA[Tradable, a pioneering technology company focused on making institutional-quality investments accessible to a broader range of participants, has achieved a significant milestone by tokenizing $1.7 billion of assets across nearly 30 institutional-grade private credit positions. Tradable is now the third-largest real-world asset platform globally and brings unique scale, quality, and diversity to the tokenized asset space. Tradable’s mission is to bring web3 technology to traditional asset mana...]]></description>
            <content:encoded><![CDATA[<p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.tradable.xyz/">Tradable</a>, a pioneering technology company focused on making institutional-quality investments accessible to a broader range of participants, has achieved a significant milestone by tokenizing $1.7 billion of assets across nearly 30 institutional-grade private credit positions. Tradable is now the third-largest real-world asset platform globally and brings unique scale, quality, and diversity to the tokenized asset space.</p><p>Tradable’s mission is to bring web3 technology to traditional asset managers and tokenize institutional grade investment opportunities, enabling access to high-quality, wealth-generating assets for new and existing investor bases. The next generation of wealth advisory, treasury management, neobanks, regulated trading venues, and financial transactions will be on-chain, and Tradable enables connectivity between the world’s leading asset managers and powerful web3 financial technology.</p><blockquote><p>“Tradable seamlessly bridges the on-chain / off-chain divide, while abstracting away all the complexity of adopting web3 technology,” said <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.linkedin.com/in/alexander-cordover-72a0a276">Alex Cordover</a>, CEO of Tradable. “By leveraging blockchain rails, we’re enabling the supply side to provide any arbitrary institutional grade asset, starting with best-in-class private credit opportunities, to any number of demand side investors, whether on-chain or not.”</p></blockquote><p>Separately, Tradable has also received a strategic investment from <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://parafi.com/">ParaFi Capital</a> (“ParaFi”), an alternative asset management and technology firm focused on the digital asset ecosystem. ParaFi joins existing Tradable ecosystem partners <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.victoryparkcapital.com/">Victory Park Capital</a> (“VPC”), <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.janushenderson.com/en-us/">Janus Henderson Group</a> (“Janus Henderson”), <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://matter-labs.io/">Matter Labs</a>, and <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.springlabs.com/">Spring Labs</a>, who have been instrumental in supporting the development, rollout, and expansion of Tradable’s innovative platform.</p><blockquote><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.linkedin.com/in/ben-forman-b78b2416">Ben Forman</a>, Founder and Managing Partner of ParaFi, stated, “We&apos;re excited to collaborate with Victory Park Capital and Matter Labs on building the future of private credit on-chain. The potential to modernize the backend of capital markets shines bright for blockchain, and Tradable&apos;s blend of financial expertise, commitment to compliance, and institutional user-friendliness positions the firm strongly in the pursuit of that objective.”</p></blockquote><p>Tradable’s on-chain technology is built on ZKsync, allowing for the creation of an efficient, cost-effective, and secure process for institutional asset managers to migrate investment strategies on-chain and access a broader investor base. The security, interoperability, customization, and confidentiality features of ZKsync’s tech empower financial institutions like Victory Park Capital to fully capitalize on tokenization and confidently transition eventually to an entirely on-chain issuance and value transfer model.</p><blockquote><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.linkedin.com/in/gluchowski/">Alex Gluchowski</a>, co-inventor of <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://zksync.io/">ZKsync</a>, said, “Tradable is making it possible to benefit from high-quality, institutional-grade investments, democratizing financial opportunities that were previously out of reach. This aligns perfectly with the mission of ZKsync technology, which was made to advance personal freedom through the mass adoption of crypto. By bringing these assets on-chain in an efficient, cost-effective, and compliant way, they’re ensuring more access to high-quality financial tools. This is the value of ZKsync offering user-friendly and scalable technology, to bring such advancements without sacrificing security or decentralization.”</p></blockquote><blockquote><p>“We are strong believers in Tradable’s mission to build towards a tokenized financial future,” said <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.victoryparkcapital.com/our-team/">Richard Levy</a>, CEO, CIO, and Founder of <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.victoryparkcapital.com/">VPC</a>. “The existing network and the waitlist of customers eager to leverage the Tradable platform is a testament to growing demand from institutional asset managers seeking a user-friendly, compliant, secure, and efficient way to tokenize their strategies and tap into new pockets of investor capital.”</p></blockquote><p>By building technology that smooths the asset tokenization and distribution processes, Tradable is rapidly growing an ecosystem of leading institutional partners which will be key to driving market-wide adoption.</p><blockquote><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.linkedin.com/in/nickcherney/">Nick Cherney</a>, Janus Henderson’s Head of Innovation, elaborated: “As a global asset manager, we view blockchain technology as possibly one of the most disruptive future developments in financial services. The path and pace of that disruption will be set by the efficiency and adoption of tokenization of traditional (real world) assets, and Tradable is bringing together key players across alternative and traditional finance which is the critical path to broad adoption of tokenization.”</p></blockquote><p>To view Tradable’s tokenization metrics, please visit <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://app.rwa.xyz/private_credit">https://app.rwa.xyz/private_credit</a>.</p><p><strong>About Tradable</strong></p><p><strong>About Tradable</strong></p><p>Tradable’s technology platform helps leading asset managers (originators) adopt web3 technology and grow AUM by reaching a new on-chain investor audience. Investors are able to access institutional quality opportunities via an intuitive interface built to simplify asset discovery and due diligence. Tradable has developed secure smart contracts for deal representation and AML/KYC/KYB/KYT compliance. Tradable’s blockchain-based systems improve on traditional marketplaces by enabling on-chain investments and programmatic execution of key tasks while maintaining a high bar of asset quality. Tradable is led by seasoned fintech operators with backgrounds spanning payments, marketplaces, AI, web3, trading, and private credit. For more information, visit <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.tradable.xyz/">tradable.xyz</a>.</p><p><strong>About ZKsync</strong></p><p>ZKsync is the pioneering ZK technology powering the next generation of builders with limitless scale. Secured by math and designed for native interoperability, ZKsync enables the elastic network, an ever-expanding ecosystem of customizable chains. Deeply rooted in its mission to advance personal freedom for all, the ZKsync technology makes digital self-ownership universally available. For more information, visit <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://zksync.io/">zksync.io</a>.</p>]]></content:encoded>
            <author>zksync@newsletter.paragraph.com (ZKsync)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/04ee74da725c50f91e695d8747d4229363be6dff1fc0c3dcbcc3ead486dc0f5a.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[ZKsync Trusted Execution Environment Proofs]]></title>
            <link>https://paragraph.com/@zksync/zksync-trusted-execution-environment-proofs</link>
            <guid>KjbW0lnljVxx3nbjTT9J</guid>
            <pubDate>Mon, 13 Jan 2025 17:57:12 GMT</pubDate>
            <description><![CDATA[This article explains Trusted Execution Environments (TEEs), focusing on Intel&apos;s Software Guard Extensions (SGX) and their uses in enhancing blockchain security on ZKsync Era. It covers the key features of TEEs, introduces SGX, and details ZKsync TEE proofs, which include cryptographic signatures and SGX attestation reports. The article also provides instructions on how to verify these proofs using the verify-era-proof-attestation tool with Docker. The main takeaway is understanding how ...]]></description>
            <content:encoded><![CDATA[<p>This article explains Trusted Execution Environments (TEEs), focusing on Intel&apos;s Software Guard Extensions (SGX) and their uses in enhancing blockchain security on ZKsync Era. It covers the key features of TEEs, introduces SGX, and details ZKsync TEE proofs, which include cryptographic signatures and SGX attestation reports.</p><p>The article also provides instructions on how to verify these proofs using the <code>verify-era-proof-attestation</code> tool with Docker. The main takeaway is understanding how TEEs improve blockchain security through isolated, secure computations and how to verify these proofs programmatically.</p><h1 id="h-what-is-a-tee" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">What is a TEE?</h1><p>A Trusted Execution Environment (TEE) is a secure area inside a hardware device to protect sensitive operations and data from external attacks or unauthorized access. It provides an isolated environment where encryption, decryption, authentication, and other security-critical functions can be executed while ensuring confidentiality and integrity.</p><p>Key features of TEEs include:</p><ol><li><p><strong>Isolation</strong>: The TEE is isolated from the main operating system and applications running on it, making it more difficult for attackers to access or tamper with the data being processed within the TEE.</p></li><li><p><strong>Hardware-Based Security</strong>: Many TEE implementations leverage hardware security features such as Trusted Platform Modules (TPMs), secure enclaves, or hardware-based encryption accelerators to enhance security posture.</p></li><li><p><strong>Attestation</strong>: TEEs can provide attestation services, allowing other systems to verify certain TEEs ran the correct computation on the correct data.</p></li><li><p><strong>Confidential Computing</strong>: TEEs enable confidential computing by ensuring that data processed within the environment remains encrypted and protected from both software and hardware vulnerabilities outside the secure area.</p></li><li><p><strong>Secure Key Management</strong>: They facilitate secure management and storage of cryptographic keys, which are essential for encryption and decryption processes.</p></li></ol><p>TEEs are widely used in various applications such as financial transactions, mobile payments, identity verification, IoT security, and more. TEEs help protect against data breaches, malware attacks, and other cybersecurity threats by providing a trusted environment for sensitive operations.</p><h1 id="h-what-is-sgx" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">What is SGX?</h1><p>Intel Software Guard Extensions (SGX) is a specific type of TEE built into modern Intel processors. SGX provides a way to isolate specific portions of memory on a device to create an enclave, which is a protected area of execution where code and data are secure and cannot be accessed by any process outside of the enclave. This includes even privileged processes like the operating system or hypervisor, offering a strong defense against many forms of security threats.</p><h1 id="h-why-does-zksync-use-tees" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Why does ZKsync use TEEs?</h1><p>ZKsync already uses ZK to prove the validity of the chain. Why do we also use TEEs? One reason is that TEEs can further verify the ZK computation. By using both ZK and TEE provers (multiprover architecture), the chain is even more secure. Another reason is that TEEs are faster than ZK Proofs, so TEEs can help make interoperability between ZK chains faster.</p><h1 id="h-what-are-zksync-tee-proofs" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">What are ZKsync TEE proofs?</h1><p><strong><em>Note</em></strong>*: This section is only meant for developers who want to run our attestation verification tool. If you are not a developer, you can skip to the end! *</p><p>The ZKsync TEE proof consist of a cryptographic signature of the block root hash in addition to a SGX attestation report, which contains the signing public key in its report user data. The signing key pair is created inside the TEE and changes every time the TEE starts up. The SGX attestation report is signed by the CPU, which is signed by Intel. The SGX attestation report contains the hash sum of the TEE, called <code>mrenclave</code>.</p><h3 id="h-what-are-the-mrenclave-values" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">What are the <code>mrenclave</code> values?</h3><p>The <code>mrenclave</code> hex strings represent a SHA sum. The initial state (memory, mode of operation, etc.) of the program loaded in the TEE (SGX enclave) is measured and a SHA sum is calculated. This SHA can be calculated beforehand from the executables and assets. So by rebuilding the TEE contents from source reproducibly and getting to the same hash, we can verify that the TEE was running the source.</p><h1 id="h-what-does-the-zksync-tee-prover-prove" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">What does the ZKsync TEE prover prove?</h1><p>The TEE prover is given all input and the expected partial state merkle tree, which produces the block root hash. Now the TEE prover runs the transactions in its VM and checks at the end, that the same merkle tree was produced. If that was the case, it signs the root hash with its signature key.</p><h1 id="h-running-the-verify-era-proof-attestation-tool" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Running the <code>verify-era-proof-attestation</code> tool</h1><p>At the time of writing this, ZKsync Era has TEE proves from block 493218 on. To verify those programmatically, we use the <code>verify-era-proof-attestation</code> <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/matter-labs/teepot/tree/main/bin/verify-era-proof-attestation">tool</a>. For portability reasons, the tool is shipped as a docker container. Check with <code>--help</code> for more arguments.</p><p>The source code for this can be seen in the <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/matter-labs/teepot/tree/main/bin/verify-era-proof-attestation">teepot</a> repository and this document uses version <code>v0.4.0</code>.</p><p>The TEE prover from the <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/matter-labs/zksync-era">zksync-era</a> repo has <code>mrenclave</code> <code>1b2374631bb2572a0e05b3be8b5cdd23c42e9d7551e1ef200351cae67c515a65</code> for <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/matter-labs/zksync-era/tree/core-v25.0.0">version</a> <code>core-v25.0.0</code> and <code>6fb19e47d72a381a9f3235c450f8c40f01428ce19a941f689389be3eac24f42a</code> for <code>core-v25.1.0</code>.</p><p>Run this on an x86 Linux computer to verify all batches from 493218 to the current:</p><pre data-type="codeBlock" text="docker run --env RUST_LOG=INFO -i --rm matterlabsrobot/verify-era-proof-attestation:v0.4.0 \
    --log-level=info \
    --rpc https://mainnet.era.zksync.io \
    --sgx-allowed-tcb-levels Ok,SwHardeningNeeded \
    --mrenclaves 1b2374631bb2572a0e05b3be8b5cdd23c42e9d7551e1ef200351cae67c515a65,6fb19e47d72a381a9f3235c450f8c40f01428ce19a941f689389be3eac24f42a \
  --continuous 493218
"><code>docker run <span class="hljs-operator">-</span><span class="hljs-operator">-</span>env RUST_LOG<span class="hljs-operator">=</span>INFO <span class="hljs-operator">-</span>i <span class="hljs-operator">-</span><span class="hljs-operator">-</span>rm matterlabsrobot<span class="hljs-operator">/</span>verify<span class="hljs-operator">-</span>era<span class="hljs-operator">-</span>proof<span class="hljs-operator">-</span>attestation:v0<span class="hljs-number">.4</span><span class="hljs-number">.0</span> \
    <span class="hljs-operator">-</span><span class="hljs-operator">-</span>log<span class="hljs-operator">-</span>level<span class="hljs-operator">=</span>info \
    <span class="hljs-operator">-</span><span class="hljs-operator">-</span>rpc https:<span class="hljs-comment">//mainnet.era.zksync.io \</span>
    <span class="hljs-operator">-</span><span class="hljs-operator">-</span>sgx<span class="hljs-operator">-</span>allowed<span class="hljs-operator">-</span>tcb<span class="hljs-operator">-</span>levels Ok,SwHardeningNeeded \
    <span class="hljs-operator">-</span><span class="hljs-operator">-</span>mrenclaves 1b2374631bb2572a0e05b3be8b5cdd23c42e9d7551e1ef200351cae67c515a65,6fb19e47d72a381a9f3235c450f8c40f01428ce19a941f689389be3eac24f42a \
  <span class="hljs-operator">-</span><span class="hljs-operator">-</span>continuous <span class="hljs-number">493218</span>
</code></pre><p>This should verify all blocks until at least block <code>494489</code>:</p><pre data-type="codeBlock" text="INFO verify_era_proof_attestation::verification: Signature verified successfully. batch_no=493218 signature=f7feaeba077215e9fe693a95ff484f373a64a237feb939966e4299c0cb5dadf720b29aa590b30fe3fcfba1208602186caa49c43418d88cb1f2e09fbbabbf8887
INFO verify_era_proof_attestation::verification: Quote verification result: SwHardeningNeeded: Software hardening is needed. mrsigner: c5591a72b8b86e0d8814d6e8750e3efe66aea2d102b8ba2405365559b858697d, mrenclave: 1b2374631bb2572a0e05b3be8b5cdd23c42e9d7551e1ef200351cae67c515a65, reportdata: 02cf1142c91c34219560616ca7b51774bb34dab9108283c3c97b68a9d26b8c9e1400000000000000000000000000000000000000000000000000000000000000. Advisory IDs: INTEL-SA-00615.
INFO verify_era_proof_attestation: Verification succeeded. batch_no=493218 proof.proved_at=&quot;2024-11-13T11:04:39.202856Z&quot; tee_type=&quot;SGX&quot;
INFO verify_era_proof_attestation::verification: Signature verified successfully. batch_no=493219 signature=c8c08c32fec52dc9f315e24c6710220a461da61bea78db690df416b1294a57b1492661e8ec539ee0a98b7bb9d1eb6bab92771694b6eccdf57e77e7208a9c7152
INFO verify_era_proof_attestation::verification: Quote verification result: SwHardeningNeeded: Software hardening is needed. mrsigner: c5591a72b8b86e0d8814d6e8750e3efe66aea2d102b8ba2405365559b858697d, mrenclave: 1b2374631bb2572a0e05b3be8b5cdd23c42e9d7551e1ef200351cae67c515a65, reportdata: 02cf1142c91c34219560616ca7b51774bb34dab9108283c3c97b68a9d26b8c9e1400000000000000000000000000000000000000000000000000000000000000. Advisory IDs: INTEL-SA-00615.
INFO verify_era_proof_attestation: Verification succeeded. batch_no=493219 proof.proved_at=&quot;2024-11-13T11:05:16.664133Z&quot; tee_type=&quot;SGX&quot;
INFO verify_era_proof_attestation::verification: Signature verified successfully. batch_no=493220 signature=e836d0b209bb35aea6b19480bdf4747670d3bbebeeadce5dd7cadb5d08e2d73d3a219a13158b9e3d3ee36004c79c391373f2f9ebebd6a18e0aabf98a65f04580
INFO verify_era_proof_attestation::verification: Quote verification result: SwHardeningNeeded: Software hardening is needed. mrsigner: c5591a72b8b86e0d8814d6e8750e3efe66aea2d102b8ba2405365559b858697d, mrenclave: 1b2374631bb2572a0e05b3be8b5cdd23c42e9d7551e1ef200351cae67c515a65, reportdata: 02cf1142c91c34219560616ca7b51774bb34dab9108283c3c97b68a9d26b8c9e1400000000000000000000000000000000000000000000000000000000000000. Advisory IDs: INTEL-SA-00615.
INFO verify_era_proof_attestation: Verification succeeded. batch_no=493220 proof.proved_at=&quot;2024-11-13T11:05:54.828465Z&quot; tee_type=&quot;SGX&quot;
INFO verify_era_proof_attestation::verification: Signature verified successfully. batch_no=493221 signature=15a66df5c078cee10d9d8ee889730141cf2dbfa021f0ded22955e954ccd6917838b96a84d680b21a468c85c7d62a687af58e82e91d3defc846edac0e6478f576

(...)
"><code>INFO verify_era_proof_attestation::verification: Signature verified successfully. batch_no=<span class="hljs-number">493218</span> signature<span class="hljs-operator">=</span>f7feaeba077215e9fe693a95ff484f373a64a237feb939966e4299c0cb5dadf720b29aa590b30fe3fcfba1208602186caa49c43418d88cb1f2e09fbbabbf8887
INFO verify_era_proof_attestation::verification: Quote verification result: SwHardeningNeeded: Software hardening <span class="hljs-keyword">is</span> needed. mrsigner: c5591a72b8b86e0d8814d6e8750e3efe66aea2d102b8ba2405365559b858697d, mrenclave: 1b2374631bb2572a0e05b3be8b5cdd23c42e9d7551e1ef200351cae67c515a65, reportdata: 02cf1142c91c34219560616ca7b51774bb34dab9108283c3c97b68a9d26b8c9e1400000000000000000000000000000000000000000000000000000000000000. Advisory IDs: INTEL<span class="hljs-operator">-</span>SA<span class="hljs-operator">-</span>00615.
INFO verify_era_proof_attestation: Verification succeeded. batch_no=<span class="hljs-number">493218</span> proof.proved_at=<span class="hljs-string">"2024-11-13T11:04:39.202856Z"</span> tee_type<span class="hljs-operator">=</span><span class="hljs-string">"SGX"</span>
INFO verify_era_proof_attestation::verification: Signature verified successfully. batch_no=<span class="hljs-number">493219</span> signature<span class="hljs-operator">=</span>c8c08c32fec52dc9f315e24c6710220a461da61bea78db690df416b1294a57b1492661e8ec539ee0a98b7bb9d1eb6bab92771694b6eccdf57e77e7208a9c7152
INFO verify_era_proof_attestation::verification: Quote verification result: SwHardeningNeeded: Software hardening <span class="hljs-keyword">is</span> needed. mrsigner: c5591a72b8b86e0d8814d6e8750e3efe66aea2d102b8ba2405365559b858697d, mrenclave: 1b2374631bb2572a0e05b3be8b5cdd23c42e9d7551e1ef200351cae67c515a65, reportdata: 02cf1142c91c34219560616ca7b51774bb34dab9108283c3c97b68a9d26b8c9e1400000000000000000000000000000000000000000000000000000000000000. Advisory IDs: INTEL<span class="hljs-operator">-</span>SA<span class="hljs-operator">-</span>00615.
INFO verify_era_proof_attestation: Verification succeeded. batch_no=<span class="hljs-number">493219</span> proof.proved_at=<span class="hljs-string">"2024-11-13T11:05:16.664133Z"</span> tee_type<span class="hljs-operator">=</span><span class="hljs-string">"SGX"</span>
INFO verify_era_proof_attestation::verification: Signature verified successfully. batch_no=<span class="hljs-number">493220</span> signature<span class="hljs-operator">=</span>e836d0b209bb35aea6b19480bdf4747670d3bbebeeadce5dd7cadb5d08e2d73d3a219a13158b9e3d3ee36004c79c391373f2f9ebebd6a18e0aabf98a65f04580
INFO verify_era_proof_attestation::verification: Quote verification result: SwHardeningNeeded: Software hardening <span class="hljs-keyword">is</span> needed. mrsigner: c5591a72b8b86e0d8814d6e8750e3efe66aea2d102b8ba2405365559b858697d, mrenclave: 1b2374631bb2572a0e05b3be8b5cdd23c42e9d7551e1ef200351cae67c515a65, reportdata: 02cf1142c91c34219560616ca7b51774bb34dab9108283c3c97b68a9d26b8c9e1400000000000000000000000000000000000000000000000000000000000000. Advisory IDs: INTEL<span class="hljs-operator">-</span>SA<span class="hljs-operator">-</span>00615.
INFO verify_era_proof_attestation: Verification succeeded. batch_no=<span class="hljs-number">493220</span> proof.proved_at=<span class="hljs-string">"2024-11-13T11:05:54.828465Z"</span> tee_type<span class="hljs-operator">=</span><span class="hljs-string">"SGX"</span>
INFO verify_era_proof_attestation::verification: Signature verified successfully. batch_no=<span class="hljs-number">493221</span> signature<span class="hljs-operator">=</span>15a66df5c078cee10d9d8ee889730141cf2dbfa021f0ded22955e954ccd6917838b96a84d680b21a468c85c7d62a687af58e82e91d3defc846edac0e6478f576

(...)
</code></pre><p>The next used <code>mrenclave</code> value for <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/matter-labs/zksync-era/tree/core-v25.2.0">v25.2.0</a> is expected to be <code>2174b836363c1def6e6893b07839753351e10199fc0b489c2233b516e244ec9d</code>.</p><h2 id="h-how-can-i-verify-the-mrenclave-values" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">How can I verify the <code>mrenclave</code> values?</h2><p>On a fast x86 Linux system with <code>docker</code> installed, run:</p><pre data-type="codeBlock" text="git clone --recurse-submodules https://github.com/matter-labs/zksync-era.git
cd zksync-era
git switch --recurse-submodules -c b25.0.0 tags/core-v25.0.0
docker run --privileged -it -v .:/mnt nixos/nix:2.18.1
"><code>git clone <span class="hljs-operator">-</span><span class="hljs-operator">-</span>recurse<span class="hljs-operator">-</span>submodules https:<span class="hljs-comment">//github.com/matter-labs/zksync-era.git</span>
cd zksync<span class="hljs-operator">-</span>era
git switch <span class="hljs-operator">-</span><span class="hljs-operator">-</span>recurse<span class="hljs-operator">-</span>submodules <span class="hljs-operator">-</span>c b25<span class="hljs-number">.0</span><span class="hljs-number">.0</span> tags<span class="hljs-operator">/</span>core<span class="hljs-operator">-</span>v25<span class="hljs-number">.0</span><span class="hljs-number">.0</span>
docker run <span class="hljs-operator">-</span><span class="hljs-operator">-</span>privileged <span class="hljs-operator">-</span>it <span class="hljs-operator">-</span>v .:<span class="hljs-operator">/</span>mnt nixos<span class="hljs-operator">/</span>nix:<span class="hljs-number">2.18</span><span class="hljs-number">.1</span>
</code></pre><p>Then run inside the container shell and answer all question with <code>N</code>.</p><pre data-type="codeBlock" text="echo &apos;experimental-features = nix-command flakes&apos; &gt;&gt; /etc/nix/nix.conf
echo &apos;sandbox = true&apos; &gt;&gt; /etc/nix/nix.conf
cd /mnt
nix build -L .#container-tee-prover-azure
cp result oci-image.tar.gz
"><code>echo <span class="hljs-string">'experimental-features = nix-command flakes'</span> <span class="hljs-operator">></span><span class="hljs-operator">></span> <span class="hljs-operator">/</span>etc<span class="hljs-operator">/</span>nix<span class="hljs-operator">/</span>nix.conf
echo <span class="hljs-string">'sandbox = true'</span> <span class="hljs-operator">></span><span class="hljs-operator">></span> <span class="hljs-operator">/</span>etc<span class="hljs-operator">/</span>nix<span class="hljs-operator">/</span>nix.conf
cd <span class="hljs-operator">/</span>mnt
nix build <span class="hljs-operator">-</span>L .#container<span class="hljs-operator">-</span>tee<span class="hljs-operator">-</span>prover<span class="hljs-operator">-</span>azure
cp result oci<span class="hljs-operator">-</span>image.tar.gz
</code></pre><p>It will run for a long time, and build a lot of software from source. After it is finished, don’t close the session, but switch to another terminal in the <code>zksync-era</code> directory and run:</p><pre data-type="codeBlock" text="export IMAGE_TAG=$(docker load -i oci-image.tar.gz | grep -Po &apos;Loaded image.*: \K.*&apos;)
docker run -i --rm $IMAGE_TAG &quot;gramine-sgx-sigstruct-view app.sig&quot;
"><code>export IMAGE_TAG<span class="hljs-operator">=</span>$(docker load <span class="hljs-operator">-</span>i oci<span class="hljs-operator">-</span>image.tar.gz <span class="hljs-operator">|</span> grep <span class="hljs-operator">-</span>Po <span class="hljs-string">'Loaded image.*: \K.*'</span>)
docker run <span class="hljs-operator">-</span>i <span class="hljs-operator">-</span><span class="hljs-operator">-</span>rm $IMAGE_TAG <span class="hljs-string">"gramine-sgx-sigstruct-view app.sig"</span>
</code></pre><p>Which gives the following output:</p><pre data-type="codeBlock" text="Attributes:
    mr_signer: c5591a72b8b86e0d8814d6e8750e3efe66aea2d102b8ba2405365559b858697d
    mr_enclave: 1b2374631bb2572a0e05b3be8b5cdd23c42e9d7551e1ef200351cae67c515a65
    isv_prod_id: 0
    isv_svn: 0
    debug_enclave: False
"><code><span class="hljs-attr">Attributes:</span>
    <span class="hljs-attr">mr_signer:</span> <span class="hljs-string">c5591a72b8b86e0d8814d6e8750e3efe66aea2d102b8ba2405365559b858697d</span>
    <span class="hljs-attr">mr_enclave:</span> <span class="hljs-string">1b2374631bb2572a0e05b3be8b5cdd23c42e9d7551e1ef200351cae67c515a65</span>
    <span class="hljs-attr">isv_prod_id:</span> <span class="hljs-number">0</span>
    <span class="hljs-attr">isv_svn:</span> <span class="hljs-number">0</span>
    <span class="hljs-attr">debug_enclave:</span> <span class="hljs-literal">False</span>
</code></pre><p>Now, let’s checkout tag <code>core-v25.1.0</code> from the non-container/host shell:</p><pre data-type="codeBlock" text="git switch --recurse-submodules -c b25.1.0 tags/core-v25.1.0
"><code>git switch <span class="hljs-operator">-</span><span class="hljs-operator">-</span>recurse<span class="hljs-operator">-</span>submodules <span class="hljs-operator">-</span>c b25<span class="hljs-number">.1</span><span class="hljs-number">.0</span> tags<span class="hljs-operator">/</span>core<span class="hljs-operator">-</span>v25<span class="hljs-number">.1</span><span class="hljs-number">.0</span>
</code></pre><p>Back to the container shell and still answer any questions with N:</p><pre data-type="codeBlock" text="nix build -L .#container-tee-prover-azure
cp result oci-image.tar.gz
"><code>nix build <span class="hljs-operator">-</span>L .#container<span class="hljs-operator">-</span>tee<span class="hljs-operator">-</span>prover<span class="hljs-operator">-</span>azure
cp result oci<span class="hljs-operator">-</span>image.tar.gz
</code></pre><p>This build should be faster, due to most artifacts already built.</p><p>Back to the outside host shell:</p><pre data-type="codeBlock" text="export IMAGE_TAG=$(docker load -i oci-image.tar.gz | grep -Po &apos;Loaded image.*: \K.*&apos;)
docker run -i --rm $IMAGE_TAG &quot;gramine-sgx-sigstruct-view app.sig&quot;
"><code>export IMAGE_TAG<span class="hljs-operator">=</span>$(docker load <span class="hljs-operator">-</span>i oci<span class="hljs-operator">-</span>image.tar.gz <span class="hljs-operator">|</span> grep <span class="hljs-operator">-</span>Po <span class="hljs-string">'Loaded image.*: \K.*'</span>)
docker run <span class="hljs-operator">-</span>i <span class="hljs-operator">-</span><span class="hljs-operator">-</span>rm $IMAGE_TAG <span class="hljs-string">"gramine-sgx-sigstruct-view app.sig"</span>
</code></pre><p>Which gives the following output:</p><pre data-type="codeBlock" text="Attributes:
    mr_signer: c5591a72b8b86e0d8814d6e8750e3efe66aea2d102b8ba2405365559b858697d
    mr_enclave: 6fb19e47d72a381a9f3235c450f8c40f01428ce19a941f689389be3eac24f42a
    isv_prod_id: 0
    isv_svn: 0
    debug_enclave: False
"><code><span class="hljs-attr">Attributes:</span>
    <span class="hljs-attr">mr_signer:</span> <span class="hljs-string">c5591a72b8b86e0d8814d6e8750e3efe66aea2d102b8ba2405365559b858697d</span>
    <span class="hljs-attr">mr_enclave:</span> <span class="hljs-string">6fb19e47d72a381a9f3235c450f8c40f01428ce19a941f689389be3eac24f42a</span>
    <span class="hljs-attr">isv_prod_id:</span> <span class="hljs-number">0</span>
    <span class="hljs-attr">isv_svn:</span> <span class="hljs-number">0</span>
    <span class="hljs-attr">debug_enclave:</span> <span class="hljs-literal">False</span>
</code></pre><p>Those <code>mr_enclave</code> values should match those used previously in the <code>verify-era-proof-attestation tool</code>.</p><h1 id="h-whats-next-for-zksync-tees" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">What’s next for ZKsync TEEs?</h1><p>In 2025, you can look forward to TEEs helping with ZKsync’s interoperability, as well as acting as a security backup for ZK proofs.</p><p>If you’d like to get in touch, join our <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://join.zksync.dev/">Discord</a>.</p>]]></content:encoded>
            <author>zksync@newsletter.paragraph.com (ZKsync)</author>
            <enclosure url="https://storage.googleapis.com/papyrus_images/85241646ff4033fff77c5b8d3b9a728ada3f697c47265dcc49e7d25ce39d4a4a.png" length="0" type="image/png"/>
        </item>
    </channel>
</rss>