aere-contracts/hardhat.config.js
Aere Network a13a649b77
Some checks are pending
contracts-ci / Install (lockfile) → compile → full test suite (push) Waiting to run
contracts-ci / PQC known-answer tests (NIST vectors) (push) Waiting to run
contracts-ci / Coverage (scoped, with artifacts) (push) Waiting to run
Initial public release
Aere Network public source. Everything here can be checked against the live
chain (chain id 2800, https://rpc.aere.network).

Scope note, stated up front rather than buried: consensus on chain 2800 is
classical secp256k1 ECDSA QBFT. The post-quantum work in this repository is at
the signature, precompile, account and transport layers. Nothing here makes the
consensus post-quantum, and no document in it should be read as claiming so.
2026-07-20 01:02:37 +03:00

242 lines
8.2 KiB
JavaScript

require("@nomicfoundation/hardhat-toolbox");
require("dotenv").config();
// Helper function to format private key
function formatPrivateKey(key) {
if (!key) return undefined;
// Remove 0x prefix if present
let cleanKey = key.startsWith('0x') ? key.slice(2) : key;
// Ensure it's exactly 64 characters (32 bytes)
if (cleanKey.length !== 64) {
console.error(`Invalid private key length: ${cleanKey.length}, expected 64 characters`);
return undefined;
}
return cleanKey;
}
const privateKey = formatPrivateKey(process.env.PRIVATE_KEY);
/** @type import('hardhat/config').HardhatUserConfig */
module.exports = {
solidity: {
compilers: [
{
version: "0.8.23",
settings: {
optimizer: {
enabled: true,
runs: 1, // R5: prioritize size — AereCoreBookV0 + sAERE drip pushed contract to ~25KB
},
viaIR: true, // Enable intermediate representation for better optimization
},
},
],
// Per-file overrides ONLY. The global compiler stays 0.8.23 (shanghai
// default) so the bytecode of every other contract is untouched. Cancun
// opcode contracts opt in file by file: solc 0.8.23 cannot target cancun
// (0.8.24 is the first release that can), so an override must also pin
// the newer compiler version.
overrides: {
// Cancun EVM canary: TSTORE/TLOAD (EIP-1153), MCOPY (EIP-5656),
// PUSH0 (EIP-3855), BLOBHASH/BLOBBASEFEE (EIP-4844/7516).
"contracts/AereCancunCanary.sol": {
version: "0.8.24",
settings: {
optimizer: { enabled: true, runs: 200 },
evmVersion: "cancun",
},
},
},
},
networks: {
// AERE Network Mainnet - Production Ready
aere: {
url: process.env.AERE_RPC_URL || "https://rpc.aere.network",
chainId: 2800,
accounts: privateKey ? [privateKey] : [],
gasPrice: "auto", // Automatic gas price detection
gasMultiplier: 1.2, // 20% buffer for gas estimation
timeout: 60000, // 60 second timeout
confirmations: 2, // Wait for 2 confirmations
},
// AERE Network Testnet - Enhanced for Testing
aereTestnet: {
url: process.env.AERE_TESTNET_RPC_URL || "https://testnet-rpc.aere.network",
chainId: 2801,
accounts: privateKey ? [privateKey] : [],
gasPrice: "auto",
gasMultiplier: 1.5, // Higher buffer for testnet
timeout: 120000, // Longer timeout for testnet
confirmations: 1, // Faster confirmations for testing
},
// Local development with Hardhat node.
// accounts: "remote" = use the node's own 20 unlocked, pre-funded signers
// (the env PRIVATE_KEY account holds no ETH on a fresh hardhat node, and
// local harnesses like run-local-corebook.js need 3 funded signers).
localhost: {
url: "http://127.0.0.1:8545",
chainId: 31337,
accounts: "remote",
gasPrice: 20000000000, // 20 gwei
gasMultiplier: 1.1,
},
// Hardhat network for testing
hardhat: {
chainId: 31337,
// AERE mainnet has an effectively unlimited block gas limit; the heavy
// on-chain Falcon-1024 verifier needs > 30M gas per call, so raise the
// LOCAL test ceiling. This affects local testing only (not the aere
// network config, which uses gasPrice/estimation against the live chain).
// hardfork "cancun" avoids the EIP-7825 (Fusaka) 2^24 per-tx gas cap that
// newer hardhat defaults enforce, which is far below a Falcon-1024 verify.
hardfork: "cancun",
blockGasLimit: 2_000_000_000,
allowUnlimitedContractSize: false,
// R6 FIX: removed `interval: 2000` — spontaneous auto-mining between
// RPC reads caused fuzz snapshots to span multiple block timestamps,
// creating phantom drift on time-dependent views (sAERE undist, etc).
// Tests that need block time advance use evm_increaseTime + evm_mine
// explicitly.
mining: {
auto: true,
},
accounts: {
mnemonic: process.env.MNEMONIC || "test test test test test test test test test test test junk",
count: 20,
accountsBalance: "10000000000000000000000"
}
},
// Polygon testnet for cross-chain testing
mumbai: {
url: process.env.MUMBAI_RPC_URL || "https://rpc-mumbai.maticvigil.com",
chainId: 80001,
accounts: privateKey ? [privateKey] : [],
gasPrice: "auto",
},
// Ethereum Sepolia testnet for interoperability testing
sepolia: {
url: process.env.SEPOLIA_RPC_URL || "https://rpc.sepolia.org",
chainId: 11155111,
accounts: privateKey ? [privateKey] : [],
gasPrice: "auto",
},
// ── L1 / L2 counterparty chains for the USDC.e Warp Route L1 leg. ──
// INERT until the founder picks a chain, sets its RPC + a funded PRIVATE_KEY,
// and explicitly runs scripts/stablecoins/deploy-l1-warp-collateral.js against
// it. Defining a network deploys nothing. See docs/WARP_ROUTE_L1_LEG_*.md.
ethereum: {
url: process.env.ETHEREUM_RPC_URL || "https://ethereum-rpc.publicnode.com",
chainId: 1,
accounts: privateKey ? [privateKey] : [],
gasPrice: "auto",
},
base: {
url: process.env.BASE_RPC_URL || "https://mainnet.base.org",
chainId: 8453,
accounts: privateKey ? [privateKey] : [],
gasPrice: "auto",
},
arbitrum: {
url: process.env.ARBITRUM_RPC_URL || "https://arb1.arbitrum.io/rpc",
chainId: 42161,
accounts: privateKey ? [privateKey] : [],
gasPrice: "auto",
},
optimism: {
url: process.env.OPTIMISM_RPC_URL || "https://mainnet.optimism.io",
chainId: 10,
accounts: privateKey ? [privateKey] : [],
gasPrice: "auto",
}
},
// Enhanced Etherscan configuration for verification
etherscan: {
apiKey: {
aere: process.env.AERE_EXPLORER_API_KEY || "your-api-key-here",
aereTestnet: process.env.AERE_TESTNET_EXPLORER_API_KEY || "your-testnet-api-key-here",
polygon: process.env.POLYGONSCAN_API_KEY || "",
polygonMumbai: process.env.POLYGONSCAN_API_KEY || "",
sepolia: process.env.ETHERSCAN_API_KEY || "",
// L1 Warp Route counterparty chains (optional contract verification).
// Etherscan V2 uses one multichain key across all four; set ETHERSCAN_API_KEY.
mainnet: process.env.ETHERSCAN_API_KEY || "",
ethereum: process.env.ETHERSCAN_API_KEY || "",
base: process.env.ETHERSCAN_API_KEY || process.env.BASESCAN_API_KEY || "",
arbitrum: process.env.ETHERSCAN_API_KEY || process.env.ARBISCAN_API_KEY || "",
optimism: process.env.ETHERSCAN_API_KEY || process.env.OPTIMISM_API_KEY || ""
},
customChains: [
{
network: "aere",
chainId: 2800,
urls: {
apiURL: process.env.AERE_EXPLORER_API_URL || "https://explorer.aere.network/api",
browserURL: process.env.AERE_EXPLORER_URL || "https://explorer.aere.network"
}
},
{
network: "aereTestnet",
chainId: 2801,
urls: {
apiURL: process.env.AERE_TESTNET_EXPLORER_API_URL || "https://testnet-explorer.aere.network/api",
browserURL: process.env.AERE_TESTNET_EXPLORER_URL || "https://testnet-explorer.aere.network"
}
}
]
},
// Gas reporting for cost optimization
gasReporter: {
enabled: process.env.REPORT_GAS !== undefined,
currency: "USD",
gasPrice: 20, // 20 gwei
coinmarketcap: process.env.COINMARKETCAP_API_KEY,
showTimeSpent: true,
showMethodSig: true,
maxMethodDiff: 10,
},
// Contract size reporting
contractSizer: {
alphaSort: true,
runOnCompile: true,
disambiguatePaths: false,
},
// Mocha test configuration
mocha: {
timeout: 120000, // 2 minutes for complex tests
reporter: process.env.CI ? "json" : "spec",
},
// Deployment paths
paths: {
sources: "./contracts",
tests: "./test",
cache: "./cache",
artifacts: "./artifacts",
deploy: "./deploy",
deployments: "./deployments",
},
// Compiler settings for different environments
dependencyCompiler: {
paths: [
"@openzeppelin/contracts/token/ERC20/ERC20.sol",
"@openzeppelin/contracts/access/Ownable.sol",
"@openzeppelin/contracts/security/ReentrancyGuard.sol",
],
},
};