harb/services/ponder/ponder.config.ts
2025-09-24 14:02:28 +02:00

84 lines
2.6 KiB
TypeScript

import { createConfig } from "ponder";
import type { Abi } from "viem";
import KraikenAbi from "./abis/Kraiken.json";
import StakeAbi from "./abis/Stake.json";
// Network configurations keyed by canonical environment name
const networks = {
BASE_SEPOLIA_LOCAL_FORK: {
chainId: 31337,
rpc: process.env.PONDER_RPC_URL_BASE_SEPOLIA_LOCAL_FORK || "http://127.0.0.1:8545",
disableCache: true,
contracts: {
kraiken: process.env.KRAIKEN_ADDRESS || "0x56186c1E64cA8043dEF78d06AfF222212eA5df71",
stake: process.env.STAKE_ADDRESS || "0x056E4a859558A3975761ABd7385506BC4D8A8E60",
startBlock: parseInt(process.env.START_BLOCK || "31425917"),
},
},
BASE_SEPOLIA: {
chainId: 84532,
rpc: process.env.PONDER_RPC_URL_BASE_SEPOLIA || "https://sepolia.base.org",
contracts: {
kraiken: "0x22c264Ecf8D4E49D1E3CabD8DD39b7C4Ab51C1B8",
stake: "0xe28020BCdEeAf2779dd47c670A8eFC2973316EE2",
startBlock: 20940337,
},
},
BASE: {
chainId: 8453,
rpc: process.env.PONDER_RPC_URL_BASE || "https://base.llamarpc.com",
contracts: {
kraiken: "0x45caa5929f6ee038039984205bdecf968b954820",
stake: "0xed70707fab05d973ad41eae8d17e2bcd36192cfc",
startBlock: 26038614,
},
},
} as const;
// Select network based on environment variable
const NETWORK = (process.env.PONDER_NETWORK as keyof typeof networks) || "BASE_SEPOLIA_LOCAL_FORK";
const selectedNetwork = networks[NETWORK as keyof typeof networks];
if (!selectedNetwork) {
throw new Error(`Invalid network: ${NETWORK}. Valid options: ${Object.keys(networks).join(", ")}`);
}
console.log(
`[ponder.config] Network=${NETWORK}, chainId=${selectedNetwork.chainId}, startBlock=${selectedNetwork.contracts.startBlock}`,
);
export default createConfig({
// Use PostgreSQL if DATABASE_URL is set, otherwise use PGlite
database: process.env.DATABASE_URL ? {
kind: "postgres" as const,
connectionString: process.env.DATABASE_URL,
} : undefined,
chains: {
[NETWORK]: {
id: selectedNetwork.chainId,
rpc: selectedNetwork.rpc,
disableCache: selectedNetwork.disableCache,
},
},
contracts: {
Kraiken: {
abi: KraikenAbi.abi as Abi,
chain: NETWORK,
address: selectedNetwork.contracts.kraiken as `0x${string}`,
startBlock: selectedNetwork.contracts.startBlock,
},
Stake: {
abi: StakeAbi.abi as Abi,
chain: NETWORK,
address: selectedNetwork.contracts.stake as `0x${string}`,
startBlock: selectedNetwork.contracts.startBlock,
},
},
blocks: {
StatsBlock: {
chain: NETWORK,
interval: 1,
startBlock: selectedNetwork.contracts.startBlock,
},
},
});