Source code for pons.compiler
"""
Solidity compiler support.
Requires the dependencies from the ``compiler`` feature.
"""
from collections.abc import Mapping
from enum import Enum
from pathlib import Path
import solcx
from ._contract import CompiledContract
__all__ = ["EVMVersion", "compile_contract_file"]
[docs]
class EVMVersion(Enum):
"""
Supported EVM versions.
Some may not be available depending on the compiler version.
"""
HOMESTEAD = "homestead"
"""Homestead fork, Mar 14, 2016."""
TANGERINE_WHISTLE = "tangerineWhistle"
"""Tangerine Whistle fork, Oct 18, 2016."""
SPURIOUS_DRAGON = "spuriousDragon"
"""Spurious Dragon fork, Nov 22, 2016."""
BYZANTIUM = "byzantium"
"""Byzantium fork, Oct 16, 2017."""
CONSTANTINOPLE = "constantinople"
"""Constantinople fork, Feb 28, 2019."""
ISTANBUL = "istanbul"
"""Istanbul fork, Dec 8, 2019."""
BERLIN = "berlin"
"""Berlin fork, Apr 15, 2021."""
LONDON = "london"
"""London fork, Aug 5, 2021."""
PARIS = "paris"
"""Paris fork, Sep 15, 2022."""
SHANGHAI = "shanghai"
"""Shanghai fork, Apr 12, 2023."""
CANCUN = "cancun"
"""Cancun fork, Mar 13, 2024."""
PRAGUE = "prague"
"""Prague fork, May 7, 2025."""
[docs]
def compile_contract_file(
path: str | Path,
*,
import_remappings: Mapping[str, str | Path] = {},
optimize: bool = False,
evm_version: None | EVMVersion = None,
) -> dict[str, CompiledContract]:
"""
Compiles the Solidity file at the given ``path`` and returns a dictionary of compiled contracts
keyed by the contract name.
Some ``evm_version`` values may not be available depending on the compiler version.
If ``evm_version`` is not given, the compiler default is used.
"""
path = Path(path).resolve()
compiled = solcx.compile_files(
[path],
output_values=["abi", "bin"],
evm_version=evm_version.value if evm_version else None,
import_remappings=dict(import_remappings),
optimize=optimize,
)
results = {}
for identifier, compiled_contract in compiled.items():
path, contract_name = identifier.split(":")
contract = CompiledContract.from_compiler_output(
json_abi=compiled_contract["abi"],
bytecode=bytes.fromhex(compiled_contract["bin"]),
)
# When `.sol` files are imported, all contracts are added to the flat namespace.
# So all the contract names are guaranteed to be different,
# otherwise the compilation fails.
results[contract_name] = contract
return results