v0.1.0-pre.061

This commit is contained in:
2026-07-28 18:41:30 +02:00
parent c7bad46f50
commit f40fb78817
527 changed files with 4598 additions and 4114 deletions

View File

@@ -1,7 +1,7 @@
-- file: kb-store/maintenance/reset_derived_store_keep_raw.sql
-- version: 1
-- version: 2
-- Reset every derived Solana table while preserving canonical raw acquisition data.
-- Reset every reconstructible Solana projection while preserving acquisition data.
-- Intended for controlled local/research rebuilds only.
-- Preserved tables:
-- - kb_sol_raw_transactions
@@ -9,17 +9,22 @@
-- No CASCADE is used: unexpected dependencies fail loudly.
BEGIN;
DROP TABLE IF EXISTS kb_sol_mat_events;
DROP TABLE IF EXISTS kb_sol_decode_coverage_observations;
DROP TABLE IF EXISTS kb_sol_decode_coverage_declarations;
DROP TABLE IF EXISTS kb_sol_decode_events;
DROP TABLE IF EXISTS kb_sol_ops_processing_ledger;
DROP TABLE IF EXISTS kb_sol_core_balance_changes;
DROP TABLE IF EXISTS kb_sol_core_logs;
DROP TABLE IF EXISTS kb_sol_core_inner_instructions;
DROP TABLE IF EXISTS kb_sol_core_instructions;
DROP TABLE IF EXISTS kb_sol_core_account_keys;
DROP TABLE IF EXISTS kb_sol_core_transactions;
TRUNCATE TABLE
kb_sol_mat_events,
kb_sol_decode_coverage_observations,
kb_sol_decode_coverage_declarations,
kb_sol_decode_events,
kb_sol_ops_processing_ledger,
kb_sol_core_balance_changes,
kb_sol_core_logs,
kb_sol_core_inner_instructions,
kb_sol_core_instructions,
kb_sol_core_account_keys,
kb_sol_core_transactions
RESTART IDENTITY;
UPDATE kb_sol_raw_transactions
SET
processing_state = 'received',
lifecycle_reason = NULL,
updated_at = NOW();
COMMIT;

View File

