Fix exit table, set delayed_withdrawn in exits
- In exit table, `instant_withdrawn`, `delayed_withdraw_request`, and
`delayed_withdrawn` were referencing batch_num. But these actions happen
outside a batch, so they should reference a block_num.
- Process delayed withdrawns:
- In Synchronizer, first match a Rollup delayed withdrawn request, with the
WDelayer deposit (via TxHash), and store the owner and token associated
with the delayed withdrawn.
- In HistoryDB: store the owner and token of a delayed withdrawal request
in the exit_tree, and set delayed_withdrawn when the withdraw is done in
the WDelayer.
- Update dependency of sqlx to master
- Last release of sqlx is from 2018 October, and it doesn't support
`NamedQuery` with a slice of structs, which is used in this commit.
4 years ago Redo coordinator structure, connect API to node
- API:
- Modify the constructor so that hardcoded rollup constants don't need
to be passed (introduce a `Config` and use `configAPI` internally)
- Common:
- Update rollup constants with proper *big.Int when required
- Add BidCoordinator and Slot structs used by the HistoryDB and
Synchronizer.
- Add helper methods to AuctionConstants
- AuctionVariables: Add column `DefaultSlotSetBidSlotNum` (in the SQL
table: `default_slot_set_bid_slot_num`), which indicates at which
slotNum does the `DefaultSlotSetBid` specified starts applying.
- Config:
- Move coordinator exclusive configuration from the node config to the
coordinator config
- Coordinator:
- Reorganize the code towards having the goroutines started and stopped
from the coordinator itself instead of the node.
- Remove all stop and stopped channels, and use context.Context and
sync.WaitGroup instead.
- Remove BatchInfo setters and assing variables directly
- In ServerProof and ServerProofPool use context instead stop channel.
- Use message passing to notify the coordinator about sync updates and
reorgs
- Introduce the Pipeline, which can be started and stopped by the
Coordinator
- Introduce the TxManager, which manages ethereum transactions (the
TxManager is also in charge of making the forge call to the rollup
smart contract). The TxManager keeps ethereum transactions and:
1. Waits for the transaction to be accepted
2. Waits for the transaction to be confirmed for N blocks
- In forge logic, first prepare a batch and then wait for an available
server proof to have all work ready once the proof server is ready.
- Remove the `isForgeSequence` method which was querying the smart
contract, and instead use notifications sent by the Synchronizer to
figure out if it's forging time.
- Update test (which is a minimal test to manually see if the
coordinator starts)
- HistoryDB:
- Add method to get the number of batches in a slot (used to detect when
a slot has passed the bid winner forging deadline)
- Add method to get the best bid and associated coordinator of a slot
(used to detect the forgerAddress that can forge the slot)
- General:
- Rename some instances of `currentBlock` to `lastBlock` to be more
clear.
- Node:
- Connect the API to the node and call the methods to update cached
state when the sync advances blocks.
- Call methods to update Coordinator state when the sync advances blocks
and finds reorgs.
- Synchronizer:
- Add Auction field in the Stats, which contain the current slot with
info about highest bidder and other related info required to know who
can forge in the current block.
- Better organization of cached state:
- On Sync, update the internal cached state
- On Init or Reorg, load the state from HistoryDB into the
internal cached state.
4 years ago |
|
-- +migrate Up
-- History
CREATE TABLE block ( eth_block_num BIGINT PRIMARY KEY, timestamp TIMESTAMP WITHOUT TIME ZONE NOT NULL, hash BYTEA NOT NULL );
CREATE TABLE coordinator ( item_id SERIAL PRIMARY KEY, bidder_addr BYTEA NOT NULL, forger_addr BYTEA NOT NULL, eth_block_num BIGINT NOT NULL REFERENCES block (eth_block_num) ON DELETE CASCADE, url BYTEA NOT NULL );
CREATE TABLE batch ( item_id SERIAL PRIMARY KEY, batch_num BIGINT UNIQUE NOT NULL, eth_block_num BIGINT NOT NULL REFERENCES block (eth_block_num) ON DELETE CASCADE, forger_addr BYTEA NOT NULL, -- fake foreign key for coordinator
fees_collected BYTEA NOT NULL, fee_idxs_coordinator BYTEA NOT NULL, state_root BYTEA NOT NULL, num_accounts BIGINT NOT NULL, last_idx BIGINT NOT NULL, exit_root BYTEA NOT NULL, forge_l1_txs_num BIGINT, slot_num BIGINT NOT NULL, total_fees_usd NUMERIC
);
CREATE TABLE bid ( item_id SERIAL PRIMARY KEY, slot_num BIGINT NOT NULL, bid_value BYTEA NOT NULL, eth_block_num BIGINT NOT NULL REFERENCES block (eth_block_num) ON DELETE CASCADE, bidder_addr BYTEA NOT NULL -- fake foreign key for coordinator
);
CREATE TABLE token ( item_id SERIAL PRIMARY KEY, token_id INT UNIQUE NOT NULL, eth_block_num BIGINT NOT NULL REFERENCES block (eth_block_num) ON DELETE CASCADE, eth_addr BYTEA UNIQUE NOT NULL, name VARCHAR(20) NOT NULL, symbol VARCHAR(10) NOT NULL, decimals INT NOT NULL, usd NUMERIC, -- value of a normalized token (1 token = 10^decimals units)
usd_update TIMESTAMP WITHOUT TIME ZONE );
-- Add ETH as TokenID 0
INSERT INTO block ( eth_block_num, timestamp, hash ) VALUES ( 0, '2015-07-30 03:26:13', '\xd4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3' ); -- info from https://etherscan.io/block/0
INSERT INTO token ( token_id, eth_block_num, eth_addr, name, symbol, decimals ) VALUES ( 0, 0, '\x0000000000000000000000000000000000000000', 'Ether', 'ETH', 18 );
-- +migrate StatementBegin
CREATE FUNCTION hez_idx(BIGINT, VARCHAR) RETURNS VARCHAR
AS $BODY$ BEGIN RETURN 'hez:' || $2 || ':' || $1; END; $BODY$ LANGUAGE plpgsql; -- +migrate StatementEnd
CREATE TABLE account ( item_id SERIAL, idx BIGINT PRIMARY KEY, token_id INT NOT NULL REFERENCES token (token_id) ON DELETE CASCADE, batch_num BIGINT NOT NULL REFERENCES batch (batch_num) ON DELETE CASCADE, bjj BYTEA NOT NULL, eth_addr BYTEA NOT NULL );
CREATE TABLE account_update ( item_id SERIAL, eth_block_num BIGINT NOT NULL REFERENCES block (eth_block_num) ON DELETE CASCADE, batch_num BIGINT NOT NULL REFERENCES batch (batch_num) ON DELETE CASCADE, idx BIGINT NOT NULL REFERENCES account (idx) ON DELETE CASCADE, nonce BIGINT NOT NULL, balance BYTEA NOT NULL );
CREATE TABLE exit_tree ( item_id SERIAL PRIMARY KEY, batch_num BIGINT REFERENCES batch (batch_num) ON DELETE CASCADE, account_idx BIGINT REFERENCES account (idx) ON DELETE CASCADE, merkle_proof BYTEA NOT NULL, balance BYTEA NOT NULL, instant_withdrawn BIGINT REFERENCES block (eth_block_num) ON DELETE SET NULL, delayed_withdraw_request BIGINT REFERENCES block (eth_block_num) ON DELETE SET NULL, owner BYTEA, token BYTEA, delayed_withdrawn BIGINT REFERENCES block (eth_block_num) ON DELETE SET NULL );
-- +migrate StatementBegin
CREATE FUNCTION set_token_usd_update() RETURNS TRIGGER AS $BODY$ BEGIN IF NEW."usd" IS NOT NULL AND NEW."usd_update" IS NULL THEN NEW."usd_update" = timezone('utc', now()); END IF; RETURN NEW; END; $BODY$ LANGUAGE plpgsql; -- +migrate StatementEnd
CREATE TRIGGER trigger_token_usd_update BEFORE UPDATE OR INSERT ON token FOR EACH ROW EXECUTE PROCEDURE set_token_usd_update();
CREATE SEQUENCE tx_item_id;
-- important note about "amount_success" and "deposit_amount_success" (only relevant to L1 user txs):
-- The behaviour should be:
-- When tx is not forged: amount_success = false, deposit_amount_success = false
-- When tx is forged:
-- amount_success = false if the "effective amount" is 0, else true
-- deposit_amount_success = false if the "effective deposit amount" is 0, else true
--
-- However, in order to reduce the amount of updates, by default amount_success and deposit_amount_success will be set to true (when tx is unforged)
-- whne they should be false. This can be worked around at a query level by checking if "batch_num IS NULL" (which indicates that the tx is unforged).
CREATE TABLE tx ( -- Generic TX
item_id INTEGER PRIMARY KEY DEFAULT nextval('tx_item_id'), is_l1 BOOLEAN NOT NULL, id BYTEA, type VARCHAR(40) NOT NULL, position INT NOT NULL, from_idx BIGINT, effective_from_idx BIGINT REFERENCES account (idx) ON DELETE SET NULL, from_eth_addr BYTEA, from_bjj BYTEA, to_idx BIGINT NOT NULL, to_eth_addr BYTEA, to_bjj BYTEA, amount BYTEA NOT NULL, amount_success BOOLEAN NOT NULL DEFAULT true, amount_f NUMERIC NOT NULL, token_id INT NOT NULL REFERENCES token (token_id), amount_usd NUMERIC, -- Value of the amount in USD at the moment the tx was inserted in the DB
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.
eth_block_num BIGINT NOT NULL REFERENCES block (eth_block_num) ON DELETE CASCADE, -- L1
to_forge_l1_txs_num BIGINT, user_origin BOOLEAN, deposit_amount BYTEA, deposit_amount_success BOOLEAN NOT NULL DEFAULT true, deposit_amount_f NUMERIC, deposit_amount_usd NUMERIC, -- L2
fee INT, fee_usd NUMERIC, nonce BIGINT
);
-- +migrate StatementBegin
CREATE FUNCTION fee_percentage(NUMERIC) RETURNS NUMERIC
AS $BODY$ DECLARE perc NUMERIC; BEGIN SELECT CASE WHEN $1 = 000 THEN 0.000000e+00 WHEN $1 = 001 THEN 2.675309e-18 WHEN $1 = 002 THEN 8.251782e-18 WHEN $1 = 003 THEN 2.545198e-17 WHEN $1 = 004 THEN 7.850462e-17 WHEN $1 = 005 THEN 2.421414e-16 WHEN $1 = 006 THEN 7.468660e-16 WHEN $1 = 007 THEN 2.303650e-15 WHEN $1 = 008 THEN 7.105427e-15 WHEN $1 = 009 THEN 2.191613e-14 WHEN $1 = 010 THEN 6.759860e-14 WHEN $1 = 011 THEN 2.085026e-13 WHEN $1 = 012 THEN 6.431099e-13 WHEN $1 = 013 THEN 1.983622e-12 WHEN $1 = 014 THEN 6.118327e-12 WHEN $1 = 015 THEN 1.887150e-11 WHEN $1 = 016 THEN 5.820766e-11 WHEN $1 = 017 THEN 1.795370e-10 WHEN $1 = 018 THEN 5.537677e-10 WHEN $1 = 019 THEN 1.708053e-09 WHEN $1 = 020 THEN 5.268356e-09 WHEN $1 = 021 THEN 1.624983e-08 WHEN $1 = 022 THEN 5.012133e-08 WHEN $1 = 023 THEN 1.545953e-07 WHEN $1 = 024 THEN 4.768372e-07 WHEN $1 = 025 THEN 1.470767e-06 WHEN $1 = 026 THEN 4.536465e-06 WHEN $1 = 027 THEN 1.399237e-05 WHEN $1 = 028 THEN 4.315837e-05 WHEN $1 = 029 THEN 1.331186e-04 WHEN $1 = 030 THEN 4.105940e-04 WHEN $1 = 031 THEN 1.266445e-03 WHEN $1 = 032 THEN 3.906250e-03 WHEN $1 = 033 THEN 4.044004e-03 WHEN $1 = 034 THEN 4.186615e-03 WHEN $1 = 035 THEN 4.334256e-03 WHEN $1 = 036 THEN 4.487103e-03 WHEN $1 = 037 THEN 4.645340e-03 WHEN $1 = 038 THEN 4.809158e-03 WHEN $1 = 039 THEN 4.978752e-03 WHEN $1 = 040 THEN 5.154328e-03 WHEN $1 = 041 THEN 5.336095e-03 WHEN $1 = 042 THEN 5.524272e-03 WHEN $1 = 043 THEN 5.719085e-03 WHEN $1 = 044 THEN 5.920768e-03 WHEN $1 = 045 THEN 6.129563e-03 WHEN $1 = 046 THEN 6.345722e-03 WHEN $1 = 047 THEN 6.569503e-03 WHEN $1 = 048 THEN 6.801176e-03 WHEN $1 = 049 THEN 7.041019e-03 WHEN $1 = 050 THEN 7.289320e-03 WHEN $1 = 051 THEN 7.546378e-03 WHEN $1 = 052 THEN 7.812500e-03 WHEN $1 = 053 THEN 8.088007e-03 WHEN $1 = 054 THEN 8.373230e-03 WHEN $1 = 055 THEN 8.668512e-03 WHEN $1 = 056 THEN 8.974206e-03 WHEN $1 = 057 THEN 9.290681e-03 WHEN $1 = 058 THEN 9.618316e-03 WHEN $1 = 059 THEN 9.957505e-03 WHEN $1 = 060 THEN 1.030866e-02 WHEN $1 = 061 THEN 1.067219e-02 WHEN $1 = 062 THEN 1.104854e-02 WHEN $1 = 063 THEN 1.143817e-02 WHEN $1 = 064 THEN 1.184154e-02 WHEN $1 = 065 THEN 1.225913e-02 WHEN $1 = 066 THEN 1.269144e-02 WHEN $1 = 067 THEN 1.313901e-02 WHEN $1 = 068 THEN 1.360235e-02 WHEN $1 = 069 THEN 1.408204e-02 WHEN $1 = 070 THEN 1.457864e-02 WHEN $1 = 071 THEN 1.509276e-02 WHEN $1 = 072 THEN 1.562500e-02 WHEN $1 = 073 THEN 1.617601e-02 WHEN $1 = 074 THEN 1.674646e-02 WHEN $1 = 075 THEN 1.733702e-02 WHEN $1 = 076 THEN 1.794841e-02 WHEN $1 = 077 THEN 1.858136e-02 WHEN $1 = 078 THEN 1.923663e-02 WHEN $1 = 079 THEN 1.991501e-02 WHEN $1 = 080 THEN 2.061731e-02 WHEN $1 = 081 THEN 2.134438e-02 WHEN $1 = 082 THEN 2.209709e-02 WHEN $1 = 083 THEN 2.287634e-02 WHEN $1 = 084 THEN 2.368307e-02 WHEN $1 = 085 THEN 2.451825e-02 WHEN $1 = 086 THEN 2.538289e-02 WHEN $1 = 087 THEN 2.627801e-02 WHEN $1 = 088 THEN 2.720471e-02 WHEN $1 = 089 THEN 2.816408e-02 WHEN $1 = 090 THEN 2.915728e-02 WHEN $1 = 091 THEN 3.018551e-02 WHEN $1 = 092 THEN 3.125000e-02 WHEN $1 = 093 THEN 3.235203e-02 WHEN $1 = 094 THEN 3.349292e-02 WHEN $1 = 095 THEN 3.467405e-02 WHEN $1 = 096 THEN 3.589682e-02 WHEN $1 = 097 THEN 3.716272e-02 WHEN $1 = 098 THEN 3.847326e-02 WHEN $1 = 099 THEN 3.983002e-02 WHEN $1 = 100 THEN 4.123462e-02 WHEN $1 = 101 THEN 4.268876e-02 WHEN $1 = 102 THEN 4.419417e-02 WHEN $1 = 103 THEN 4.575268e-02 WHEN $1 = 104 THEN 4.736614e-02 WHEN $1 = 105 THEN 4.903651e-02 WHEN $1 = 106 THEN 5.076577e-02 WHEN $1 = 107 THEN 5.255603e-02 WHEN $1 = 108 THEN 5.440941e-02 WHEN $1 = 109 THEN 5.632815e-02 WHEN $1 = 110 THEN 5.831456e-02 WHEN $1 = 111 THEN 6.037102e-02 WHEN $1 = 112 THEN 6.250000e-02 WHEN $1 = 113 THEN 6.470406e-02 WHEN $1 = 114 THEN 6.698584e-02 WHEN $1 = 115 THEN 6.934809e-02 WHEN $1 = 116 THEN 7.179365e-02 WHEN $1 = 117 THEN 7.432544e-02 WHEN $1 = 118 THEN 7.694653e-02 WHEN $1 = 119 THEN 7.966004e-02 WHEN $1 = 120 THEN 8.246924e-02 WHEN $1 = 121 THEN 8.537752e-02 WHEN $1 = 122 THEN 8.838835e-02 WHEN $1 = 123 THEN 9.150536e-02 WHEN $1 = 124 THEN 9.473229e-02 WHEN $1 = 125 THEN 9.807301e-02 WHEN $1 = 126 THEN 1.015315e-01 WHEN $1 = 127 THEN 1.051121e-01 WHEN $1 = 128 THEN 1.088188e-01 WHEN $1 = 129 THEN 1.126563e-01 WHEN $1 = 130 THEN 1.166291e-01 WHEN $1 = 131 THEN 1.207420e-01 WHEN $1 = 132 THEN 1.250000e-01 WHEN $1 = 133 THEN 1.294081e-01 WHEN $1 = 134 THEN 1.339717e-01 WHEN $1 = 135 THEN 1.386962e-01 WHEN $1 = 136 THEN 1.435873e-01 WHEN $1 = 137 THEN 1.486509e-01 WHEN $1 = 138 THEN 1.538931e-01 WHEN $1 = 139 THEN 1.593201e-01 WHEN $1 = 140 THEN 1.649385e-01 WHEN $1 = 141 THEN 1.707550e-01 WHEN $1 = 142 THEN 1.767767e-01 WHEN $1 = 143 THEN 1.830107e-01 WHEN $1 = 144 THEN 1.894646e-01 WHEN $1 = 145 THEN 1.961460e-01 WHEN $1 = 146 THEN 2.030631e-01 WHEN $1 = 147 THEN 2.102241e-01 WHEN $1 = 148 THEN 2.176376e-01 WHEN $1 = 149 THEN 2.253126e-01 WHEN $1 = 150 THEN 2.332582e-01 WHEN $1 = 151 THEN 2.414841e-01 WHEN $1 = 152 THEN 2.500000e-01 WHEN $1 = 153 THEN 2.588162e-01 WHEN $1 = 154 THEN 2.679434e-01 WHEN $1 = 155 THEN 2.773924e-01 WHEN $1 = 156 THEN 2.871746e-01 WHEN $1 = 157 THEN 2.973018e-01 WHEN $1 = 158 THEN 3.077861e-01 WHEN $1 = 159 THEN 3.186402e-01 WHEN $1 = 160 THEN 3.298770e-01 WHEN $1 = 161 THEN 3.415101e-01 WHEN $1 = 162 THEN 3.535534e-01 WHEN $1 = 163 THEN 3.660214e-01 WHEN $1 = 164 THEN 3.789291e-01 WHEN $1 = 165 THEN 3.922920e-01 WHEN $1 = 166 THEN 4.061262e-01 WHEN $1 = 167 THEN 4.204482e-01 WHEN $1 = 168 THEN 4.352753e-01 WHEN $1 = 169 THEN 4.506252e-01 WHEN $1 = 170 THEN 4.665165e-01 WHEN $1 = 171 THEN 4.829682e-01 WHEN $1 = 172 THEN 5.000000e-01 WHEN $1 = 173 THEN 5.176325e-01 WHEN $1 = 174 THEN 5.358867e-01 WHEN $1 = 175 THEN 5.547847e-01 WHEN $1 = 176 THEN 5.743492e-01 WHEN $1 = 177 THEN 5.946036e-01 WHEN $1 = 178 THEN 6.155722e-01 WHEN $1 = 179 THEN 6.372803e-01 WHEN $1 = 180 THEN 6.597540e-01 WHEN $1 = 181 THEN 6.830201e-01 WHEN $1 = 182 THEN 7.071068e-01 WHEN $1 = 183 THEN 7.320428e-01 WHEN $1 = 184 THEN 7.578583e-01 WHEN $1 = 185 THEN 7.845841e-01 WHEN $1 = 186 THEN 8.122524e-01 WHEN $1 = 187 THEN 8.408964e-01 WHEN $1 = 188 THEN 8.705506e-01 WHEN $1 = 189 THEN 9.012505e-01 WHEN $1 = 190 THEN 9.330330e-01 WHEN $1 = 191 THEN 9.659363e-01 WHEN $1 = 192 THEN 1.000000e+00 WHEN $1 = 193 THEN 2.000000e+00 WHEN $1 = 194 THEN 4.000000e+00 WHEN $1 = 195 THEN 8.000000e+00 WHEN $1 = 196 THEN 1.600000e+01 WHEN $1 = 197 THEN 3.200000e+01 WHEN $1 = 198 THEN 6.400000e+01 WHEN $1 = 199 THEN 1.280000e+02 WHEN $1 = 200 THEN 2.560000e+02 WHEN $1 = 201 THEN 5.120000e+02 WHEN $1 = 202 THEN 1.024000e+03 WHEN $1 = 203 THEN 2.048000e+03 WHEN $1 = 204 THEN 4.096000e+03 WHEN $1 = 205 THEN 8.192000e+03 WHEN $1 = 206 THEN 1.638400e+04 WHEN $1 = 207 THEN 3.276800e+04 WHEN $1 = 208 THEN 6.553600e+04 WHEN $1 = 209 THEN 1.310720e+05 WHEN $1 = 210 THEN 2.621440e+05 WHEN $1 = 211 THEN 5.242880e+05 WHEN $1 = 212 THEN 1.048576e+06 WHEN $1 = 213 THEN 2.097152e+06 WHEN $1 = 214 THEN 4.194304e+06 WHEN $1 = 215 THEN 8.388608e+06 WHEN $1 = 216 THEN 1.677722e+07 WHEN $1 = 217 THEN 3.355443e+07 WHEN $1 = 218 THEN 6.710886e+07 WHEN $1 = 219 THEN 1.342177e+08 WHEN $1 = 220 THEN 2.684355e+08 WHEN $1 = 221 THEN 5.368709e+08 WHEN $1 = 222 THEN 1.073742e+09 WHEN $1 = 223 THEN 2.147484e+09 WHEN $1 = 224 THEN 4.294967e+09 WHEN $1 = 225 THEN 8.589935e+09 WHEN $1 = 226 THEN 1.717987e+10 WHEN $1 = 227 THEN 3.435974e+10 WHEN $1 = 228 THEN 6.871948e+10 WHEN $1 = 229 THEN 1.374390e+11 WHEN $1 = 230 THEN 2.748779e+11 WHEN $1 = 231 THEN 5.497558e+11 WHEN $1 = 232 THEN 1.099512e+12 WHEN $1 = 233 THEN 2.199023e+12 WHEN $1 = 234 THEN 4.398047e+12 WHEN $1 = 235 THEN 8.796093e+12 WHEN $1 = 236 THEN 1.759219e+13 WHEN $1 = 237 THEN 3.518437e+13 WHEN $1 = 238 THEN 7.036874e+13 WHEN $1 = 239 THEN 1.407375e+14 WHEN $1 = 240 THEN 2.814750e+14 WHEN $1 = 241 THEN 5.629500e+14 WHEN $1 = 242 THEN 1.125900e+15 WHEN $1 = 243 THEN 2.251800e+15 WHEN $1 = 244 THEN 4.503600e+15 WHEN $1 = 245 THEN 9.007199e+15 WHEN $1 = 246 THEN 1.801440e+16 WHEN $1 = 247 THEN 3.602880e+16 WHEN $1 = 248 THEN 7.205759e+16 WHEN $1 = 249 THEN 1.441152e+17 WHEN $1 = 250 THEN 2.882304e+17 WHEN $1 = 251 THEN 5.764608e+17 WHEN $1 = 252 THEN 1.152922e+18 WHEN $1 = 253 THEN 2.305843e+18 WHEN $1 = 254 THEN 4.611686e+18 WHEN $1 = 255 THEN 9.223372e+18 END INTO perc; RETURN perc; END; $BODY$ LANGUAGE plpgsql; -- +migrate StatementEnd
-- +migrate StatementBegin
CREATE FUNCTION set_tx() RETURNS TRIGGER AS $BODY$ DECLARE _value NUMERIC; _usd_update TIMESTAMP; _tx_timestamp TIMESTAMP; BEGIN IF NEW.is_l1 THEN -- Validate L1 Tx
IF NEW.user_origin IS NULL OR NEW.from_eth_addr IS NULL OR NEW.from_bjj IS NULL OR NEW.deposit_amount IS NULL OR NEW.deposit_amount_f IS NULL OR (NOT NEW.user_origin AND NEW.batch_num IS NULL) THEN -- If is Coordinator L1, must include batch_num
RAISE EXCEPTION 'Invalid L1 tx: %', NEW; END IF; ELSE -- Validate L2 Tx
IF NEW.batch_num IS NULL OR NEW.nonce IS NULL THEN RAISE EXCEPTION 'Invalid L2 tx: %', NEW; END IF; -- Set fee if it's null
IF NEW.fee IS NULL THEN NEW.fee = (SELECT 0); END IF; -- Set token_id
NEW."token_id" = (SELECT token_id FROM account WHERE idx = NEW."from_idx"); -- Set from_{eth_addr,bjj}
SELECT INTO NEW."from_eth_addr", NEW."from_bjj" eth_addr, bjj FROM account WHERE idx = NEW.from_idx; END IF; -- Set USD related
SELECT INTO _value, _usd_update, _tx_timestamp usd / POWER(10, decimals), usd_update, timestamp FROM token INNER JOIN block on token.eth_block_num = block.eth_block_num WHERE token_id = NEW.token_id; IF _usd_update - interval '24 hours' < _usd_update AND _usd_update + interval '24 hours' > _usd_update THEN IF _value > 0.0 THEN IF NEW."amount_f" > 0.0 THEN NEW."amount_usd" = (SELECT _value * NEW."amount_f"); IF NOT NEW."is_l1" AND NEW."fee" > 0 THEN NEW."fee_usd" = (SELECT NEW."amount_usd" * fee_percentage(NEW.fee::NUMERIC)); END IF; END IF; IF NEW."is_l1" AND NEW."deposit_amount_f" > 0.0 THEN NEW."deposit_amount_usd" = (SELECT _value * NEW.deposit_amount_f); END IF; END IF; END IF; -- Set to_{eth_addr,bjj}
IF NEW."to_idx" > 255 THEN SELECT INTO NEW."to_eth_addr", NEW."to_bjj" eth_addr, bjj FROM account WHERE idx = NEW."to_idx"; END IF; RETURN NEW; END; $BODY$ LANGUAGE plpgsql; -- +migrate StatementEnd
CREATE TRIGGER trigger_set_tx BEFORE INSERT ON tx FOR EACH ROW EXECUTE PROCEDURE set_tx();
-- +migrate StatementBegin
CREATE FUNCTION forge_l1_user_txs() RETURNS TRIGGER AS $BODY$ BEGIN IF NEW.forge_l1_txs_num IS NOT NULL THEN UPDATE tx SET item_id = upd.item_id, batch_num = NEW.batch_num FROM ( SELECT id, nextval('tx_item_id') FROM tx WHERE user_origin AND NEW.forge_l1_txs_num = to_forge_l1_txs_num ORDER BY position FOR UPDATE ) as upd (id, item_id) WHERE tx.id = upd.id; END IF; RETURN NEW; END; $BODY$ LANGUAGE plpgsql; -- +migrate StatementEnd
CREATE TRIGGER trigger_forge_l1_txs AFTER INSERT ON batch FOR EACH ROW EXECUTE PROCEDURE forge_l1_user_txs();
CREATE TABLE rollup_vars ( eth_block_num BIGINT PRIMARY KEY REFERENCES block (eth_block_num) ON DELETE CASCADE, fee_add_token BYTEA NOT NULL, forge_l1_timeout BIGINT NOT NULL, withdrawal_delay BIGINT NOT NULL, buckets BYTEA NOT NULL, safe_mode BOOLEAN NOT NULL );
CREATE TABLE bucket_update ( item_id SERIAL PRIMARY KEY, eth_block_num BIGINT NOT NULL REFERENCES block (eth_block_num) ON DELETE CASCADE, num_bucket BIGINT NOT NULL, block_stamp BIGINT NOT NULL, withdrawals BYTEA NOT NULL );
CREATE TABLE token_exchange ( item_id SERIAL PRIMARY KEY, eth_block_num BIGINT NOT NULL REFERENCES block (eth_block_num) ON DELETE CASCADE, eth_addr BYTEA NOT NULL, value_usd BIGINT NOT NULL );
CREATE TABLE escape_hatch_withdrawal ( item_id SERIAL PRIMARY KEY, eth_block_num BIGINT NOT NULL REFERENCES block (eth_block_num) ON DELETE CASCADE, who_addr BYTEA NOT NULL, to_addr BYTEA NOT NULL, token_addr BYTEA NOT NULL, amount BYTEA NOT NULL );
CREATE TABLE auction_vars ( eth_block_num BIGINT PRIMARY KEY REFERENCES block (eth_block_num) ON DELETE CASCADE, donation_address BYTEA NOT NULL, boot_coordinator BYTEA NOT NULL, boot_coordinator_url BYTEA NOT NULL, default_slot_set_bid BYTEA NOT NULL, default_slot_set_bid_slot_num BIGINT NOT NULL, -- slot_num after which the new default_slot_set_bid applies
closed_auction_slots INT NOT NULL, open_auction_slots INT NOT NULL, allocation_ratio VARCHAR(200), outbidding INT NOT NULL, slot_deadline INT NOT NULL );
CREATE TABLE wdelayer_vars ( eth_block_num BIGINT PRIMARY KEY REFERENCES block (eth_block_num) ON DELETE CASCADE, gov_address BYTEA NOT NULL, emg_address BYTEA NOT NULL, withdrawal_delay BIGINT NOT NULL, emergency_start_block BIGINT NOT NULL, emergency_mode BOOLEAN NOT NULL );
-- L2
CREATE TABLE tx_pool ( tx_id BYTEA PRIMARY KEY, from_idx BIGINT NOT NULL, effective_from_eth_addr BYTEA, effective_from_bjj BYTEA, to_idx BIGINT, to_eth_addr BYTEA, to_bjj BYTEA, effective_to_eth_addr BYTEA, effective_to_bjj BYTEA, token_id INT NOT NULL REFERENCES token (token_id) ON DELETE CASCADE, amount BYTEA NOT NULL, amount_f NUMERIC NOT NULL, fee SMALLINT NOT NULL, nonce BIGINT NOT NULL, state CHAR(4) NOT NULL, info VARCHAR, signature BYTEA NOT NULL, timestamp TIMESTAMP WITHOUT TIME ZONE DEFAULT timezone('utc', now()), batch_num BIGINT, rq_from_idx BIGINT, rq_to_idx BIGINT, rq_to_eth_addr BYTEA, rq_to_bjj BYTEA, rq_token_id INT, rq_amount BYTEA, rq_fee SMALLINT, rq_nonce BIGINT, tx_type VARCHAR(40) NOT NULL, client_ip VARCHAR, external_delete BOOLEAN NOT NULL DEFAULT false );
-- +migrate StatementBegin
CREATE FUNCTION set_pool_tx() RETURNS TRIGGER AS $BODY$ BEGIN SELECT INTO NEW."effective_from_eth_addr", NEW."effective_from_bjj" eth_addr, bjj FROM account WHERE idx = NEW."from_idx"; -- Set to_{eth_addr,bjj}
IF NEW.to_idx > 255 THEN SELECT INTO NEW."effective_to_eth_addr", NEW."effective_to_bjj" eth_addr, bjj FROM account WHERE idx = NEW."to_idx"; ELSE NEW."effective_to_eth_addr" = NEW."to_eth_addr"; NEW."effective_to_bjj" = NEW."to_bjj"; END IF; RETURN NEW; END; $BODY$ LANGUAGE plpgsql; -- +migrate StatementEnd
CREATE TRIGGER trigger_set_pool_tx BEFORE INSERT ON tx_pool FOR EACH ROW EXECUTE PROCEDURE set_pool_tx();
CREATE TABLE account_creation_auth ( eth_addr BYTEA PRIMARY KEY, bjj BYTEA NOT NULL, signature BYTEA NOT NULL, timestamp TIMESTAMP WITHOUT TIME ZONE NOT NULL DEFAULT timezone('utc', now()) );
CREATE TABLE node_info ( item_id SERIAL PRIMARY KEY, state BYTEA, -- object returned by GET /state
max_pool_txs BIGINT, -- L2DB config
min_fee NUMERIC, -- L2DB config
constants BYTEA -- info of the network that is constant
); INSERT INTO node_info(item_id) VALUES (1); -- Always have a single row that we will update
-- +migrate Down
-- triggers
DROP TRIGGER IF EXISTS trigger_token_usd_update ON token; DROP TRIGGER IF EXISTS trigger_set_tx ON tx; DROP TRIGGER IF EXISTS trigger_forge_l1_txs ON batch; DROP TRIGGER IF EXISTS trigger_set_pool_tx ON tx_pool; -- functions
DROP FUNCTION IF EXISTS hez_idx; DROP FUNCTION IF EXISTS set_token_usd_update; DROP FUNCTION IF EXISTS fee_percentage; DROP FUNCTION IF EXISTS set_tx; DROP FUNCTION IF EXISTS forge_l1_user_txs; DROP FUNCTION IF EXISTS set_pool_tx; -- drop tables IF EXISTS
DROP TABLE IF EXISTS node_info; DROP TABLE IF EXISTS account_creation_auth; DROP TABLE IF EXISTS tx_pool; DROP TABLE IF EXISTS auction_vars; DROP TABLE IF EXISTS rollup_vars; DROP TABLE IF EXISTS escape_hatch_withdrawal; DROP TABLE IF EXISTS bucket_update; DROP TABLE IF EXISTS token_exchange; DROP TABLE IF EXISTS wdelayer_vars; DROP TABLE IF EXISTS tx; DROP TABLE IF EXISTS exit_tree; DROP TABLE IF EXISTS account_update; DROP TABLE IF EXISTS account; DROP TABLE IF EXISTS token; DROP TABLE IF EXISTS bid; DROP TABLE IF EXISTS batch; DROP TABLE IF EXISTS coordinator; DROP TABLE IF EXISTS block; -- sequences
DROP SEQUENCE IF EXISTS tx_item_id;
|