This documentation is for versions 0.1 – 0.6. You may want to view the
latest version.
Config API
The ponder.config.ts file contains contract names, addresses, and ABIs; network information like chain IDs and RPC URLs; database configuration; and general options.
The createConfig function exported from @ponder/core returns the config object, which must be exported (named export called config) from ponder.config.ts.
File requirements
The createConfig function exported by @ponder/core returns a config object which must be the default export of ponder.config.ts. By default, ponder dev and start look for ponder.config.ts in the current working directory. You can use the --config-file CLI option to specify a different path.
import { createConfig } from "@ponder/core";
import { http } from "viem";
 
export default createConfig({
  networks: {
    // ...
  },
  contracts: {
    // ...
  },
});Networks
The networks field is an object where each key is a network name containing that network's configuration. Networks are Ethereum-based blockchains like Ethereum mainnet, Goerli, or Foundry's local Anvil node.
Most Ponder apps require a paid RPC provider plan to avoid rate-limiting.
| field | type | |
|---|---|---|
| name | string | A unique name for the blockchain. Must be unique across all networks. Provided as an object property name. | 
| chainId | number | The chain ID for the network. | 
| transport | viem.Transport | A Viem http, webSocket, or fallback Transport. | 
| pollingInterval | number | undefined | Default: 1_000. Frequency (in ms) used when polling for new events on this network. | 
| maxRequestsPerSecond | number | undefined | Default: 50. Maximum number of RPC requests per second. Can be reduced to work around rate limits. | 
| disableCache | boolean | undefined | Default: false. Disables the RPC request cache. Use when indexing a local node like Anvil. | 
import { createConfig } from "@ponder/core";
import { http } from "viem";
 
import { BlitmapAbi } from "./abis/Blitmap";
 
export default createConfig({
  networks: {
    mainnet: {
      chainId: 1,
      transport: http(process.env.PONDER_RPC_URL_1),
    },
  },
  contracts: {
    Blitmap: {
      abi: BlitmapAbi,
      network: "mainnet",
      address: "0x8d04a8c79cEB0889Bdd12acdF3Fa9D207eD3Ff63",
      startBlock: 12439123,
    },
  },
});Contracts
This is a low-level API reference. For an approachable overview & recipes, see the contracts & networks guide.
The contracts field is an object where each key is a contract name containing that contract's configuration. Ponder will sync & index contract data according to the options you provide.
| field | type | |
|---|---|---|
| name | string | A unique name for the smart contract. Must be unique across all contracts. Provided as an object property name. | 
| abi | abitype.Abi | The contract ABI as an array as const. Must be asserted as constant, see ABIType documentation for details. | 
| network | string | The name of the network this contract is deployed to. References the networks field. | 
| address | 0x{string} | 0x{string}[] | One more more contract addresses. Mutually exclusive with factory. | 
| factory | Factory? | Factory pattern configuration. Mutually exclusive with address. | 
| filter | Filter? | Event filter criteria. | 
| startBlock | number | undefined | Default: 0. Block number to start syncing events. Usually set to the contract deployment block number. Default: 0 | 
| endBlock | number | undefined | Default: undefined. Block number to stop syncing events. If this field is specified, the contract will not be indexed in realtime. This field can be used alongside startBlock to index a specific block range. | 
import { createConfig } from "@ponder/core";
import { http } from "viem";
 
import { BlitmapAbi } from "./abis/Blitmap";
 
export default createConfig({
  networks: {
    mainnet: {
      chainId: 1,
      transport: http(process.env.PONDER_RPC_URL_1),
    },
  },
  contracts: {
    Blitmap: {
      abi: BlitmapAbi,
      network: "mainnet",
      address: "0x8d04a8c79cEB0889Bdd12acdF3Fa9D207eD3Ff63",
      startBlock: 12439123,
    },
  },
});Factory
| field | type | |
|---|---|---|
| address | string | The address of the factory contract that creates instances of this contract. | 
| event | AbiEvent | The ABI item of the event that announces the creation of a new child contract. | 
| parameter | string | The name of the parameter within event that contains the address of the new child contract. | 
Filter
| field | type | |
|---|---|---|
| event | string | string[] | undefined | Default: undefined. One or more event names present in the provided ABI. | 
| args | object | undefined | Default: undefined. An object containing indexed argument values to filter for. Only allowed if one event name was provided in event. | 
Database
Here is the logic Ponder uses to determine which database to use:
- If the 
database.kindoption is specified, Ponder will use that database. - If the 
DATABASE_URLenvironment variable is defined, Ponder will use Postgres with that as the connection string. - If 
DATABASE_URLis not defined, Ponder will use SQLite. 
For more details, see the guide on production deployments.
SQLite
| field | type | |
|---|---|---|
| kind | "sqlite" | |
| directory | string | undefined | Default: .ponder/sqlite. Directory path to use for SQLite database files. | 
Example ponder.config.ts using SQLite
ponder.config.ts using SQLiteimport { createConfig } from "@ponder/core";
 
export default createConfig({
  database: {
    kind: "sqlite",
    directory: "./.ponder/sqlite2",
  },
  // ... more config
});Postgres
| field | type | |
|---|---|---|
| kind | "postgres" | |
| connectionString | string | undefined | Default: DATABASE_URL env var. Postgres database connection string. | 
| schema | string | undefined | Default: "public". Postgres schema to use for indexed data. | 
| poolConfig | PoolConfig | undefined | Default: { max: 30 }. Pool configuration passed to node-postgres. | 
Example ponder.config.ts using Postgres
ponder.config.ts using Postgresimport { createConfig } from "@ponder/core";
 
export default createConfig({
  database: {
    kind: "postgres",
    connectionString: "postgresql://user:password@localhost:5432/dbname",
    schema: "ponder_dev",
    poolConfig: {
      max: 100,
    },
  },
  // ... more config
});Examples
Basic example
import { createConfig } from "@ponder/core";
import { http } from "viem";
 
export default createConfig({
  networks: {
    mainnet: {
      chainId: 1,
      transport: http(process.env.PONDER_RPC_URL_1),
    },
  },
  contracts: {
    ArtGobblers: {
      network: "mainnet",
      abi: "./abis/ArtGobblers.json",
      address: "0x60bb1e2aa1c9acafb4d34f71585d7e959f387769",
      startBlock: 15863321,
    },
  },
});Using top-level await
import { createConfig } from "@ponder/core";
 
const startBlock = await fetch("http://...");
 
export default createConfig({
  networks: {
    mainnet: {
      chainId: 1,
      transport: http(process.env.PONDER_RPC_URL_1),
    },
  },
  contracts: {
    ArtGobblers: {
      network: "mainnet",
      abi: "./abis/ArtGobblers.json",
      address: "0x60bb1e2aa1c9acafb4d34f71585d7e959f387769",
      startBlock,
    },
  },
});