EAS Precompile

component identity

Discovery surface for the canonical EAS deployment — getParams() returns the SchemaRegistry / EAS / Indexer addresses, with zero-address sentinels when a slot is unconfigured.

The EAS precompile at 0x1000000000000000000000000000000000000009 is a thin module-config surface. It exposes a single view method, getParams(), that returns the addresses of the canonical Ethereum Attestation Service deployment on this chain — schemaRegistry, eas, and indexer. Each address slot is independently configurable; an unconfigured slot is returned as the zero address (0x0000…0000), so callers must check before using the value. The actual attestation API (issue, query, revoke) lives on the EAS contract preinstall, not on this precompile.

What getParams() returns

getParams() returns a tuple of three addresses pulled from the x/eas module parameters: the SchemaRegistry, the EAS contract, and the Indexer. Resolve these at runtime so your dApp works unchanged across testnet and mainnet — never hard-code them in production code.
interface IEas {
    struct EasParams {
        address schemaRegistry;
        address eas;
        address indexer;
    }
    function getParams() external view returns (EasParams memory params);
}

address constant EAS_PRECOMPILE = 0x1000000000000000000000000000000000000009;
IEas.EasParams memory p = IEas(EAS_PRECOMPILE).getParams();
require(p.eas != address(0), "EAS not configured on this network");

Zero-address sentinels for unconfigured slots

Each of the three address slots in the module's parameters is optional. If the chain has not been configured with a SchemaRegistry, EAS, or Indexer deployment, the corresponding field comes back as 0x0000000000000000000000000000000000000000. The precompile no longer reverts when a slot is empty — it returns zero so callers can detect partial deployments and degrade gracefully. Always guard against the zero address before calling into the returned contract.
import { createPublicClient, http } from "viem";

const client = createPublicClient({ transport: http("https://rpc-testnet.maroo.io") });
const params = await client.readContract({
  address: "0x1000000000000000000000000000000000000009",
  abi: easPrecompileAbi,
  functionName: "getParams",
});

if (params.eas === "0x0000000000000000000000000000000000000000") {
  throw new Error("EAS contract not configured on this network yet");
}
if (params.indexer === "0x0000000000000000000000000000000000000000") {
  console.warn("Indexer not configured — reverse-lookup queries are unavailable");
}

What this precompile is NOT

This precompile does not issue, query, or revoke attestations. Those operations target the EAS contract preinstall directly using the standard @ethereum-attestation-service/eas-sdk package or any equivalent ABI binding. Treat this precompile purely as a discovery hop: call it once, cache the addresses, then talk to the EAS contract for the rest of the flow.

See Also

Source: maroo
ESC
Type to search