Skip to main content

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:


๐Ÿš€ 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:โ€‹

  1. Download PostgreSQL:

  2. 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:

  1. Buka MetaMask
  2. Klik dropdown network โ†’ "Add network"
  3. Klik "Add a network manually"
  4. Isi detail di atas
  5. 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:

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 SolidityTipe Schema PonderContoh
addresst.hex()0x123...
uint256t.bigint()1000000000000000000n
uint8/16/32t.integer()100
boolt.boolean()true
stringt.text()"Hello"
bytes32t.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 ponder sukses)
  • โœ… Database ter-konfigurasi (PGlite atau PostgreSQL)
  • โœ… Lisk Sepolia ditambahkan ke MetaMask
  • โœ… Dapat testnet ETH dari faucet
  • โœ… File .env.local ter-create
  • โœ… ponder.config.ts ter-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:

  1. Deploy contract ERC-20 ke Lisk Sepolia (atau gunakan yang sudah ada)
  2. Configure contract di Ponder
  3. Tulis schema untuk data token
  4. Buat fungsi indexing untuk handle events
  5. Query data via GraphQL!

๐Ÿ“– Bagian 3: Indexing SimpleDEX Contract โ†’


Sampai jumpa di Bagian 3! Saatnya bangun sesuatu yang keren! ๐Ÿ”ฅ