agent-arena / scripts /schema.sql
nice-bill's picture
Add SQL schema for Supabase
b062daf
-- Supabase Schema for DeFi Agents Simulation
-- Run this in your Supabase SQL Editor
-- Enable UUID extension
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
-- ============================================
-- TABLE: runs
-- ============================================
CREATE TABLE IF NOT EXISTS runs (
id SERIAL PRIMARY KEY,
run_number INT NOT NULL UNIQUE,
start_time TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
end_time TIMESTAMP WITH TIME ZONE,
status TEXT DEFAULT 'running',
mechanics TEXT[] DEFAULT '{}',
config JSONB DEFAULT '{}',
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- Index for faster queries
CREATE INDEX IF NOT EXISTS idx_runs_run_number ON runs(run_number);
CREATE INDEX IF NOT EXISTS idx_runs_status ON runs(status);
-- ============================================
-- TABLE: agent_states
-- ============================================
CREATE TABLE IF NOT EXISTS agent_states (
id SERIAL PRIMARY KEY,
run_id INT REFERENCES runs(id) ON DELETE CASCADE,
turn INT NOT NULL,
agent_name TEXT NOT NULL,
token_a_balance FLOAT DEFAULT 0,
token_b_balance FLOAT DEFAULT 0,
profit FLOAT DEFAULT 0,
strategy TEXT,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- Indexes for agent state queries
CREATE INDEX IF NOT EXISTS idx_agent_states_run_id ON agent_states(run_id);
CREATE INDEX IF NOT EXISTS idx_agent_states_turn ON agent_states(run_id, turn);
CREATE INDEX IF NOT EXISTS idx_agent_states_agent ON agent_states(agent_name);
-- ============================================
-- TABLE: pool_states
-- ============================================
CREATE TABLE IF NOT EXISTS pool_states (
id SERIAL PRIMARY KEY,
run_id INT REFERENCES runs(id) ON DELETE CASCADE,
turn INT NOT NULL,
reserve_a FLOAT DEFAULT 0,
reserve_b FLOAT DEFAULT 0,
price_ab FLOAT DEFAULT 0,
total_liquidity FLOAT DEFAULT 0,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- Indexes for pool state queries
CREATE INDEX IF NOT EXISTS idx_pool_states_run_id ON pool_states(run_id);
CREATE INDEX IF NOT EXISTS idx_pool_states_turn ON pool_states(run_id, turn);
-- ============================================
-- TABLE: actions
-- ============================================
CREATE TABLE IF NOT EXISTS actions (
id SERIAL PRIMARY KEY,
run_id INT REFERENCES runs(id) ON DELETE CASCADE,
turn INT NOT NULL,
agent_name TEXT NOT NULL,
action_type TEXT NOT NULL,
payload JSONB DEFAULT '{}',
reasoning_trace TEXT,
thinking_trace TEXT,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- Indexes for action queries
CREATE INDEX IF NOT EXISTS idx_actions_run_id ON actions(run_id);
CREATE INDEX IF NOT EXISTS idx_actions_turn ON actions(run_id, turn);
CREATE INDEX IF NOT EXISTS idx_actions_agent ON actions(agent_name);
CREATE INDEX IF NOT EXISTS idx_actions_type ON actions(action_type);
-- ============================================
-- TABLE: run_metrics
-- ============================================
CREATE TABLE IF NOT EXISTS run_metrics (
id SERIAL PRIMARY KEY,
run_id INT REFERENCES runs(id) ON DELETE CASCADE,
gini_coefficient FLOAT,
cooperation_rate FLOAT,
betrayal_count INT DEFAULT 0,
avg_agent_profit FLOAT,
pool_stability FLOAT,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- Indexes for metrics queries
CREATE INDEX IF NOT EXISTS idx_run_metrics_run_id ON run_metrics(run_id);
-- ============================================
-- TABLE: agent_learning (optional - for persistence)
-- ============================================
CREATE TABLE IF NOT EXISTS agent_learning (
id SERIAL PRIMARY KEY,
agent_name TEXT NOT NULL,
run_number INT NOT NULL,
learning_summary TEXT,
strategy_tendency TEXT,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- Index for agent learning queries
CREATE INDEX IF NOT EXISTS idx_agent_learning_agent ON agent_learning(agent_name);
CREATE INDEX IF NOT EXISTS idx_agent_learning_run ON agent_learning(run_number);
-- ============================================
-- FUNCTIONS (optional utilities)
-- ============================================
-- Function to get the latest run number
CREATE OR REPLACE FUNCTION get_next_run_number()
RETURNS INT AS $$
BEGIN
RETURN COALESCE((SELECT MAX(run_number) FROM runs), 0) + 1;
END;
$$ LANGUAGE plpgsql;
-- Function to update run end time
CREATE OR REPLACE FUNCTION complete_run(p_run_id INT)
RETURNS VOID AS $$
BEGIN
UPDATE runs
SET end_time = NOW(), status = 'completed'
WHERE id = p_run_id;
END;
$$ LANGUAGE plpgsql;
-- ============================================
-- SAMPLE DATA (for testing)
-- ============================================
-- Insert a sample run
INSERT INTO runs (run_number, status, config)
VALUES (1, 'completed', '{"num_agents": 5, "turns_per_run": 10}'::jsonb)
ON CONFLICT (run_number) DO NOTHING;
-- ============================================
-- VERIFICATION QUERY
-- ============================================
-- Check all tables exist
SELECT table_name
FROM information_schema.tables
WHERE table_schema = 'public'
AND table_name IN ('runs', 'agent_states', 'pool_states', 'actions', 'run_metrics', 'agent_learning')
ORDER BY table_name;