arnaucube
arnaucube/hermez-nodePublic Self-hosted repository
hermez-node/db/historydb/migrations/001_init.sql
db/historydb/migrations/001_init.sqlRaw
  1-- +migrate Up
  2CREATE TABLE block (
  3    eth_block_num BIGINT PRIMARY KEY,
  4    timestamp TIMESTAMP WITHOUT TIME ZONE NOT NULL,
  5    hash BYTEA NOT NULL
  6);
  7
  8CREATE TABLE coordianator (
  9    forger_addr BYTEA NOT NULL,
 10    eth_block_num BIGINT NOT NULL REFERENCES block (eth_block_num) ON DELETE CASCADE,
 11    withdraw_addr BYTEA NOT NULL,
 12    url VARCHAR(200) NOT NULL,
 13    PRIMARY KEY (forger_addr, eth_block_num)
 14);
 15
 16CREATE TABLE batch (
 17    batch_num BIGINT PRIMARY KEY,
 18    eth_block_num BIGINT REFERENCES block (eth_block_num) ON DELETE CASCADE,
 19    forger_addr BYTEA NOT NULL, -- fake foreign key for coordinator
 20    fees_collected BYTEA NOT NULL,
 21    state_root BYTEA NOT NULL,
 22    num_accounts BIGINT NOT NULL,
 23    exit_root BYTEA NOT NULL,
 24    forge_l1_txs_num BIGINT,
 25    slot_num BIGINT NOT NULL
 26);
 27
 28CREATE TABLE exit_tree (
 29    batch_num BIGINT REFERENCES batch (batch_num) ON DELETE CASCADE,
 30    withdrawn BIGINT REFERENCES batch (batch_num) ON DELETE SET NULL,
 31    account_idx BIGINT,
 32    merkle_proof BYTEA NOT NULL,
 33    balance NUMERIC NOT NULL,
 34    nullifier BYTEA NOT NULL,
 35    PRIMARY KEY (batch_num, account_idx)
 36);
 37
 38CREATE TABLE bid (
 39    slot_num BIGINT NOT NULL,
 40    bid_value BYTEA NOT NULL,
 41    eth_block_num BIGINT NOT NULL REFERENCES block (eth_block_num) ON DELETE CASCADE,
 42    forger_addr BYTEA NOT NULL, -- fake foreign key for coordinator
 43    PRIMARY KEY (slot_num, bid_value)
 44);
 45
 46CREATE TABLE token (
 47    token_id INT PRIMARY KEY,
 48    eth_block_num BIGINT NOT NULL REFERENCES block (eth_block_num) ON DELETE CASCADE,
 49    eth_addr BYTEA UNIQUE NOT NULL,
 50    name VARCHAR(20) NOT NULL,
 51    symbol VARCHAR(10) NOT NULL,
 52    decimals INT NOT NULL,
 53    usd NUMERIC,
 54    usd_update TIMESTAMP
 55);
 56
 57-- +migrate StatementBegin
 58CREATE FUNCTION set_token_usd_update() 
 59    RETURNS TRIGGER 
 60AS 
 61$BODY$
 62BEGIN
 63    IF NEW."usd" IS NOT NULL AND NEW."usd_update" IS NULL THEN
 64        NEW."usd_update" = timezone('utc', now());
 65    END IF;
 66    RETURN NEW;
 67END;
 68$BODY$
 69LANGUAGE plpgsql;
 70-- +migrate StatementEnd
 71CREATE TRIGGER trigger_token_usd_update BEFORE UPDATE OR INSERT ON token
 72FOR EACH ROW EXECUTE PROCEDURE set_token_usd_update();
 73
 74CREATE TABLE tx (
 75    -- Generic TX
 76    is_l1 BOOLEAN NOT NULL,
 77    id BYTEA PRIMARY KEY,
 78    type VARCHAR(40) NOT NULL,
 79    position INT NOT NULL,
 80    from_idx BIGINT NOT NULL,
 81    to_idx BIGINT NOT NULL,
 82    amount BYTEA NOT NULL,
 83    amount_f NUMERIC NOT NULL,
 84    token_id INT NOT NULL REFERENCES token (token_id),
 85    amount_usd NUMERIC, -- Value of the amount in USD at the moment the tx was inserted in the DB
 86    batch_num BIGINT REFERENCES batch (batch_num) ON DELETE SET NULL, -- Can be NULL in the case of L1 txs that are on the queue but not forged yet.
 87    eth_block_num BIGINT NOT NULL REFERENCES block (eth_block_num) ON DELETE CASCADE,
 88    -- L1
 89    to_forge_l1_txs_num BIGINT,
 90    user_origin BOOLEAN,
 91    from_eth_addr BYTEA,
 92    from_bjj BYTEA,
 93    load_amount BYTEA,
 94    load_amount_f NUMERIC,
 95    load_amount_usd NUMERIC,
 96    -- L2
 97    fee INT,
 98    fee_usd NUMERIC,
 99    nonce BIGINT
100);
101
102-- +migrate StatementBegin
103CREATE FUNCTION set_tx()
104    RETURNS TRIGGER 
105AS 
106$BODY$
107DECLARE token_value NUMERIC := (SELECT usd FROM token WHERE token_id = NEW.token_id);
108BEGIN
109    -- Validate L1/L2 constrains
110    IF NEW.is_l1 AND (( -- L1 mandatory fields
111        NEW.user_origin IS NULL OR
112        NEW.from_eth_addr IS NULL OR
113        NEW.from_bjj IS NULL OR
114        NEW.load_amount IS NULL OR
115        NEW.load_amount_f IS NULL
116    ) OR (NOT NEW.user_origin AND NEW.batch_num IS NULL)) THEN -- If is Coordinator L1, must include batch_num
117        RAISE EXCEPTION 'Invalid L1 tx.';
118    ELSIF NOT NEW.is_l1 THEN
119        IF NEW.fee IS NULL THEN
120            NEW.fee = (SELECT 0);
121        END IF;
122        IF NEW.batch_num IS NULL OR NEW.nonce IS NULL THEN
123            RAISE EXCEPTION 'Invalid L2 tx.';
124        END IF;
125    END IF;
126    -- If is L2, add token_id
127    IF NEW.token_id IS NULL THEN
128        NEW."token_id" = (SELECT token_id FROM account WHERE idx = NEW."from_idx");
129    END IF;
130    -- Set value_usd
131    NEW."amount_usd" = (SELECT token_value * NEW.amount_f);
132    NEW."load_amount_usd" = (SELECT token_value * NEW.load_amount_f);
133    IF NOT NEW.is_l1 THEN
134        NEW."fee_usd" = (SELECT token_value * NEW.amount_f * CASE
135            WHEN NEW.fee = 0 THEN 0	
136            WHEN NEW.fee >= 1 AND NEW.fee <= 32 THEN POWER(10,-24+(NEW.fee::float/2))	
137            WHEN NEW.fee >= 33 AND NEW.fee <= 223 THEN POWER(10,-8+(0.041666666666667*(NEW.fee::float-32)))	
138            WHEN NEW.fee >= 224 AND NEW.fee <= 255 THEN POWER(10,NEW.fee-224) END);
139    END IF;
140    RETURN NEW;
141END;
142$BODY$
143LANGUAGE plpgsql;
144-- +migrate StatementEnd
145CREATE TRIGGER trigger_set_tx BEFORE INSERT ON tx
146FOR EACH ROW EXECUTE PROCEDURE set_tx();
147
148-- +migrate StatementBegin
149CREATE FUNCTION forge_l1_user_txs() 
150    RETURNS TRIGGER 
151AS 
152$BODY$
153BEGIN
154    IF NEW.forge_l1_txs_num IS NOT NULL THEN
155        UPDATE tx 
156        SET batch_num = NEW.batch_num
157        WHERE user_origin AND NEW.forge_l1_txs_num = to_forge_l1_txs_num;
158    END IF;
159    RETURN NEW;
160END;
161$BODY$
162LANGUAGE plpgsql;
163-- +migrate StatementEnd
164CREATE TRIGGER trigger_forge_l1_txs AFTER INSERT ON batch
165FOR EACH ROW EXECUTE PROCEDURE forge_l1_user_txs();
166
167CREATE TABLE account (
168    idx BIGINT PRIMARY KEY,
169    token_id INT NOT NULL REFERENCES token (token_id) ON DELETE CASCADE,
170    batch_num BIGINT NOT NULL REFERENCES batch (batch_num) ON DELETE CASCADE,
171    bjj BYTEA NOT NULL,
172    eth_addr BYTEA NOT NULL
173);
174
175CREATE TABLE rollup_vars (
176    eth_block_num BIGINT PRIMARY KEY REFERENCES block (eth_block_num) ON DELETE CASCADE,
177    forge_l1_timeout BYTEA NOT NULL,
178    fee_l1_user_tx BYTEA NOT NULL,
179    fee_add_token BYTEA NOT NULL,
180    tokens_hez BYTEA NOT NULL,
181    governance BYTEA NOT NULL
182);
183
184CREATE TABLE consensus_vars (
185    eth_block_num BIGINT PRIMARY KEY REFERENCES block (eth_block_num) ON DELETE CASCADE,
186    slot_deadline INT NOT NULL,
187    close_auction_slots INT NOT NULL,
188    open_auction_slots INT NOT NULL,
189    min_bid_slots VARCHAR(200) NOT NULL,
190    outbidding INT NOT NULL,
191    donation_address BYTEA NOT NULL,
192    governance_address BYTEA NOT NULL,
193    allocation_ratio VARCHAR(200)
194);
195
196-- +migrate Down
197DROP TABLE consensus_vars;
198DROP TABLE rollup_vars;
199DROP TABLE account;
200DROP TABLE l2tx;
201DROP TABLE l1tx;
202DROP TABLE token;
203DROP TABLE bid;
204DROP TABLE exit_tree;
205DROP TABLE batch;
206DROP TABLE coordianator;
207DROP TABLE block;