@@ -1,94 +1,30 @@
-- file: kb-store/migrations/0001_canonical_transaction_store.sql
-- version: 1
-- Current canonical transaction and acquisition observation store.
-- This baseline contains only active tables and uses the current PostgreSQL schema.
-- Historical 0.2.x upgrade logic was validated before this baseline was consolidated.
CREATE TABLE IF NOT EXISTS kb_sol_raw_transactions (
id BIGSERIAL,
signature TEXT NOT NULL,
slot BIGINT NOT NULL,
canonical_json JSONB,
canonical_json_hash TEXT,
canonical_format_version INTEGER NOT NULL DEFAULT 1,
retention_state TEXT NOT NULL DEFAULT 'full',
processing_state TEXT NOT NULL DEFAULT 'received',
lifecycle_reason TEXT,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
CONSTRAINT pk_kb_sol_raw_transactions PRIMARY KEY (id),
CONSTRAINT ck_kb_sol_raw_transactions_signature_not_empty CHECK (length(btrim(signature)) > 0),
CONSTRAINT ck_kb_sol_raw_transactions_slot_non_negative CHECK (slot >= 0),
CONSTRAINT ck_kb_sol_raw_transactions_format_version_positive CHECK (canonical_format_version > 0),
CONSTRAINT ck_kb_sol_raw_transactions_retention_state CHECK (retention_state IN ('full', 'compacted', 'archived', 'purged')),
CONSTRAINT ck_kb_sol_raw_transactions_processing_state CHECK (processing_state IN ('received', 'core_extracted', 'decoded', 'materialized', 'failed')),
CONSTRAINT ck_kb_sol_raw_transactions_full_has_json CHECK (retention_state <> 'full' OR canonical_json IS NOT NULL)
);
CREATE UNIQUE INDEX IF NOT EXISTS ux_kb_sol_raw_transactions_signature ON kb_sol_raw_transactions (signature);
CREATE INDEX IF NOT EXISTS ix_kb_sol_raw_transactions_slot ON kb_sol_raw_transactions (slot);
CREATE INDEX IF NOT EXISTS ix_kb_sol_raw_transactions_created_at ON kb_sol_raw_transactions (created_at);
CREATE INDEX IF NOT EXISTS ix_kb_sol_raw_transactions_processing ON kb_sol_raw_transactions (processing_state);
CREATE INDEX IF NOT EXISTS ix_kb_sol_raw_transactions_canonical_hash ON kb_sol_raw_transactions (canonical_json_hash) WHERE canonical_json_hash IS NOT NULL;
CREATE TABLE IF NOT EXISTS kb_sol_obs_transaction_observations (
id BIGSERIAL,
raw_transaction_id BIGINT,
observation_key TEXT NOT NULL,
signature TEXT,
slot BIGINT,
provider TEXT NOT NULL,
endpoint_code TEXT,
protocol TEXT NOT NULL,
acquisition_method TEXT NOT NULL,
origin TEXT NOT NULL,
commitment TEXT,
capture_session_id TEXT,
filter_code TEXT,
detected_at TIMESTAMPTZ,
received_at TIMESTAMPTZ NOT NULL,
normalized_at TIMESTAMPTZ,
persisted_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
payload_size_bytes BIGINT,
source_payload_hash TEXT,
status TEXT NOT NULL DEFAULT 'received',
error_code TEXT,
error_message TEXT,
CONSTRAINT pk_kb_sol_obs_transaction_observations PRIMARY KEY (id),
CONSTRAINT fk_kb_sol_obs_transaction_observations_raw_transaction FOREIGN KEY (raw_transaction_id) REFERENCES kb_sol_raw_transactions(id) ON DELETE SET NULL,
CONSTRAINT ck_kb_sol_obs_transaction_observations_key_not_empty CHECK (length(btrim(observation_key)) > 0),
CONSTRAINT ck_kb_sol_obs_transaction_observations_signature_not_empty CHECK (signature IS NULL OR length(btrim(signature)) > 0),
CONSTRAINT ck_kb_sol_obs_transaction_observations_slot_non_negative CHECK (slot IS NULL OR slot >= 0),
CONSTRAINT ck_kb_sol_obs_transaction_observations_provider_not_empty CHECK (length(btrim(provider)) > 0),
CONSTRAINT ck_kb_sol_obs_transaction_observations_endpoint_not_empty CHECK (endpoint_code IS NULL OR length(btrim(endpoint_code)) > 0),
CONSTRAINT ck_kb_sol_obs_transaction_observations_protocol_not_empty CHECK (length(btrim(protocol)) > 0),
CONSTRAINT ck_kb_sol_obs_transaction_observations_method_not_empty CHECK (length(btrim(acquisition_method)) > 0),
CONSTRAINT ck_kb_sol_obs_transaction_observations_origin CHECK (origin IN ('live', 'backfill', 'replay', 'repair', 'migration')),
CONSTRAINT ck_kb_sol_obs_transaction_observations_commitment_not_empty CHECK (commitment IS NULL OR length(btrim(commitment)) > 0),
CONSTRAINT ck_kb_sol_obs_transaction_observations_session_not_empty CHECK (capture_session_id IS NULL OR length(btrim(capture_session_id)) > 0),
CONSTRAINT ck_kb_sol_obs_transaction_observations_filter_not_empty CHECK (filter_code IS NULL OR length(btrim(filter_code)) > 0),
CONSTRAINT ck_kb_sol_obs_transaction_observations_payload_size_non_negative CHECK (payload_size_bytes IS NULL OR payload_size_bytes >= 0),
CONSTRAINT ck_kb_sol_obs_transaction_observations_hash_not_empty CHECK (source_payload_hash IS NULL OR length(btrim(source_payload_hash)) > 0),
CONSTRAINT ck_kb_sol_obs_transaction_observations_status CHECK (status IN ('detected', 'received', 'normalized', 'persisted', 'failed', 'missing')),
CONSTRAINT ck_kb_sol_obs_transaction_observations_error_code_not_empty CHECK (error_code IS NULL OR length(btrim(error_code)) > 0),
CONSTRAINT ck_kb_sol_obs_transaction_observations_error_message_not_empty CHECK (error_message IS NULL OR length(btrim(error_message)) > 0)
);
CREATE UNIQUE INDEX IF NOT EXISTS ux_kb_sol_obs_transaction_observations_key ON kb_sol_obs_transaction_observations (observation_key);
CREATE INDEX IF NOT EXISTS ix_kb_sol_obs_transaction_observations_signature ON kb_sol_obs_transaction_observations (signature) WHERE signature IS NOT NULL;
CREATE INDEX IF NOT EXISTS ix_kb_sol_obs_transaction_observations_slot ON kb_sol_obs_transaction_observations (slot) WHERE slot IS NOT NULL;
CREATE INDEX IF NOT EXISTS ix_kb_sol_obs_transaction_observations_provider_method ON kb_sol_obs_transaction_observations (provider, acquisition_method);
CREATE INDEX IF NOT EXISTS ix_kb_sol_obs_transaction_observations_received_at ON kb_sol_obs_transaction_observations (received_at);
CREATE INDEX IF NOT EXISTS ix_kb_sol_obs_transaction_observations_raw_transaction ON kb_sol_obs_transaction_observations (raw_transaction_id) WHERE raw_transaction_id IS NOT NULL;
CREATE INDEX IF NOT EXISTS ix_kb_sol_obs_transaction_observations_status ON kb_sol_obs_transaction_observations (status);
WITH failed_transfer AS (
SELECT
core.signature,
core.slot,
core.instruction_path,
core.accounts_json
FROM kb_sol_ops_processing_ledger AS ledger
JOIN kb_sol_core_instructions AS core
ON ledger.input_key = core.signature || ':' || core.instruction_path
WHERE ledger.stage = 'instruction_decode'
AND ledger.status = 'failed'
AND ledger.processor_name = 'metadata_metaplex_token_metadata'
AND ledger.error_message LIKE 'transfer%'
)
SELECT
failed.signature,
failed.slot,
failed.instruction_path,
account.ordinality - 1 AS position,
account.value ->> 'accountKey' AS account_key,
(account.value ->> 'accountIndex')::INTEGER AS account_index,
keys.signer,
keys.writable
FROM failed_transfer AS failed
CROSS JOIN LATERAL jsonb_array_elements(failed.accounts_json)
WITH ORDINALITY AS account(value, ordinality)
LEFT JOIN kb_sol_core_account_keys AS keys
ON keys.signature = failed.signature
AND keys.account_index = (account.value ->> 'accountIndex')::INTEGER
ORDER BY account.ordinality;