Open-source project
argotorg/solidity avatar
argotorg/solidity

Solidity: the compiler behind Ethereum smart contracts, and what adopting it costs

Solidity, the Smart Contract Programming Language

25,746 stars6,167 forksC++GPL-3.0

At a glance

What is it?
Solidity is a statically-typed, contract-oriented language that compiles to the Ethereum Virtual Machine. Its README points to the documentation for build and install steps, and the licence is GPL-3.0, which matters if you plan to embed the compiler rather than just call it.
Who is it for?
Adopt Solidity if you are deploying contracts to the EVM and you are willing to track the 0.x release cadence, because the README states that breaking changes, new features and bug fixes are introduced regularly and that you should use the latest released version when deploying. Do not adopt it if your target is not the Ethereum Virtual Machine, or if you need a stable language surface with no breaking changes between releases.
Can I use it commercially?
Yes, with conditions. GPL-3.0 is a copyleft licence: if you distribute software that includes it, you must release that software's source code under the same licence. Running it internally without distributing it does not trigger that obligation.
Is it still maintained?
Yes. The repository received new commits within the last day.
What is it written in?
Mainly C++, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on September 29, 2026, and from our analysis. They are not legal advice.

DEEP OPEN-SOURCE ANALYSIS

What Solidity solves, and who is actually supposed to use it

Solidity exists so that logic can run inside a peer-to-peer network where, as the README puts it, nobody has special authority over the execution. That constraint shapes everything else. A contract that implements a token, a vote, or an ownership record has to be deterministic and self-contained, because no operator will step in to correct it. The language is statically typed and contract-oriented, with curly-brace syntax, and it targets the Ethereum Virtual Machine specifically.

The audience is narrow by design. If you are writing back-end services, scripts, or anything that runs under your own control, the EVM's execution model and gas accounting are costs you gain nothing from. Solidity is for people who need code whose behaviour is enforced by the network rather than by a server they operate. The README's own example is honest about the mismatch: a Hello World program is described as being of even less use in Solidity than in other languages. The language pays for its guarantees with friction, and it only pays off when you need the guarantees.

How the compiler is put together: libsolidity, libyul and the solc front end

The repository layout shows a compiler split into libraries rather than a single monolith. libsolidity holds the language front end. libyul is the intermediate representation layer. libevmasm handles EVM assembly, liblangutil carries shared language utilities, libsmtutil provides SMT solver integration, and libsolc exposes the compiler as a library. The solc directory is the command line driver that ties these together.

That split is the reason the compiler can be embedded in other tooling at all, and it is also the reason the licence question is not trivial. Calling the solc binary and linking libsolc are different relationships to GPL-3.0 code. The README notes that some third-party code carries its own licensing terms, referenced from a generated header template under cmake/templates. If you are building a product around Solidity, the library boundary is where you should look first.

The deps directory and the CMakeLists.txt at the repository root indicate a CMake-based build that pulls in dependencies. The README does not reproduce the build steps; it redirects to the installing page in the documentation. That is a deliberate choice, and it means the repository alone is not a complete installation guide.

Installing the Solidity compiler and running a first contract

The README does not list install commands. It states that instructions for building and installing the compiler are in the Solidity documentation, under the installing-solidity page, and it points to Remix as the browser-based way to get started without installing anything. So there are two honest paths: read the documentation for a local compiler, or open Remix.

The README supplies this contract as its example. It is a pure function, so it needs no state and no constructor:

solidity
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.9.0;

contract HelloWorld {
    function helloWorld() external pure returns (string memory) {
        return "Hello, World!";
    }
}

The pragma line is the part worth reading closely. It declares a version range, not a fixed version, and the README separately says that when deploying contracts you should use the latest released version because breaking changes are introduced regularly. Those two statements pull in opposite directions: the pragma keeps your source compiling across a range, while deployment advice pushes you to the newest compiler. Pick the pragma range deliberately rather than copying the example.

The README lists four worked examples in the documentation: Voting, Blind Auction, Safe remote purchase, and Micropayment Channel. Those are the natural next step after the Hello World contract, because each one exercises state, value transfer, or time-dependent logic that a pure function does not.

The 0.x version number is a warning, not a formality

The README links to the semantic versioning specification's fourth item to explain why Solidity stays below 1.0. That item covers major version zero, where anything may change at any time and the public API should not be considered stable. The project is telling you directly that the language surface is not frozen.

This is the single largest adoption cost. A contract is not a service you can patch on a Tuesday. Once deployed to the EVM, its bytecode is what it is, and the source that produced it has to be reproducible later for verification. If the compiler introduces breaking changes between releases, the version you compiled with becomes part of your artifact's identity, not an incidental detail. The three most recent releases listed in the repository, v0.8.37, v0.8.36 and v0.8.35, span roughly five months, which gives a sense of the release rhythm without saying anything about how disruptive any individual release is.

