Skip to content

Commit 6927a97

Browse files
committed
Add initial schema + base mainnet
1 parent 0bc03bd commit 6927a97

File tree

4 files changed

+334
-3
lines changed

4 files changed

+334
-3
lines changed

crates/common/src/lib.rs

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,25 @@
1-
use serde::Deserialize;
1+
use serde::{Deserialize, Deserializer};
22
use serde_json;
33
use std::str::FromStr;
44

5+
/// Custom deserializer that lowercases address strings
6+
fn deserialize_address_lowercase<'de, D>(deserializer: D) -> Result<String, D::Error>
7+
where
8+
D: Deserializer<'de>,
9+
{
10+
let s = String::deserialize(deserializer)?;
11+
Ok(s.to_lowercase())
12+
}
13+
14+
/// Custom deserializer that lowercases optional address strings
15+
fn deserialize_optional_address_lowercase<'de, D>(deserializer: D) -> Result<Option<String>, D::Error>
16+
where
17+
D: Deserializer<'de>,
18+
{
19+
let opt = Option::<String>::deserialize(deserializer)?;
20+
Ok(opt.map(|s| s.to_lowercase()))
21+
}
22+
523
/// A chain name
624
#[derive(Debug, Clone, PartialEq, Copy)]
725
pub enum ChainName {
@@ -106,15 +124,18 @@ impl FromStr for Network {
106124
#[derive(Debug, Deserialize)]
107125
pub struct NetworkConfig {
108126
pub name: String,
127+
#[serde(deserialize_with = "deserialize_address_lowercase")]
109128
pub l1_contract: String,
110129
pub l1_contract_deployment_block: u64,
111130
pub block_delay: u64,
112131
pub poll_period_sec: u64,
113132
pub batch_size: Option<u64>,
133+
#[serde(deserialize_with = "deserialize_optional_address_lowercase")]
114134
pub dispute_game_factory_l1_contract: Option<String>,
115135
pub l1_dispute_game_contract_deployment_block: Option<u64>,
116136
pub transition_to_dispute_game_system_block: Option<u64>,
117137
pub transition_to_dispute_game_system_l2_block: Option<u64>,
138+
#[serde(deserialize_with = "deserialize_optional_address_lowercase")]
118139
pub trusted_proposer_address: Option<String>,
119140
}
120141

crates/monitor_events/networks/base_sepolia.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "base_sepolia",
33
"l1_contract": "0x84457ca9D0163FbC4bbfe4Dfbb20ba46e48DF254",
44
"block_delay": 20,
5-
"poll_period_sec": 10800,
5+
"poll_period_sec": 60,
66
"batch_size": 50000,
77
"l1_contract_deployment_block": 4370901,
88
"l1_dispute_game_contract_deployment_block": 6189927,

k8s/cicd-inputs.yaml

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,11 @@
1-
app_names: ["l2-indexer-micro-service","l2-indexer-worker-optimism-mainnet","l2-indexer-worker-optimism-sepolia","l2-indexer-worker-base-sepolia","l2-indexer-worker-world-chain-sepolia","l2-indexer-worker-ape-chain-sepolia","l2-indexer-worker-ape-chain-mainnet"]
1+
app_names:
2+
- "l2-indexer-micro-service"
3+
- "l2-indexer-worker-optimism-mainnet"
4+
- "l2-indexer-worker-optimism-sepolia"
5+
- "l2-indexer-worker-base-mainnet"
6+
- "l2-indexer-worker-base-sepolia"
7+
- "l2-indexer-worker-world-chain-sepolia"
8+
- "l2-indexer-worker-ape-chain-sepolia"
9+
- "l2-indexer-worker-ape-chain-mainnet"
210
version_file: ./Cargo.toml
311
namespace: l2-indexer

migrations/001_initial_schema.sql

Lines changed: 302 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,302 @@
1+
-- Migration: 001_initial_schema.sql
2+
-- Description: Initial database schema for L2 indexer
3+
-- Creates all tables for OPStack chains, Arbitrum chains, and fault dispute games
4+
5+
-- ============================================================================
6+
-- OPStack Tables (Optimism, Base, Zora, WorldChain)
7+
-- ============================================================================
8+
9+
-- Optimism Mainnet
10+
CREATE TABLE IF NOT EXISTS optimism_mainnet (
11+
id SERIAL PRIMARY KEY,
12+
l2_output_root VARCHAR NOT NULL,
13+
l2_output_index INTEGER NOT NULL,
14+
l2_block_number INTEGER NOT NULL,
15+
l1_timestamp INTEGER NOT NULL,
16+
l1_transaction_hash VARCHAR NOT NULL,
17+
l1_block_number INTEGER NOT NULL,
18+
l1_transaction_index INTEGER NOT NULL,
19+
l1_block_hash VARCHAR NOT NULL
20+
);
21+
22+
-- Optimism Sepolia
23+
CREATE TABLE IF NOT EXISTS optimism_sepolia (
24+
id SERIAL PRIMARY KEY,
25+
l2_output_root VARCHAR NOT NULL,
26+
l2_output_index INTEGER NOT NULL,
27+
l2_block_number INTEGER NOT NULL,
28+
l1_timestamp INTEGER NOT NULL,
29+
l1_transaction_hash VARCHAR NOT NULL,
30+
l1_block_number INTEGER NOT NULL,
31+
l1_transaction_index INTEGER NOT NULL,
32+
l1_block_hash VARCHAR NOT NULL
33+
);
34+
35+
-- Base Mainnet
36+
CREATE TABLE IF NOT EXISTS base_mainnet (
37+
id SERIAL PRIMARY KEY,
38+
l2_output_root VARCHAR NOT NULL,
39+
l2_output_index INTEGER NOT NULL,
40+
l2_block_number INTEGER NOT NULL,
41+
l1_timestamp INTEGER NOT NULL,
42+
l1_transaction_hash VARCHAR NOT NULL,
43+
l1_block_number INTEGER NOT NULL,
44+
l1_transaction_index INTEGER NOT NULL,
45+
l1_block_hash VARCHAR NOT NULL
46+
);
47+
48+
-- Base Sepolia
49+
CREATE TABLE IF NOT EXISTS base_sepolia (
50+
id SERIAL PRIMARY KEY,
51+
l2_output_root VARCHAR NOT NULL,
52+
l2_output_index INTEGER NOT NULL,
53+
l2_block_number INTEGER NOT NULL,
54+
l1_timestamp INTEGER NOT NULL,
55+
l1_transaction_hash VARCHAR NOT NULL,
56+
l1_block_number INTEGER NOT NULL,
57+
l1_transaction_index INTEGER NOT NULL,
58+
l1_block_hash VARCHAR NOT NULL
59+
);
60+
61+
-- Zora Mainnet
62+
CREATE TABLE IF NOT EXISTS zora_mainnet (
63+
id SERIAL PRIMARY KEY,
64+
l2_output_root VARCHAR NOT NULL,
65+
l2_output_index INTEGER NOT NULL,
66+
l2_block_number INTEGER NOT NULL,
67+
l1_timestamp INTEGER NOT NULL,
68+
l1_transaction_hash VARCHAR NOT NULL,
69+
l1_block_number INTEGER NOT NULL,
70+
l1_transaction_index INTEGER NOT NULL,
71+
l1_block_hash VARCHAR NOT NULL
72+
);
73+
74+
-- Zora Sepolia
75+
CREATE TABLE IF NOT EXISTS zora_sepolia (
76+
id SERIAL PRIMARY KEY,
77+
l2_output_root VARCHAR NOT NULL,
78+
l2_output_index INTEGER NOT NULL,
79+
l2_block_number INTEGER NOT NULL,
80+
l1_timestamp INTEGER NOT NULL,
81+
l1_transaction_hash VARCHAR NOT NULL,
82+
l1_block_number INTEGER NOT NULL,
83+
l1_transaction_index INTEGER NOT NULL,
84+
l1_block_hash VARCHAR NOT NULL
85+
);
86+
87+
-- World Chain Mainnet
88+
CREATE TABLE IF NOT EXISTS world_chain_mainnet (
89+
id SERIAL PRIMARY KEY,
90+
l2_output_root VARCHAR NOT NULL,
91+
l2_output_index INTEGER NOT NULL,
92+
l2_block_number INTEGER NOT NULL,
93+
l1_timestamp INTEGER NOT NULL,
94+
l1_transaction_hash VARCHAR NOT NULL,
95+
l1_block_number INTEGER NOT NULL,
96+
l1_transaction_index INTEGER NOT NULL,
97+
l1_block_hash VARCHAR NOT NULL
98+
);
99+
100+
-- World Chain Sepolia
101+
CREATE TABLE IF NOT EXISTS world_chain_sepolia (
102+
id SERIAL PRIMARY KEY,
103+
l2_output_root VARCHAR NOT NULL,
104+
l2_output_index INTEGER NOT NULL,
105+
l2_block_number INTEGER NOT NULL,
106+
l1_timestamp INTEGER NOT NULL,
107+
l1_transaction_hash VARCHAR NOT NULL,
108+
l1_block_number INTEGER NOT NULL,
109+
l1_transaction_index INTEGER NOT NULL,
110+
l1_block_hash VARCHAR NOT NULL
111+
);
112+
113+
-- ============================================================================
114+
-- Arbitrum Tables (Arbitrum, ApeChain)
115+
-- ============================================================================
116+
117+
-- Arbitrum Mainnet
118+
CREATE TABLE IF NOT EXISTS arbitrum_mainnet (
119+
id SERIAL PRIMARY KEY,
120+
l2_output_root VARCHAR NOT NULL,
121+
l2_block_hash VARCHAR NOT NULL,
122+
l2_block_number INTEGER NOT NULL,
123+
l1_transaction_hash VARCHAR NOT NULL,
124+
l1_block_number INTEGER NOT NULL,
125+
l1_transaction_index INTEGER NOT NULL,
126+
l1_block_hash VARCHAR NOT NULL
127+
);
128+
129+
-- Arbitrum Sepolia
130+
CREATE TABLE IF NOT EXISTS arbitrum_sepolia (
131+
id SERIAL PRIMARY KEY,
132+
l2_output_root VARCHAR NOT NULL,
133+
l2_block_hash VARCHAR NOT NULL,
134+
l2_block_number INTEGER NOT NULL,
135+
l1_transaction_hash VARCHAR NOT NULL,
136+
l1_block_number INTEGER NOT NULL,
137+
l1_transaction_index INTEGER NOT NULL,
138+
l1_block_hash VARCHAR NOT NULL
139+
);
140+
141+
-- Ape Chain Mainnet
142+
CREATE TABLE IF NOT EXISTS ape_chain_mainnet (
143+
id SERIAL PRIMARY KEY,
144+
l2_output_root VARCHAR NOT NULL,
145+
l2_block_hash VARCHAR NOT NULL,
146+
l2_block_number INTEGER NOT NULL,
147+
l1_transaction_hash VARCHAR NOT NULL,
148+
l1_block_number INTEGER NOT NULL,
149+
l1_transaction_index INTEGER NOT NULL,
150+
l1_block_hash VARCHAR NOT NULL
151+
);
152+
153+
-- Ape Chain Sepolia
154+
CREATE TABLE IF NOT EXISTS ape_chain_sepolia (
155+
id SERIAL PRIMARY KEY,
156+
l2_output_root VARCHAR NOT NULL,
157+
l2_block_hash VARCHAR NOT NULL,
158+
l2_block_number INTEGER NOT NULL,
159+
l1_transaction_hash VARCHAR NOT NULL,
160+
l1_block_number INTEGER NOT NULL,
161+
l1_transaction_index INTEGER NOT NULL,
162+
l1_block_hash VARCHAR NOT NULL
163+
);
164+
165+
-- ============================================================================
166+
-- Fault Dispute Games Tables (Optimism & Base Mainnet & Sepolia)
167+
-- ============================================================================
168+
169+
-- Optimism Mainnet Fault Dispute Games
170+
CREATE TABLE IF NOT EXISTS optimism_mainnet_fault_dispute_games (
171+
id SERIAL PRIMARY KEY,
172+
game_index BIGINT NOT NULL,
173+
game_address VARCHAR NOT NULL,
174+
game_type BIGINT NOT NULL,
175+
timestamp BIGINT NOT NULL,
176+
root_claim VARCHAR NOT NULL,
177+
game_state BIGINT NOT NULL,
178+
proposer_address VARCHAR NOT NULL,
179+
l2_block_number BIGINT NOT NULL,
180+
l2_state_root VARCHAR,
181+
l2_withdrawal_storage_root VARCHAR,
182+
l2_block_hash VARCHAR,
183+
l1_timestamp BIGINT NOT NULL,
184+
l1_transaction_hash VARCHAR NOT NULL,
185+
l1_block_number BIGINT NOT NULL,
186+
l1_transaction_index BIGINT NOT NULL,
187+
l1_block_hash VARCHAR NOT NULL
188+
);
189+
190+
-- Optimism Sepolia Fault Dispute Games
191+
CREATE TABLE IF NOT EXISTS optimism_sepolia_fault_dispute_games (
192+
id SERIAL PRIMARY KEY,
193+
game_index BIGINT NOT NULL,
194+
game_address VARCHAR NOT NULL,
195+
game_type BIGINT NOT NULL,
196+
timestamp BIGINT NOT NULL,
197+
root_claim VARCHAR NOT NULL,
198+
game_state BIGINT NOT NULL,
199+
proposer_address VARCHAR NOT NULL,
200+
l2_block_number BIGINT NOT NULL,
201+
l2_state_root VARCHAR,
202+
l2_withdrawal_storage_root VARCHAR,
203+
l2_block_hash VARCHAR,
204+
l1_timestamp BIGINT NOT NULL,
205+
l1_transaction_hash VARCHAR NOT NULL,
206+
l1_block_number BIGINT NOT NULL,
207+
l1_transaction_index BIGINT NOT NULL,
208+
l1_block_hash VARCHAR NOT NULL
209+
);
210+
211+
-- Base Mainnet Fault Dispute Games
212+
CREATE TABLE IF NOT EXISTS base_mainnet_fault_dispute_games (
213+
id SERIAL PRIMARY KEY,
214+
game_index BIGINT NOT NULL,
215+
game_address VARCHAR NOT NULL,
216+
game_type BIGINT NOT NULL,
217+
timestamp BIGINT NOT NULL,
218+
root_claim VARCHAR NOT NULL,
219+
game_state BIGINT NOT NULL,
220+
proposer_address VARCHAR NOT NULL,
221+
l2_block_number BIGINT NOT NULL,
222+
l2_state_root VARCHAR,
223+
l2_withdrawal_storage_root VARCHAR,
224+
l2_block_hash VARCHAR,
225+
l1_timestamp BIGINT NOT NULL,
226+
l1_transaction_hash VARCHAR NOT NULL,
227+
l1_block_number BIGINT NOT NULL,
228+
l1_transaction_index BIGINT NOT NULL,
229+
l1_block_hash VARCHAR NOT NULL
230+
);
231+
232+
-- Base Sepolia Fault Dispute Games
233+
CREATE TABLE IF NOT EXISTS base_sepolia_fault_dispute_games (
234+
id SERIAL PRIMARY KEY,
235+
game_index BIGINT NOT NULL,
236+
game_address VARCHAR NOT NULL,
237+
game_type BIGINT NOT NULL,
238+
timestamp BIGINT NOT NULL,
239+
root_claim VARCHAR NOT NULL,
240+
game_state BIGINT NOT NULL,
241+
proposer_address VARCHAR NOT NULL,
242+
l2_block_number BIGINT NOT NULL,
243+
l2_state_root VARCHAR,
244+
l2_withdrawal_storage_root VARCHAR,
245+
l2_block_hash VARCHAR,
246+
l1_timestamp BIGINT NOT NULL,
247+
l1_transaction_hash VARCHAR NOT NULL,
248+
l1_block_number BIGINT NOT NULL,
249+
l1_transaction_index BIGINT NOT NULL,
250+
l1_block_hash VARCHAR NOT NULL
251+
);
252+
253+
-- ============================================================================
254+
-- Indexes for better query performance
255+
-- ============================================================================
256+
257+
-- Indexes on l1_block_number for all OPStack tables
258+
CREATE INDEX IF NOT EXISTS idx_optimism_mainnet_l1_block_number ON optimism_mainnet(l1_block_number);
259+
CREATE INDEX IF NOT EXISTS idx_optimism_sepolia_l1_block_number ON optimism_sepolia(l1_block_number);
260+
CREATE INDEX IF NOT EXISTS idx_base_mainnet_l1_block_number ON base_mainnet(l1_block_number);
261+
CREATE INDEX IF NOT EXISTS idx_base_sepolia_l1_block_number ON base_sepolia(l1_block_number);
262+
CREATE INDEX IF NOT EXISTS idx_zora_mainnet_l1_block_number ON zora_mainnet(l1_block_number);
263+
CREATE INDEX IF NOT EXISTS idx_zora_sepolia_l1_block_number ON zora_sepolia(l1_block_number);
264+
CREATE INDEX IF NOT EXISTS idx_world_chain_mainnet_l1_block_number ON world_chain_mainnet(l1_block_number);
265+
CREATE INDEX IF NOT EXISTS idx_world_chain_sepolia_l1_block_number ON world_chain_sepolia(l1_block_number);
266+
267+
-- Indexes on l1_block_number for all Arbitrum tables
268+
CREATE INDEX IF NOT EXISTS idx_arbitrum_mainnet_l1_block_number ON arbitrum_mainnet(l1_block_number);
269+
CREATE INDEX IF NOT EXISTS idx_arbitrum_sepolia_l1_block_number ON arbitrum_sepolia(l1_block_number);
270+
CREATE INDEX IF NOT EXISTS idx_ape_chain_mainnet_l1_block_number ON ape_chain_mainnet(l1_block_number);
271+
CREATE INDEX IF NOT EXISTS idx_ape_chain_sepolia_l1_block_number ON ape_chain_sepolia(l1_block_number);
272+
273+
-- Indexes on l1_block_number for fault dispute games tables
274+
CREATE INDEX IF NOT EXISTS idx_optimism_mainnet_fdg_l1_block_number ON optimism_mainnet_fault_dispute_games(l1_block_number);
275+
CREATE INDEX IF NOT EXISTS idx_optimism_sepolia_fdg_l1_block_number ON optimism_sepolia_fault_dispute_games(l1_block_number);
276+
CREATE INDEX IF NOT EXISTS idx_base_mainnet_fdg_l1_block_number ON base_mainnet_fault_dispute_games(l1_block_number);
277+
CREATE INDEX IF NOT EXISTS idx_base_sepolia_fdg_l1_block_number ON base_sepolia_fault_dispute_games(l1_block_number);
278+
279+
-- Indexes on l2_block_number for all tables
280+
CREATE INDEX IF NOT EXISTS idx_optimism_mainnet_l2_block_number ON optimism_mainnet(l2_block_number);
281+
CREATE INDEX IF NOT EXISTS idx_optimism_sepolia_l2_block_number ON optimism_sepolia(l2_block_number);
282+
CREATE INDEX IF NOT EXISTS idx_base_mainnet_l2_block_number ON base_mainnet(l2_block_number);
283+
CREATE INDEX IF NOT EXISTS idx_base_sepolia_l2_block_number ON base_sepolia(l2_block_number);
284+
CREATE INDEX IF NOT EXISTS idx_zora_mainnet_l2_block_number ON zora_mainnet(l2_block_number);
285+
CREATE INDEX IF NOT EXISTS idx_zora_sepolia_l2_block_number ON zora_sepolia(l2_block_number);
286+
CREATE INDEX IF NOT EXISTS idx_world_chain_mainnet_l2_block_number ON world_chain_mainnet(l2_block_number);
287+
CREATE INDEX IF NOT EXISTS idx_world_chain_sepolia_l2_block_number ON world_chain_sepolia(l2_block_number);
288+
CREATE INDEX IF NOT EXISTS idx_arbitrum_mainnet_l2_block_number ON arbitrum_mainnet(l2_block_number);
289+
CREATE INDEX IF NOT EXISTS idx_arbitrum_sepolia_l2_block_number ON arbitrum_sepolia(l2_block_number);
290+
CREATE INDEX IF NOT EXISTS idx_ape_chain_mainnet_l2_block_number ON ape_chain_mainnet(l2_block_number);
291+
CREATE INDEX IF NOT EXISTS idx_ape_chain_sepolia_l2_block_number ON ape_chain_sepolia(l2_block_number);
292+
CREATE INDEX IF NOT EXISTS idx_optimism_mainnet_fdg_l2_block_number ON optimism_mainnet_fault_dispute_games(l2_block_number);
293+
CREATE INDEX IF NOT EXISTS idx_optimism_sepolia_fdg_l2_block_number ON optimism_sepolia_fault_dispute_games(l2_block_number);
294+
CREATE INDEX IF NOT EXISTS idx_base_mainnet_fdg_l2_block_number ON base_mainnet_fault_dispute_games(l2_block_number);
295+
CREATE INDEX IF NOT EXISTS idx_base_sepolia_fdg_l2_block_number ON base_sepolia_fault_dispute_games(l2_block_number);
296+
297+
-- Index on game_index for fault dispute games tables
298+
CREATE INDEX IF NOT EXISTS idx_optimism_mainnet_fdg_game_index ON optimism_mainnet_fault_dispute_games(game_index);
299+
CREATE INDEX IF NOT EXISTS idx_optimism_sepolia_fdg_game_index ON optimism_sepolia_fault_dispute_games(game_index);
300+
CREATE INDEX IF NOT EXISTS idx_base_mainnet_fdg_game_index ON base_mainnet_fault_dispute_games(game_index);
301+
CREATE INDEX IF NOT EXISTS idx_base_sepolia_fdg_game_index ON base_sepolia_fault_dispute_games(game_index);
302+

0 commit comments

Comments
 (0)