Skip to main content

Standard EVM Precompiles

Fluent ships every standard Ethereum precompile at addresses 0x01 through 0x11. Each precompile is implemented as a system contract under fluentbase/contracts/ that wraps the corresponding revm_precompile function — semantics are byte-for-byte identical to mainnet Ethereum, with one minor implementation note in BN254.

AddressConstantEIP / SpecificationSource
0x...0001PRECOMPILE_SECP256K1_RECOVERFrontier ecrecovercontracts/ecrecover/
0x...0002PRECOMPILE_SHA256Frontier SHA-256contracts/sha256/
0x...0003PRECOMPILE_RIPEMD160Frontier RIPEMD-160contracts/ripemd160/
0x...0004PRECOMPILE_IDENTITYFrontier identity / data copycontracts/identity/
0x...0005PRECOMPILE_BIG_MODEXPEIP-198 modular exponentiation (Berlin schedule)contracts/modexp/
0x...0006PRECOMPILE_BN256_ADDEIP-196 BN254 G1 addcontracts/bn256/
0x...0007PRECOMPILE_BN256_MULEIP-196 BN254 G1 scalar multiplicationcontracts/bn256/
0x...0008PRECOMPILE_BN256_PAIREIP-197 BN254 pairing checkcontracts/bn256/
0x...0009PRECOMPILE_BLAKE2FEIP-152 BLAKE2 F compressioncontracts/blake2f/
0x...000aPRECOMPILE_KZG_POINT_EVALUATIONEIP-4844 KZG point evaluationcontracts/kzg/
0x...000bPRECOMPILE_BLS12_381_G1_ADDEIP-2537 BLS12-381 G1 addcontracts/bls12381/
0x...000cPRECOMPILE_BLS12_381_G1_MSMEIP-2537 BLS12-381 G1 multi-scalar mulcontracts/bls12381/
0x...000dPRECOMPILE_BLS12_381_G2_ADDEIP-2537 BLS12-381 G2 addcontracts/bls12381/
0x...000ePRECOMPILE_BLS12_381_G2_MSMEIP-2537 BLS12-381 G2 multi-scalar mulcontracts/bls12381/
0x...000fPRECOMPILE_BLS12_381_PAIRINGEIP-2537 BLS12-381 pairingcontracts/bls12381/
0x...0010PRECOMPILE_BLS12_381_MAP_G1EIP-2537 map FP → G1contracts/bls12381/
0x...0011PRECOMPILE_BLS12_381_MAP_G2EIP-2537 map FP² → G2contracts/bls12381/

The address column shows the canonical last-byte form. Full addresses follow Address::with_last_byte — e.g. PRECOMPILE_SHA256 is 0x0000000000000000000000000000000000000002.

Notes on implementation

  • BN254 (BN256) endianness: the implementation converts between Ethereum's big-endian inputs and SP1's little-endian internal representation at the boundary (bn256/src/lib.rspoint_be_to_le / point_le_to_be). The external interface remains EIP-196/197 compliant; the conversion is invisible to callers.
  • One contract crate, several addresses: the BN254 family shares one bn256 contract crate dispatched by caller address; the BLS12-381 family shares one bls12381 crate the same way. The genesis build installs the same compiled rWasm at every address in each family.

Source

Each row's Source column points to the contract crate. Implementations delegate to revm_precompile for the underlying math, so any divergence from mainnet semantics would be visible in the wrapper code.