Skip to content

Commit b6d1d75

Browse files
committed
feat: add postgres migrations for validator-tagger
1 parent 16e3d4d commit b6d1d75

File tree

1 file changed

+140
-0
lines changed

1 file changed

+140
-0
lines changed
Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
-- +goose Up
2+
-- +goose StatementBegin
3+
-- Validator entities master tables
4+
CREATE TABLE IF NOT EXISTS validator_entities (
5+
publickey BYTEA PRIMARY KEY,
6+
entity TEXT,
7+
sub_entity TEXT
8+
);
9+
10+
CREATE INDEX IF NOT EXISTS idx_validator_entities_entity ON validator_entities (entity);
11+
CREATE INDEX IF NOT EXISTS idx_validator_entities_sub_entity ON validator_entities (sub_entity);
12+
13+
CREATE TABLE IF NOT EXISTS validator_entities_data_periods (
14+
entity TEXT NOT NULL,
15+
sub_entity TEXT NOT NULL,
16+
period TEXT NOT NULL,
17+
last_updated_at TIMESTAMPTZ NOT NULL,
18+
19+
balance_end_sum_gwei BIGINT NOT NULL,
20+
21+
efficiency_dividend BIGINT NOT NULL,
22+
efficiency_divisor BIGINT NOT NULL,
23+
efficiency DOUBLE PRECISION NOT NULL,
24+
roi_dividend NUMERIC NOT NULL,
25+
roi_divisor NUMERIC NOT NULL,
26+
attestation_efficiency DOUBLE PRECISION NOT NULL,
27+
proposal_efficiency DOUBLE PRECISION NOT NULL,
28+
sync_committee_efficiency DOUBLE PRECISION NOT NULL,
29+
30+
attestations_scheduled_sum BIGINT NOT NULL,
31+
attestations_observed_sum BIGINT NOT NULL,
32+
attestations_head_executed_sum BIGINT NOT NULL,
33+
attestations_source_executed_sum BIGINT NOT NULL,
34+
attestations_target_executed_sum BIGINT NOT NULL,
35+
attestations_missed_rewards_sum BIGINT NOT NULL,
36+
attestations_reward_rewards_only_sum BIGINT NOT NULL,
37+
38+
blocks_scheduled_sum BIGINT NOT NULL,
39+
blocks_proposed_sum BIGINT NOT NULL,
40+
41+
sync_scheduled_sum BIGINT NOT NULL,
42+
sync_executed_sum BIGINT NOT NULL,
43+
44+
slashed_in_period_max BIGINT NOT NULL,
45+
slashed_amount_sum BIGINT NOT NULL,
46+
47+
blocks_cl_missed_median_reward_sum BIGINT NOT NULL,
48+
sync_localized_max_reward_sum BIGINT NOT NULL,
49+
sync_reward_rewards_only_sum BIGINT NOT NULL,
50+
inclusion_delay_sum BIGINT NOT NULL,
51+
52+
-- total execution layer rewards over range (wei)
53+
execution_rewards_sum_wei NUMERIC NOT NULL DEFAULT 0,
54+
55+
efficiency_time_bucket_timestamps_sec BIGINT[] NOT NULL,
56+
efficiency_time_bucket_values DOUBLE PRECISION[] NOT NULL,
57+
58+
net_share DOUBLE PRECISION NOT NULL,
59+
status_counts JSONB NOT NULL,
60+
61+
PRIMARY KEY (entity, sub_entity, period)
62+
);
63+
64+
CREATE INDEX IF NOT EXISTS idx_validator_entities_data_periods_entity ON validator_entities_data_periods (entity);
65+
CREATE INDEX IF NOT EXISTS idx_validator_entities_data_periods_sub_entity ON validator_entities_data_periods (sub_entity);
66+
CREATE INDEX IF NOT EXISTS idx_validator_entities_data_periods_period ON validator_entities_data_periods (period);
67+
68+
-- Lido: Node operators metadata
69+
CREATE TABLE IF NOT EXISTS lido_node_operators (
70+
operator_id BIGINT PRIMARY KEY,
71+
active BOOLEAN NOT NULL,
72+
name TEXT NOT NULL,
73+
reward_address BYTEA NOT NULL,
74+
total_vetted_validators BIGINT NOT NULL,
75+
total_exited_validators BIGINT NOT NULL,
76+
total_added_validators BIGINT NOT NULL,
77+
total_deposited_validators BIGINT NOT NULL,
78+
signing_key_count BIGINT NOT NULL DEFAULT 0
79+
);
80+
CREATE INDEX IF NOT EXISTS idx_lido_node_operators_active ON lido_node_operators (active);
81+
CREATE INDEX IF NOT EXISTS idx_lido_node_operators_name ON lido_node_operators (name);
82+
CREATE INDEX IF NOT EXISTS idx_lido_node_operators_reward_address ON lido_node_operators (reward_address);
83+
84+
-- Lido: Signing keys per operator
85+
CREATE TABLE IF NOT EXISTS lido_signing_keys (
86+
operator_id BIGINT NOT NULL REFERENCES lido_node_operators(operator_id) ON DELETE CASCADE,
87+
pubkey BYTEA NOT NULL,
88+
PRIMARY KEY (operator_id, pubkey)
89+
);
90+
CREATE INDEX IF NOT EXISTS idx_lido_signing_keys_operator_id ON lido_signing_keys (operator_id);
91+
CREATE INDEX IF NOT EXISTS idx_lido_signing_keys_pubkey ON lido_signing_keys (pubkey);
92+
93+
-- Lido CSM: Node operators (minimal fields)
94+
CREATE TABLE IF NOT EXISTS lido_csm_node_operators (
95+
operator_id BIGINT PRIMARY KEY,
96+
signing_key_count BIGINT NOT NULL DEFAULT 0
97+
);
98+
99+
-- Lido CSM: Signing keys per operator
100+
CREATE TABLE IF NOT EXISTS lido_csm_signing_keys (
101+
operator_id BIGINT NOT NULL REFERENCES lido_csm_node_operators(operator_id) ON DELETE CASCADE,
102+
pubkey BYTEA NOT NULL,
103+
PRIMARY KEY (operator_id, pubkey)
104+
);
105+
CREATE INDEX IF NOT EXISTS idx_lido_csm_signing_keys_operator_id ON lido_csm_signing_keys (operator_id);
106+
CREATE INDEX IF NOT EXISTS idx_lido_csm_signing_keys_pubkey ON lido_csm_signing_keys (pubkey);
107+
108+
-- Validator tagger job runs
109+
CREATE TABLE IF NOT EXISTS validator_tagger_job_runs (
110+
id BIGSERIAL PRIMARY KEY,
111+
job_name TEXT NOT NULL,
112+
run_group_id UUID NULL,
113+
scheduled_at_utc TIMESTAMPTZ NOT NULL,
114+
started_at TIMESTAMPTZ NULL,
115+
finished_at TIMESTAMPTZ NULL,
116+
status TEXT NOT NULL DEFAULT 'scheduled', -- scheduled|running|ok|error|skipped
117+
error_text TEXT NULL,
118+
triggered_by TEXT NOT NULL DEFAULT 'scheduler'
119+
);
120+
121+
CREATE UNIQUE INDEX IF NOT EXISTS uq_validator_tagger_job_runs_jobname_scheduled
122+
ON validator_tagger_job_runs (job_name, scheduled_at_utc);
123+
CREATE INDEX IF NOT EXISTS idx_validator_tagger_job_runs_status
124+
ON validator_tagger_job_runs (status);
125+
CREATE INDEX IF NOT EXISTS idx_validator_tagger_job_runs_started_at
126+
ON validator_tagger_job_runs (started_at);
127+
CREATE INDEX IF NOT EXISTS idx_validator_tagger_job_runs_run_group
128+
ON validator_tagger_job_runs (run_group_id);
129+
-- +goose StatementEnd
130+
131+
-- +goose Down
132+
-- +goose StatementBegin
133+
DROP TABLE IF EXISTS validator_tagger_job_runs;
134+
DROP TABLE IF EXISTS lido_csm_signing_keys;
135+
DROP TABLE IF EXISTS lido_csm_node_operators;
136+
DROP TABLE IF EXISTS lido_signing_keys;
137+
DROP TABLE IF EXISTS lido_node_operators;
138+
DROP TABLE IF EXISTS validator_entities_data_periods;
139+
DROP TABLE IF EXISTS validator_entities;
140+
-- +goose StatementEnd

0 commit comments

Comments
 (0)