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