The practical consequence is that your build pipeline needs to pin a compiler version rather than float. The README's own Hello World contract uses a range, which is fine for a toy. For anything holding value, a range is a liability.

When Solidity is the wrong tool

If your code does not need to run on the Ethereum Virtual Machine, Solidity adds cost with no corresponding benefit. The language's guarantees come from the execution environment, not from the syntax. Take the environment away and you are left with an unfamiliar type system, gas-aware programming patterns, and a compiler you have to install separately.

There is a second, less obvious failure mode: the compiler is not a verifier. The repository contains libsmtutil, which indicates SMT solver integration, but the README makes no claim that the compiler proves your contract correct. Static typing catches type errors. It does not catch reentrancy, arithmetic assumptions about external callers, or economic logic that behaves correctly in isolation and badly under adversarial conditions. The README's security section only points to a separate SECURITY.md file, and that file is not reproduced in the README.

A third case: if your team needs a language with a stable surface and long deprecation windows, the 0.x policy is disqualifying on its own. That is not a defect in Solidity. It is a mismatch between the project's stated release philosophy and your requirements.

Remix versus a local compiler: two different starting points

The README presents Remix as the entry point, describing it as a browser-based IDE, and links to it directly. Remix and a locally installed compiler are not interchangeable, and the difference is not just convenience.

With Remix, the compiler runs in the browser. You get immediate feedback, no build configuration, and no dependency on the CMake setup that the repository's root CMakeLists.txt and deps directory imply. The trade-off is that your build is not reproducible from your own machine unless you record the compiler version Remix used. With a local compiler, you control the version and can pin it, which is what the deployment advice in the README pushes you toward, but you take on the build and dependency management that the documentation covers.

For a first contract, Remix is the shorter path and the README endorses it. For anything you intend to deploy and verify, the local compiler with a pinned version is the one that matches the project's own guidance. Choosing Remix for production work means outsourcing a decision the README says you should make yourself.

Maintenance, releases and what GPL-3.0 means for your build

The repository is not archived, and the last push was on 2026-09-20, one day before this article's reference point. The README states that the language and compiler are governed by a core team within the Argot Collective, a non-profit, and that the project was originally started at and sponsored by the Ethereum Foundation. Contributions are described as welcome, with a Developer's Guide in the documentation and a projects section for feature and bug priorities.

Upgrade cost is driven by the release cadence described above. The repository carries a Changelog.md and a ReleaseChecklist.md at the top level, so the project documents both what changed and what a release involves. Reading the changelog before bumping a pinned compiler version is the concrete step, not a general recommendation.

On licensing: Solidity is GPL-3.0, and the README notes that some third-party code has its own licensing terms, pointing to a header template under cmake/templates. The distinction that matters in practice is between invoking the solc binary as a separate program and linking libsolc into your own code, because those are different relationships to copyleft-licensed code. This article is not legal advice; if your product embeds the compiler rather than calling it, read LICENSE.txt and the third-party terms before you ship.

Editorial conclusion

Adopt Solidity if you are deploying contracts to the EVM and you are willing to track the 0.x release cadence, because the README states that breaking changes, new features and bug fixes are introduced regularly and that you should use the latest released version when deploying. Do not adopt it if your target is not the Ethereum Virtual Machine, or if you need a stable language surface with no breaking changes between releases. Before writing production code, verify the current compiler version against the latest release listed in the repository, check whether your build needs the GPL-3.0 obligations that come with linking the compiler rather than invoking the solc binary, and confirm the install path in the official documentation, since the README itself only links there.

Frequently asked questions

What is Solidity?

Solidity is a statically-typed, contract-oriented, high-level language for implementing smart contracts on the Ethereum platform, compiled for the Ethereum Virtual Machine. The README describes it as using curly-brace syntax and a 0.x version number to signal a fast pace of change.

How do you install the Solidity compiler?

The README does not give install commands. It states that instructions for building and installing the compiler are in the Solidity documentation, on the installing-solidity page, and it points to Remix as a browser-based alternative that needs no local installation.

How do you use Solidity in VS Code?

The README does not document a VS Code setup. It points to Remix as the browser-based IDE for getting started and to the documentation for building and installing the compiler locally.

Is Solidity similar to C++?

The README describes Solidity as statically typed with curly-brace syntax, which is a surface similarity to C-family languages. The compiler itself is written in C++, but the README does not compare the two languages beyond that.

How do you use require in Solidity?

The README does not cover the require construct. It lists four worked examples in the documentation, Voting, Blind Auction, Safe remote purchase and Micropayment Channel, which are the place to look for language constructs in use.

Official sources

  1. argotorg/solidity on GitHub
  2. License: GPL-3.0
  3. Project website
  4. README
  5. Releases
For maintainers

Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/argotorg-solidity.svg)](https://hysenlabs.com/projects/argotorg-solidity)
Community notes

Community notes