Bagian 2: Setup & Konfigurasi Ponder
๐ฏ Tujuan Bagian Iniโ
Setelah menyelesaikan bagian ini, Anda akan:
- โ Install framework Ponder di komputer
- โ Setup database (PostgreSQL atau PGlite)
- โ Konfigurasi network Lisk Sepolia
- โ Membuat proyek Ponder pertama
- โ Memahami struktur proyek Ponder
- โ Siap untuk mulai indexing!
๐ Cek Prasyaratโ
Sebelum mulai, pastikan sudah punya:
# 1. Node.js v18 atau lebih baru
node --version
# Output: v18.0.0 atau lebih tinggi โ
# 2. pnpm (direkomendasikan) atau npm/yarn
pnpm --version
# Output: 8.0.0 atau lebih tinggi โ
# 3. Git
git --version
# Output: git version 2.x.x โ
Belum punya? Install dulu:
- Node.js: https://nodejs.org (pilih versi LTS)
- pnpm:
npm install -g pnpm(lebih cepat dari npm!) - Git: https://git-scm.com
๐ Langkah 1: Membuat Proyek Ponderโ
Opsi A: Menggunakan create-ponder (Direkomendasikan!)โ
Cara tercepat untuk memulai:
# Buat directory untuk workshop
mkdir ponder-workshop
cd ponder-workshop
# Buat proyek Ponder
pnpm create ponder
Prompts & Pilihan:โ
โ What's the name of your project?
โบ lisk-token-explorer
โ Which template would you like to use?
โบ Default # <-- Pilih Default, kita akan setup sendiri untuk SimpleDEX!
โ Installed packages with pnpm.
โ Initialized git repository.
Success! Created lisk-token-explorer at /path/to/lisk-token-explorer
Get started:
cd lisk-token-explorer
pnpm dev
Penjelasan Opsi Template:
- Default โญ - Pilih ini! Kita akan setup sendiri untuk indexing SimpleDEX dari Sesi 7
- ERC-20 example - Contoh indexing ERC-20 (tidak kita pakai)
- Etherscan template - Import dari contract address Etherscan
- Subgraph template - Migrasi dari subgraph The Graph
Opsi B: Setup Manual (Kalau Opsi A Gagal)โ
# Buat directory
mkdir lisk-token-explorer
cd lisk-token-explorer
# Initialize proyek npm
pnpm init
# Install Ponder
pnpm add ponder viem
# Buat struktur file dasar
mkdir src
touch ponder.config.ts ponder.schema.ts src/index.ts
๐ Langkah 2: Memahami Struktur Proyekโ
Setelah buat proyek, struktur foldernya seperti ini:
lisk-token-explorer/
โโโ abis/ # File ABI
โ โโโ ExampleContractAbi.ts # ABI contract dalam bentuk typescript
โโโ src/ # Fungsi indexing (kode Anda!)
โ โโโ index.ts # Logika indexing utama
โโโ ponder.config.ts # Config: networks & contracts
โโโ ponder.schema.ts # Schema: tabel database
โโโ package.json # Dependencies
โโโ tsconfig.json # Konfigurasi TypeScript
โโโ .env.local # Environment variables (buat ini!)
โโโ .gitignore # Git ignore
Penjelasan Setiap File:โ
1. ponder.config.ts - Konfigurasi Network & Contractโ
import { createConfig } from "ponder";
import { http } from "viem";
import { ERC20Abi } from "./abis/ERC20Abi";
export default createConfig({
// Definisikan network blockchain
chains: {
mainnet: {
id: 1,
rpc: http(process.env.PONDER_RPC_URL_1),
},
},
// Definisikan contracts yang akan di-index
contracts: {
Token: {
chain: "mainnet",
address: process.env.USDC_TOKEN_ADDRESS as `0x${string}`,
abi: ERC20Abi,
startBlock: 13142655,
},
},
});
2. ponder.schema.ts - Schema Databaseโ
import { onchainTable } from "ponder";
// Definisikan tabel database
export const account = onchainTable("account", (t) => ({
address: t.hex().primaryKey(),
balance: t.bigint().notNull(),
}));
3. src/index.ts - Fungsi Indexingโ
import { ponder } from "ponder:registry";
import { account } from "ponder:schema";
// Handle event blockchain
ponder.on("Token:Transfer", async ({ event, context }) => {
// Transform & simpan data
});
๐๏ธ Langkah 3: Setup Databaseโ
Ponder butuh database untuk menyimpan data ter-index. Ada 2 opsi:
Opsi A: PGlite (Direkomendasikan untuk Workshop!)โ
PGlite = In-memory Postgres, super mudah, tanpa instalasi!
# Install PGlite
pnpm add @electric-sql/pglite
Konfigurasi - Edit ponder.config.ts:
import { createConfig } from "ponder";
import { http } from "viem";
export default createConfig({
database: {
kind: "pglite",
// Data disimpan di .ponder/sqlite
},
// ... sisa config
});
Kelebihan:
- โ Tanpa instalasi!
- โ Sempurna untuk development
- โ Setup cepat
Kekurangan:
- โ ๏ธ Data hilang saat restart (kecuali configure persistence)
- โ ๏ธ Tidak untuk production
Opsi B: PostgreSQL (Production-Ready)โ
Untuk production atau data persisten:
Instalasi Windows:โ
-
Download PostgreSQL:
- Kunjungi: https://www.postgresql.org/download/windows/
- Download installer (versi 14+)
- Jalankan installer, set password untuk user
postgres
-
Buat Database:
# Buka Command Prompt atau PowerShell
psql -U postgres
# Di prompt PostgreSQL:
CREATE DATABASE ponder_dev;
\q
Instalasi Mac:โ
# Install via Homebrew
brew install postgresql@14
# Start service PostgreSQL
brew services start postgresql@14
# Buat database
createdb ponder_dev
Instalasi Linux:โ
# Ubuntu/Debian
sudo apt update
sudo apt install postgresql postgresql-contrib
# Start service
sudo systemctl start postgresql
# Buat database
sudo -u postgres createdb ponder_dev
Konfigurasi - .env.local:โ
# Buat file .env.local
DATABASE_URL="postgresql://postgres:password@localhost:5432/ponder_dev"
Update ponder.config.ts:
export default createConfig({
database: {
kind: "postgres",
connectionString: process.env.DATABASE_URL,
},
// ... sisa config
});
๐ Langkah 4: Konfigurasi Network Lisk Sepoliaโ
Tambahkan Lisk Sepolia ke MetaMask:โ
Detail Network:
Nama Network: Lisk Sepolia Testnet
RPC URL: https://rpc.sepolia-api.lisk.com
Chain ID: 4202
Simbol Currency: ETH
Block Explorer: https://sepolia-blockscout.lisk.com
Langkah-langkah:
- Buka MetaMask
- Klik dropdown network โ "Add network"
- Klik "Add a network manually"
- Isi detail di atas
- Klik "Save"
Dapatkan Testnet ETH:โ
Faucet: https://sepolia-faucet.lisk.com
Langkah:
1. Koneksikan wallet
2. Request 0.05 ETH
3. Tunggu ~30 detik
4. Cek balance di MetaMask โ
Update Konfigurasi Ponder untuk Lisk Sepolia:โ
Edit ponder.config.ts:
import { createConfig } from "ponder";
import { http } from "viem";
export default createConfig({
database: {
kind: "pglite", // atau "postgres"
},
chains: {
// Tambahkan network Lisk Sepolia
liskSepolia: {
id: 4202,
rpc: http("https://rpc.sepolia-api.lisk.com"),
},
},
contracts: {
// Kita akan tambahkan konfigurasi contract di Bagian 3!
},
});
Tips Pro: Untuk production, pakai provider RPC seperti Alchemy/Infura:
transport: http(process.env.PONDER_RPC_URL_4202),
Lalu di .env.local:
PONDER_RPC_URL_4202="https://lisk-sepolia.g.alchemy.com/v2/YOUR_API_KEY"
๐ Langkah 5: Buat Environment Variablesโ
Buat file .env.local di root proyek:
# .env.local
# Database (jika pakai PostgreSQL)
DATABASE_URL="postgresql://postgres:password@localhost:5432/ponder_dev"
# RPC URLs (opsional tapi direkomendasikan)
PONDER_RPC_URL_4202="https://rpc.sepolia-api.lisk.com"
# Telemetry (opsional)
PONDER_TELEMETRY_DISABLED="true"
Tambahkan ke .gitignore:
# .gitignore
.env.local
.ponder/
node_modules/
โ Langkah 6: Verifikasi Setupโ
Test 1: Cek Dependenciesโ
pnpm install
Output harus tanpa error โ
Test 2: Cek TypeScriptโ
pnpm tsc --noEmit
Jika ada error, perbaiki dulu!
Test 3: Start Dev Server (Akan fail, it's OK!)โ
pnpm dev
Output yang Diharapkan:
โ Watching for file changes in /path/to/project
โ Starting build...
โ Build completed in 234 ms
12:00:00.000 INFO Connected to database type=pglite
12:00:00.100 WARN No contracts specified in ponder.config.ts
Server listening at http://localhost:42069
Catatan: Server akan start tapi belum ada indexing karena belum ada konfigurasi contract. Kita akan tambahkan di Bagian 3!
Tekan Ctrl+C untuk stop server.
๐งช Langkah 7: Eksplorasi Dev Server Ponderโ
Start lagi dev server:
pnpm dev
Buka GraphQL Playground:โ
URL: http://localhost:42069/graphql
Seharusnya buka di browser dan lihat interface GraphQL playground:

Belum ada data atau schema karena belum configure contract, tapi UI-nya sudah jalan! โ
๐ Langkah 8: Memahami Dev Tools Ponderโ
Ponder menyediakan beberapa endpoints saat development:
1. GraphQL API (Port 42069)โ
http://localhost:42069/graphql
- Eksplorasi schema
- Test queries
- Lihat dokumentasi
2. Health Checkโ
http://localhost:42069/health
Response:
{ "status": "healthy" }
3. Metrics (Prometheus)โ
http://localhost:42069/metrics
- Track progress sync
- Monitor performa
๐ Deep Dive: Konfigurasi Ponderโ
Memahami ponder.config.ts:โ
import { createConfig } from "ponder";
import { http } from "viem";
import { ERC20Abi } from "./abis/ERC20Abi";
export default createConfig({
// Konfigurasi database
database: {
kind: "pglite", // atau "postgres"
},
// Network blockchain
chains: {
liskSepolia: {
id: 4202,
rpc: http("https://rpc.sepolia-api.lisk.com"),
// Opsional: Interval polling (default: 4000ms)
pollingInterval: 4_000,
// Opsional: Max request per detik (rate limiting)
maxRequestsPerSecond: 50,
},
},
// Smart contracts untuk di-index
contracts: {
Token: {
chain: "liskSepolia",
address: process.env.USDC_TOKEN_ADDRESS as `0x${string}`,
abi: ERC20Abi,
startBlock: 13142655,
// Opsional: End block
endBlock: 1000000,
// Opsional: Max block range per request
maxBlockRange: 10000,
},
},
});
Best Practices Konfigurasi:โ
1. Gunakan Environment Variables:โ
networks: {
liskSepolia: {
transport: http(process.env.PONDER_RPC_URL_4202 || "default_url"),
},
}
2. Set Start Block yang Tepat:โ
contracts: {
MyToken: {
startBlock: 123456, // Block saat contract di-deploy
// Jangan mulai dari 0 kecuali perlu!
},
}
3. Rate Limiting:โ
networks: {
liskSepolia: {
maxRequestsPerSecond: 50, // Jangan overwhelm RPC
},
}
๐ฏ Memahami Schema Ponderโ
Tipe Schema di ponder.schema.ts:โ
import { onchainTable, index } from "ponder";
export const myTable = onchainTable("my_table", (t) => ({
// Tipe kolom:
id: t.text().primaryKey(), // Primary key
address: t.hex().notNull(), // Address Ethereum
amount: t.bigint().notNull(), // Angka besar (uint256)
count: t.integer().default(0), // Angka biasa
name: t.text(), // String
isActive: t.boolean().notNull(), // True/false
timestamp: t.integer().notNull(), // Unix timestamp
// Relationships (akan dibahas nanti!)
}));
// Opsional: Tambahkan indexes untuk performa
export const myTableAddressIndex = index("my_table")
.on("address");
Mapping Tipe Kolom:โ
| Tipe Solidity | Tipe Schema Ponder | Contoh |
|---|---|---|
address | t.hex() | 0x123... |
uint256 | t.bigint() | 1000000000000000000n |
uint8/16/32 | t.integer() | 100 |
bool | t.boolean() | true |
string | t.text() | "Hello" |
bytes32 | t.hex() | 0xabc... |
๐งช Testing Setup Andaโ
Buat Test Schema:โ
Edit ponder.schema.ts:
import { onchainTable } from "ponder";
export const testTable = onchainTable("test_table", (t) => ({
id: t.text().primaryKey(),
message: t.text().notNull(),
createdAt: t.integer().notNull(),
}));
Start Dev Server:โ
pnpm dev
Cek Logs:
12:00:00.000 INFO Connected to database type=pglite
12:00:00.100 INFO Created database tables count=1 tables=["test_table"]
12:00:00.200 INFO Created HTTP server port=42069
Tabel ter-create! โ
Query di GraphQL:โ
Buka http://localhost:42069/graphql dan coba:
query {
testTables {
items {
id
message
createdAt
}
}
}
Hasil (kosong, it's OK!):
{
"data": {
"testTables": {
"items": []
}
}
}
๐ Masalah Umum & Solusiโ
Masalah 1: pnpm command not foundโ
Solusi:
npm install -g pnpm
Masalah 2: Cannot connect to databaseโ
Untuk PGlite:
- Pastikan sudah install:
pnpm add @electric-sql/pglite - Cek config:
database: { kind: "pglite" }
Untuk PostgreSQL:
- Cek service running:
pg_ctl status - Verifikasi connection string di
.env.local - Test koneksi:
psql postgresql://postgres:password@localhost:5432/ponder_dev
Masalah 3: Error TypeScriptโ
Solusi:
# Regenerate types
pnpm ponder codegen
# Cek TypeScript
pnpm tsc --noEmit
Masalah 4: Port 42069 sudah digunakanโ
Solusi:
# Kill process di port
# Mac/Linux:
lsof -ti:42069 | xargs kill -9
# Windows:
netstat -ano | findstr :42069
taskkill /PID <PID> /F
Atau ubah port di ponder.config.ts:
export default createConfig({
server: {
port: 3000, // Gunakan port berbeda
},
// ...
});
Masalah 5: Hot reload tidak bekerjaโ
Solusi:
# Restart dev server
# Ctrl+C lalu:
pnpm dev
Masalah 6: Error RPCโ
Error: Too Many Requests
Solusi:
- Gunakan rate limiting:
maxRequestsPerSecond: 10 - Gunakan provider RPC berbayar (Alchemy, Infura)
- Tingkatkan
pollingInterval
โ Checklist Setupโ
Sebelum lanjut ke Bagian 3, verify semua ini:
- โ
Node.js v18+ ter-install (
node --version) - โ
pnpm ter-install (
pnpm --version) - โ
Proyek ter-create (
pnpm create pondersukses) - โ Database ter-konfigurasi (PGlite atau PostgreSQL)
- โ Lisk Sepolia ditambahkan ke MetaMask
- โ Dapat testnet ETH dari faucet
- โ
File
.env.localter-create - โ
ponder.config.tster-konfigurasi dengan Lisk Sepolia - โ
Dev server start sukses (
pnpm dev) - โ GraphQL playground dapat diakses (http://localhost:42069/graphql)
- โ Test schema ter-create & tabel ter-generate
Semua โ ? Mantap! Anda siap untuk indexing! ๐
๐ฏ Referensi Cepat Commandsโ
# Buat proyek Ponder baru
pnpm create ponder
# Install dependencies
pnpm install
# Start development server (dengan hot reload!)
pnpm dev
# Build untuk production
pnpm build
# Start production server
pnpm start
# Generate types
pnpm ponder codegen
# Clear cache & restart
rm -rf .ponder/cache && pnpm dev
๐ Sumber Daya Tambahanโ
Dokumentasi:
Tutorial Video:
- Cari: "Ponder setup tutorial"
- Workshop ETHGlobal
Komunitas:
๐ Langkah Selanjutnyaโ
Setup selesai! ๐
Di Bagian 3, kita akan:
- Deploy contract ERC-20 ke Lisk Sepolia (atau gunakan yang sudah ada)
- Configure contract di Ponder
- Tulis schema untuk data token
- Buat fungsi indexing untuk handle events
- Query data via GraphQL!
๐ Bagian 3: Indexing SimpleDEX Contract โ
Sampai jumpa di Bagian 3! Saatnya bangun sesuatu yang keren! ๐ฅ