DevelopersSeptember 14, 2026by
EmpoorioChain Core
EmpoorioChain Core

Solidity on EmpoorioChain: Deploying with Hardhat to Chain 2026

No transpiler, no special compiler, no port. Solidity contracts deploy to EmpoorioChain with the tooling you already have, because Frontier gives the chain a real EVM and standard Ethereum JSON-RPC. This post is the configuration and the two things worth knowing before you ship.

Hardhat configuration

// hardhat.config.ts
import { HardhatUserConfig } from "hardhat/config";
import "@nomicfoundation/hardhat-toolbox";

const config: HardhatUserConfig = {
  solidity: "0.8.24",
  networks: {
    empooriochain: {
      url: "https://rpc.testnet.empooriochain.org",
      chainId: 2026,
      accounts: [process.env.DEPLOYER_PRIVATE_KEY!],
    },
  },
};
export default config;
npx hardhat run scripts/deploy.ts --network empooriochain

The chain id is 2026 and must be exact — it is signed into every transaction under EIP-155. Older documents and sites listed 9000, 1337, 9911 and 27777; all wrong. Gas price is 1 gwei since runtime 220; Hardhat's estimator reads it from the node.

MetaMask

Network name EmpoorioChain Testnet, RPC https://rpc.testnet.empooriochain.org, chain id 2026, symbol DMS, explorer https://empooscan.com. There is no mainnet network to add.

Verification

The public-sale contract DracmaSaleV2 (Solidity 0.8.24, optimizer 200 runs) was verified on Sourcify as an exact match on 12 September 2026 — Sourcify is the verification path that works today. Etherscan-style labelling depends on an explorer integration that is still pending.

Quirk 1: eth_getCode at latest

On runtime 213 it was found that eth_getCode(address, 'latest') returns 0x for contracts that do have code; only 'pending' returns it. If your deployment script confirms success by reading code at latest, it will report failure for a successful deploy. Eoonia's workaround, adopted ecosystem-wide: verify deployment by the deployer's nonce increment and by a receipt with a contract address. This is filed as a Frontier-integration issue.

Quirk 2: precompiles that reach the runtime

The standard precompiles 0x010x09 are present. In addition:

  • 0xAA — AI Oracle. A contract can request an inference from the Ailoos network and receive a result the chain's AI-serving pallets have verified. Gas scales with the compute weight requested.
  • 0x72 exposes native NFT pallets with an ERC-721 surface; 0x1155 exposes native assets as ERC-1155.
interface IAiOracle {
    function request(bytes32 modelId, bytes calldata input) external payable returns (bytes32 jobId);
    function result(bytes32 jobId) external view returns (bool ready, bytes memory output);
}
IAiOracle constant AI = IAiOracle(address(0xAA));

A former DMS-bridge precompile at 0xEB has been retired; DMS liquidity is native, and the EVM view of a balance is the native balance.

What is not available

ink! / Wasm contracts: pallet-contracts is not in the live runtime. Solidity through Frontier is the contract path on EmpoorioChain. And the chain does not run Solang or any Solidity-to-native compiler — nor does it need one, since the EVM is real.

When a pallet beats a contract

If your contract is reimplementing account abstraction, permit approvals, royalties, vaults, flash loans or compliance rules, the chain already enforces those natively (see the EIP coverage post). A Solidity contract can still call into them through the precompiles, or your app can talk to the pallets directly from the client and keep the contract small. Both sides share one ledger.

Chain parameters from RED.json; precompiles from 02_CORE_SYSTEMS/EVM_AND_L2.md; the eth_getCode finding from the runtime 213 notes; Sourcify verification from CONTRATOS_EVM.json.

Share this article