You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

639 lines
21 KiB

3 years ago
  1. -- +migrate Up
  2. -- History
  3. CREATE TABLE block (
  4. eth_block_num BIGINT PRIMARY KEY,
  5. timestamp TIMESTAMP WITHOUT TIME ZONE NOT NULL,
  6. hash BYTEA NOT NULL
  7. );
  8. CREATE TABLE coordinator (
  9. item_id SERIAL PRIMARY KEY,
  10. bidder_addr BYTEA NOT NULL,
  11. forger_addr BYTEA NOT NULL,
  12. eth_block_num BIGINT NOT NULL REFERENCES block (eth_block_num) ON DELETE CASCADE,
  13. url VARCHAR(200) NOT NULL
  14. );
  15. CREATE TABLE batch (
  16. item_id SERIAL PRIMARY KEY,
  17. batch_num BIGINT UNIQUE NOT NULL,
  18. eth_block_num BIGINT NOT NULL 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. fee_idxs_coordinator BYTEA NOT NULL,
  22. state_root BYTEA NOT NULL,
  23. num_accounts BIGINT NOT NULL,
  24. last_idx BIGINT NOT NULL,
  25. exit_root BYTEA NOT NULL,
  26. forge_l1_txs_num BIGINT,
  27. slot_num BIGINT NOT NULL,
  28. total_fees_usd NUMERIC
  29. );
  30. CREATE TABLE bid (
  31. item_id SERIAL PRIMARY KEY,
  32. slot_num BIGINT NOT NULL,
  33. bid_value BYTEA NOT NULL,
  34. eth_block_num BIGINT NOT NULL REFERENCES block (eth_block_num) ON DELETE CASCADE,
  35. bidder_addr BYTEA NOT NULL -- fake foreign key for coordinator
  36. );
  37. CREATE TABLE token (
  38. item_id SERIAL PRIMARY KEY,
  39. token_id INT UNIQUE NOT NULL,
  40. eth_block_num BIGINT NOT NULL REFERENCES block (eth_block_num) ON DELETE CASCADE,
  41. eth_addr BYTEA UNIQUE NOT NULL,
  42. name VARCHAR(20) NOT NULL,
  43. symbol VARCHAR(10) NOT NULL,
  44. decimals INT NOT NULL,
  45. usd NUMERIC,
  46. usd_update TIMESTAMP WITHOUT TIME ZONE
  47. );
  48. -- Add ETH as TokenID 0
  49. INSERT INTO block (
  50. eth_block_num,
  51. timestamp,
  52. hash
  53. ) VALUES (
  54. 0,
  55. '2015-07-30 03:26:13',
  56. '\xd4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3'
  57. ); -- info from https://etherscan.io/block/0
  58. INSERT INTO token (
  59. token_id,
  60. eth_block_num,
  61. eth_addr,
  62. name,
  63. symbol,
  64. decimals
  65. ) VALUES (
  66. 0,
  67. 0,
  68. '\x0000000000000000000000000000000000000000',
  69. 'Ether',
  70. 'ETH',
  71. 18
  72. );
  73. -- +migrate StatementBegin
  74. CREATE FUNCTION hez_idx(BIGINT, VARCHAR)
  75. RETURNS VARCHAR
  76. AS
  77. $BODY$
  78. BEGIN
  79. IF $1 = 1 THEN
  80. RETURN 'hez:EXIT:1';
  81. END IF;
  82. RETURN 'hez:' || $2 || ':' || $1;
  83. END;
  84. $BODY$
  85. LANGUAGE plpgsql;
  86. -- +migrate StatementEnd
  87. CREATE TABLE account (
  88. item_id SERIAL,
  89. idx BIGINT PRIMARY KEY,
  90. token_id INT NOT NULL REFERENCES token (token_id) ON DELETE CASCADE,
  91. batch_num BIGINT NOT NULL REFERENCES batch (batch_num) ON DELETE CASCADE,
  92. bjj BYTEA NOT NULL,
  93. eth_addr BYTEA NOT NULL
  94. );
  95. CREATE TABLE exit_tree (
  96. item_id SERIAL PRIMARY KEY,
  97. batch_num BIGINT REFERENCES batch (batch_num) ON DELETE CASCADE,
  98. account_idx BIGINT REFERENCES account (idx) ON DELETE CASCADE,
  99. merkle_proof BYTEA NOT NULL,
  100. balance BYTEA NOT NULL,
  101. instant_withdrawn BIGINT REFERENCES block (eth_block_num) ON DELETE SET NULL,
  102. delayed_withdraw_request BIGINT REFERENCES block (eth_block_num) ON DELETE SET NULL,
  103. owner BYTEA,
  104. token BYTEA,
  105. delayed_withdrawn BIGINT REFERENCES block (eth_block_num) ON DELETE SET NULL
  106. );
  107. -- +migrate StatementBegin
  108. CREATE FUNCTION set_token_usd_update()
  109. RETURNS TRIGGER
  110. AS
  111. $BODY$
  112. BEGIN
  113. IF NEW."usd" IS NOT NULL AND NEW."usd_update" IS NULL THEN
  114. NEW."usd_update" = timezone('utc', now());
  115. END IF;
  116. RETURN NEW;
  117. END;
  118. $BODY$
  119. LANGUAGE plpgsql;
  120. -- +migrate StatementEnd
  121. CREATE TRIGGER trigger_token_usd_update BEFORE UPDATE OR INSERT ON token
  122. FOR EACH ROW EXECUTE PROCEDURE set_token_usd_update();
  123. CREATE SEQUENCE tx_item_id;
  124. CREATE TABLE tx (
  125. -- Generic TX
  126. item_id INTEGER PRIMARY KEY DEFAULT nextval('tx_item_id'),
  127. is_l1 BOOLEAN NOT NULL,
  128. id BYTEA,
  129. type VARCHAR(40) NOT NULL,
  130. position INT NOT NULL,
  131. from_idx BIGINT,
  132. from_eth_addr BYTEA,
  133. from_bjj BYTEA,
  134. to_idx BIGINT NOT NULL,
  135. to_eth_addr BYTEA,
  136. to_bjj BYTEA,
  137. amount BYTEA NOT NULL,
  138. amount_f NUMERIC NOT NULL,
  139. token_id INT NOT NULL REFERENCES token (token_id),
  140. amount_usd NUMERIC, -- Value of the amount in USD at the moment the tx was inserted in the DB
  141. 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.
  142. eth_block_num BIGINT NOT NULL REFERENCES block (eth_block_num) ON DELETE CASCADE,
  143. -- L1
  144. to_forge_l1_txs_num BIGINT,
  145. user_origin BOOLEAN,
  146. load_amount BYTEA,
  147. load_amount_f NUMERIC,
  148. load_amount_usd NUMERIC,
  149. -- L2
  150. fee INT,
  151. fee_usd NUMERIC,
  152. nonce BIGINT
  153. );
  154. -- +migrate StatementBegin
  155. CREATE FUNCTION fee_percentage(NUMERIC)
  156. RETURNS NUMERIC
  157. AS
  158. $BODY$
  159. DECLARE perc NUMERIC;
  160. BEGIN
  161. SELECT CASE
  162. WHEN $1 = 000 THEN 0.000000e+00
  163. WHEN $1 = 001 THEN 2.675309e-18
  164. WHEN $1 = 002 THEN 8.251782e-18
  165. WHEN $1 = 003 THEN 2.545198e-17
  166. WHEN $1 = 004 THEN 7.850462e-17
  167. WHEN $1 = 005 THEN 2.421414e-16
  168. WHEN $1 = 006 THEN 7.468660e-16
  169. WHEN $1 = 007 THEN 2.303650e-15
  170. WHEN $1 = 008 THEN 7.105427e-15
  171. WHEN $1 = 009 THEN 2.191613e-14
  172. WHEN $1 = 010 THEN 6.759860e-14
  173. WHEN $1 = 011 THEN 2.085026e-13
  174. WHEN $1 = 012 THEN 6.431099e-13
  175. WHEN $1 = 013 THEN 1.983622e-12
  176. WHEN $1 = 014 THEN 6.118327e-12
  177. WHEN $1 = 015 THEN 1.887150e-11
  178. WHEN $1 = 016 THEN 5.820766e-11
  179. WHEN $1 = 017 THEN 1.795370e-10
  180. WHEN $1 = 018 THEN 5.537677e-10
  181. WHEN $1 = 019 THEN 1.708053e-09
  182. WHEN $1 = 020 THEN 5.268356e-09
  183. WHEN $1 = 021 THEN 1.624983e-08
  184. WHEN $1 = 022 THEN 5.012133e-08
  185. WHEN $1 = 023 THEN 1.545953e-07
  186. WHEN $1 = 024 THEN 4.768372e-07
  187. WHEN $1 = 025 THEN 1.470767e-06
  188. WHEN $1 = 026 THEN 4.536465e-06
  189. WHEN $1 = 027 THEN 1.399237e-05
  190. WHEN $1 = 028 THEN 4.315837e-05
  191. WHEN $1 = 029 THEN 1.331186e-04
  192. WHEN $1 = 030 THEN 4.105940e-04
  193. WHEN $1 = 031 THEN 1.266445e-03
  194. WHEN $1 = 032 THEN 3.906250e-03
  195. WHEN $1 = 033 THEN 4.044004e-03
  196. WHEN $1 = 034 THEN 4.186615e-03
  197. WHEN $1 = 035 THEN 4.334256e-03
  198. WHEN $1 = 036 THEN 4.487103e-03
  199. WHEN $1 = 037 THEN 4.645340e-03
  200. WHEN $1 = 038 THEN 4.809158e-03
  201. WHEN $1 = 039 THEN 4.978752e-03
  202. WHEN $1 = 040 THEN 5.154328e-03
  203. WHEN $1 = 041 THEN 5.336095e-03
  204. WHEN $1 = 042 THEN 5.524272e-03
  205. WHEN $1 = 043 THEN 5.719085e-03
  206. WHEN $1 = 044 THEN 5.920768e-03
  207. WHEN $1 = 045 THEN 6.129563e-03
  208. WHEN $1 = 046 THEN 6.345722e-03
  209. WHEN $1 = 047 THEN 6.569503e-03
  210. WHEN $1 = 048 THEN 6.801176e-03
  211. WHEN $1 = 049 THEN 7.041019e-03
  212. WHEN $1 = 050 THEN 7.289320e-03
  213. WHEN $1 = 051 THEN 7.546378e-03
  214. WHEN $1 = 052 THEN 7.812500e-03
  215. WHEN $1 = 053 THEN 8.088007e-03
  216. WHEN $1 = 054 THEN 8.373230e-03
  217. WHEN $1 = 055 THEN 8.668512e-03
  218. WHEN $1 = 056 THEN 8.974206e-03
  219. WHEN $1 = 057 THEN 9.290681e-03
  220. WHEN $1 = 058 THEN 9.618316e-03
  221. WHEN $1 = 059 THEN 9.957505e-03
  222. WHEN $1 = 060 THEN 1.030866e-02
  223. WHEN $1 = 061 THEN 1.067219e-02
  224. WHEN $1 = 062 THEN 1.104854e-02
  225. WHEN $1 = 063 THEN 1.143817e-02
  226. WHEN $1 = 064 THEN 1.184154e-02
  227. WHEN $1 = 065 THEN 1.225913e-02
  228. WHEN $1 = 066 THEN 1.269144e-02
  229. WHEN $1 = 067 THEN 1.313901e-02
  230. WHEN $1 = 068 THEN 1.360235e-02
  231. WHEN $1 = 069 THEN 1.408204e-02
  232. WHEN $1 = 070 THEN 1.457864e-02
  233. WHEN $1 = 071 THEN 1.509276e-02
  234. WHEN $1 = 072 THEN 1.562500e-02
  235. WHEN $1 = 073 THEN 1.617601e-02
  236. WHEN $1 = 074 THEN 1.674646e-02
  237. WHEN $1 = 075 THEN 1.733702e-02
  238. WHEN $1 = 076 THEN 1.794841e-02
  239. WHEN $1 = 077 THEN 1.858136e-02
  240. WHEN $1 = 078 THEN 1.923663e-02
  241. WHEN $1 = 079 THEN 1.991501e-02
  242. WHEN $1 = 080 THEN 2.061731e-02
  243. WHEN $1 = 081 THEN 2.134438e-02
  244. WHEN $1 = 082 THEN 2.209709e-02
  245. WHEN $1 = 083 THEN 2.287634e-02
  246. WHEN $1 = 084 THEN 2.368307e-02
  247. WHEN $1 = 085 THEN 2.451825e-02
  248. WHEN $1 = 086 THEN 2.538289e-02
  249. WHEN $1 = 087 THEN 2.627801e-02
  250. WHEN $1 = 088 THEN 2.720471e-02
  251. WHEN $1 = 089 THEN 2.816408e-02
  252. WHEN $1 = 090 THEN 2.915728e-02
  253. WHEN $1 = 091 THEN 3.018551e-02
  254. WHEN $1 = 092 THEN 3.125000e-02
  255. WHEN $1 = 093 THEN 3.235203e-02
  256. WHEN $1 = 094 THEN 3.349292e-02
  257. WHEN $1 = 095 THEN 3.467405e-02
  258. WHEN $1 = 096 THEN 3.589682e-02
  259. WHEN $1 = 097 THEN 3.716272e-02
  260. WHEN $1 = 098 THEN 3.847326e-02
  261. WHEN $1 = 099 THEN 3.983002e-02
  262. WHEN $1 = 100 THEN 4.123462e-02
  263. WHEN $1 = 101 THEN 4.268876e-02
  264. WHEN $1 = 102 THEN 4.419417e-02
  265. WHEN $1 = 103 THEN 4.575268e-02
  266. WHEN $1 = 104 THEN 4.736614e-02
  267. WHEN $1 = 105 THEN 4.903651e-02
  268. WHEN $1 = 106 THEN 5.076577e-02
  269. WHEN $1 = 107 THEN 5.255603e-02
  270. WHEN $1 = 108 THEN 5.440941e-02
  271. WHEN $1 = 109 THEN 5.632815e-02
  272. WHEN $1 = 110 THEN 5.831456e-02
  273. WHEN $1 = 111 THEN 6.037102e-02
  274. WHEN $1 = 112 THEN 6.250000e-02
  275. WHEN $1 = 113 THEN 6.470406e-02
  276. WHEN $1 = 114 THEN 6.698584e-02
  277. WHEN $1 = 115 THEN 6.934809e-02
  278. WHEN $1 = 116 THEN 7.179365e-02
  279. WHEN $1 = 117 THEN 7.432544e-02
  280. WHEN $1 = 118 THEN 7.694653e-02
  281. WHEN $1 = 119 THEN 7.966004e-02
  282. WHEN $1 = 120 THEN 8.246924e-02
  283. WHEN $1 = 121 THEN 8.537752e-02
  284. WHEN $1 = 122 THEN 8.838835e-02
  285. WHEN $1 = 123 THEN 9.150536e-02
  286. WHEN $1 = 124 THEN 9.473229e-02
  287. WHEN $1 = 125 THEN 9.807301e-02
  288. WHEN $1 = 126 THEN 1.015315e-01
  289. WHEN $1 = 127 THEN 1.051121e-01
  290. WHEN $1 = 128 THEN 1.088188e-01
  291. WHEN $1 = 129 THEN 1.126563e-01
  292. WHEN $1 = 130 THEN 1.166291e-01
  293. WHEN $1 = 131 THEN 1.207420e-01
  294. WHEN $1 = 132 THEN 1.250000e-01
  295. WHEN $1 = 133 THEN 1.294081e-01
  296. WHEN $1 = 134 THEN 1.339717e-01
  297. WHEN $1 = 135 THEN 1.386962e-01
  298. WHEN $1 = 136 THEN 1.435873e-01
  299. WHEN $1 = 137 THEN 1.486509e-01
  300. WHEN $1 = 138 THEN 1.538931e-01
  301. WHEN $1 = 139 THEN 1.593201e-01
  302. WHEN $1 = 140 THEN 1.649385e-01
  303. WHEN $1 = 141 THEN 1.707550e-01
  304. WHEN $1 = 142 THEN 1.767767e-01
  305. WHEN $1 = 143 THEN 1.830107e-01
  306. WHEN $1 = 144 THEN 1.894646e-01
  307. WHEN $1 = 145 THEN 1.961460e-01
  308. WHEN $1 = 146 THEN 2.030631e-01
  309. WHEN $1 = 147 THEN 2.102241e-01
  310. WHEN $1 = 148 THEN 2.176376e-01
  311. WHEN $1 = 149 THEN 2.253126e-01
  312. WHEN $1 = 150 THEN 2.332582e-01
  313. WHEN $1 = 151 THEN 2.414841e-01
  314. WHEN $1 = 152 THEN 2.500000e-01
  315. WHEN $1 = 153 THEN 2.588162e-01
  316. WHEN $1 = 154 THEN 2.679434e-01
  317. WHEN $1 = 155 THEN 2.773924e-01
  318. WHEN $1 = 156 THEN 2.871746e-01
  319. WHEN $1 = 157 THEN 2.973018e-01
  320. WHEN $1 = 158 THEN 3.077861e-01
  321. WHEN $1 = 159 THEN 3.186402e-01
  322. WHEN $1 = 160 THEN 3.298770e-01
  323. WHEN $1 = 161 THEN 3.415101e-01
  324. WHEN $1 = 162 THEN 3.535534e-01
  325. WHEN $1 = 163 THEN 3.660214e-01
  326. WHEN $1 = 164 THEN 3.789291e-01
  327. WHEN $1 = 165 THEN 3.922920e-01
  328. WHEN $1 = 166 THEN 4.061262e-01
  329. WHEN $1 = 167 THEN 4.204482e-01
  330. WHEN $1 = 168 THEN 4.352753e-01
  331. WHEN $1 = 169 THEN 4.506252e-01
  332. WHEN $1 = 170 THEN 4.665165e-01
  333. WHEN $1 = 171 THEN 4.829682e-01
  334. WHEN $1 = 172 THEN 5.000000e-01
  335. WHEN $1 = 173 THEN 5.176325e-01
  336. WHEN $1 = 174 THEN 5.358867e-01
  337. WHEN $1 = 175 THEN 5.547847e-01
  338. WHEN $1 = 176 THEN 5.743492e-01
  339. WHEN $1 = 177 THEN 5.946036e-01
  340. WHEN $1 = 178 THEN 6.155722e-01
  341. WHEN $1 = 179 THEN 6.372803e-01
  342. WHEN $1 = 180 THEN 6.597540e-01
  343. WHEN $1 = 181 THEN 6.830201e-01
  344. WHEN $1 = 182 THEN 7.071068e-01
  345. WHEN $1 = 183 THEN 7.320428e-01
  346. WHEN $1 = 184 THEN 7.578583e-01
  347. WHEN $1 = 185 THEN 7.845841e-01
  348. WHEN $1 = 186 THEN 8.122524e-01
  349. WHEN $1 = 187 THEN 8.408964e-01
  350. WHEN $1 = 188 THEN 8.705506e-01
  351. WHEN $1 = 189 THEN 9.012505e-01
  352. WHEN $1 = 190 THEN 9.330330e-01
  353. WHEN $1 = 191 THEN 9.659363e-01
  354. WHEN $1 = 192 THEN 1.000000e+00
  355. WHEN $1 = 193 THEN 2.000000e+00
  356. WHEN $1 = 194 THEN 4.000000e+00
  357. WHEN $1 = 195 THEN 8.000000e+00
  358. WHEN $1 = 196 THEN 1.600000e+01
  359. WHEN $1 = 197 THEN 3.200000e+01
  360. WHEN $1 = 198 THEN 6.400000e+01
  361. WHEN $1 = 199 THEN 1.280000e+02
  362. WHEN $1 = 200 THEN 2.560000e+02
  363. WHEN $1 = 201 THEN 5.120000e+02
  364. WHEN $1 = 202 THEN 1.024000e+03
  365. WHEN $1 = 203 THEN 2.048000e+03
  366. WHEN $1 = 204 THEN 4.096000e+03
  367. WHEN $1 = 205 THEN 8.192000e+03
  368. WHEN $1 = 206 THEN 1.638400e+04
  369. WHEN $1 = 207 THEN 3.276800e+04
  370. WHEN $1 = 208 THEN 6.553600e+04
  371. WHEN $1 = 209 THEN 1.310720e+05
  372. WHEN $1 = 210 THEN 2.621440e+05
  373. WHEN $1 = 211 THEN 5.242880e+05
  374. WHEN $1 = 212 THEN 1.048576e+06
  375. WHEN $1 = 213 THEN 2.097152e+06
  376. WHEN $1 = 214 THEN 4.194304e+06
  377. WHEN $1 = 215 THEN 8.388608e+06
  378. WHEN $1 = 216 THEN 1.677722e+07
  379. WHEN $1 = 217 THEN 3.355443e+07
  380. WHEN $1 = 218 THEN 6.710886e+07
  381. WHEN $1 = 219 THEN 1.342177e+08
  382. WHEN $1 = 220 THEN 2.684355e+08
  383. WHEN $1 = 221 THEN 5.368709e+08
  384. WHEN $1 = 222 THEN 1.073742e+09
  385. WHEN $1 = 223 THEN 2.147484e+09
  386. WHEN $1 = 224 THEN 4.294967e+09
  387. WHEN $1 = 225 THEN 8.589935e+09
  388. WHEN $1 = 226 THEN 1.717987e+10
  389. WHEN $1 = 227 THEN 3.435974e+10
  390. WHEN $1 = 228 THEN 6.871948e+10
  391. WHEN $1 = 229 THEN 1.374390e+11
  392. WHEN $1 = 230 THEN 2.748779e+11
  393. WHEN $1 = 231 THEN 5.497558e+11
  394. WHEN $1 = 232 THEN 1.099512e+12
  395. WHEN $1 = 233 THEN 2.199023e+12
  396. WHEN $1 = 234 THEN 4.398047e+12
  397. WHEN $1 = 235 THEN 8.796093e+12
  398. WHEN $1 = 236 THEN 1.759219e+13
  399. WHEN $1 = 237 THEN 3.518437e+13
  400. WHEN $1 = 238 THEN 7.036874e+13
  401. WHEN $1 = 239 THEN 1.407375e+14
  402. WHEN $1 = 240 THEN 2.814750e+14
  403. WHEN $1 = 241 THEN 5.629500e+14
  404. WHEN $1 = 242 THEN 1.125900e+15
  405. WHEN $1 = 243 THEN 2.251800e+15
  406. WHEN $1 = 244 THEN 4.503600e+15
  407. WHEN $1 = 245 THEN 9.007199e+15
  408. WHEN $1 = 246 THEN 1.801440e+16
  409. WHEN $1 = 247 THEN 3.602880e+16
  410. WHEN $1 = 248 THEN 7.205759e+16
  411. WHEN $1 = 249 THEN 1.441152e+17
  412. WHEN $1 = 250 THEN 2.882304e+17
  413. WHEN $1 = 251 THEN 5.764608e+17
  414. WHEN $1 = 252 THEN 1.152922e+18
  415. WHEN $1 = 253 THEN 2.305843e+18
  416. WHEN $1 = 254 THEN 4.611686e+18
  417. WHEN $1 = 255 THEN 9.223372e+18
  418. END INTO perc;
  419. RETURN perc;
  420. END;
  421. $BODY$
  422. LANGUAGE plpgsql;
  423. -- +migrate StatementEnd
  424. -- +migrate StatementBegin
  425. CREATE FUNCTION set_tx()
  426. RETURNS TRIGGER
  427. AS
  428. $BODY$
  429. DECLARE
  430. _value NUMERIC;
  431. _usd_update TIMESTAMP;
  432. _tx_timestamp TIMESTAMP;
  433. BEGIN
  434. IF NEW.is_l1 THEN
  435. -- Validate L1 Tx
  436. IF NEW.user_origin IS NULL OR
  437. NEW.from_eth_addr IS NULL OR
  438. NEW.from_bjj IS NULL OR
  439. NEW.load_amount IS NULL OR
  440. NEW.load_amount_f IS NULL OR
  441. (NOT NEW.user_origin AND NEW.batch_num IS NULL) THEN -- If is Coordinator L1, must include batch_num
  442. RAISE EXCEPTION 'Invalid L1 tx: %', NEW;
  443. END IF;
  444. ELSE
  445. -- Validate L2 Tx
  446. IF NEW.batch_num IS NULL OR NEW.nonce IS NULL THEN
  447. RAISE EXCEPTION 'Invalid L2 tx: %', NEW;
  448. END IF;
  449. -- Set fee if it's null
  450. IF NEW.fee IS NULL THEN
  451. NEW.fee = (SELECT 0);
  452. END IF;
  453. -- Set token_id
  454. NEW."token_id" = (SELECT token_id FROM account WHERE idx = NEW."from_idx");
  455. -- Set from_{eth_addr,bjj}
  456. SELECT INTO NEW."from_eth_addr", NEW."from_bjj" eth_addr, bjj FROM account WHERE idx = NEW.from_idx;
  457. END IF;
  458. -- Set USD related
  459. SELECT INTO _value, _usd_update, _tx_timestamp
  460. 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;
  461. IF _usd_update - interval '24 hours' < _usd_update AND _usd_update + interval '24 hours' > _usd_update THEN
  462. IF _value > 0.0 THEN
  463. IF NEW."amount_f" > 0.0 THEN
  464. NEW."amount_usd" = (SELECT _value * NEW."amount_f");
  465. IF NOT NEW."is_l1" AND NEW."fee" > 0 THEN
  466. NEW."fee_usd" = (SELECT NEW."amount_usd" * fee_percentage(NEW.fee::NUMERIC));
  467. END IF;
  468. END IF;
  469. IF NEW."is_l1" AND NEW."load_amount_f" > 0.0 THEN
  470. NEW."load_amount_usd" = (SELECT _value * NEW.load_amount_f);
  471. END IF;
  472. END IF;
  473. END IF;
  474. -- Set to_{eth_addr,bjj}
  475. IF NEW."to_idx" > 255 THEN
  476. SELECT INTO NEW."to_eth_addr", NEW."to_bjj" eth_addr, bjj FROM account WHERE idx = NEW."to_idx";
  477. END IF;
  478. RETURN NEW;
  479. END;
  480. $BODY$
  481. LANGUAGE plpgsql;
  482. -- +migrate StatementEnd
  483. CREATE TRIGGER trigger_set_tx BEFORE INSERT ON tx
  484. FOR EACH ROW EXECUTE PROCEDURE set_tx();
  485. -- +migrate StatementBegin
  486. CREATE FUNCTION forge_l1_user_txs()
  487. RETURNS TRIGGER
  488. AS
  489. $BODY$
  490. BEGIN
  491. IF NEW.forge_l1_txs_num IS NOT NULL THEN
  492. UPDATE tx
  493. SET item_id = nextval('tx_item_id'), batch_num = NEW.batch_num
  494. WHERE id IN (
  495. SELECT id FROM tx
  496. WHERE user_origin AND NEW.forge_l1_txs_num = to_forge_l1_txs_num
  497. ORDER BY position
  498. FOR UPDATE
  499. );
  500. END IF;
  501. RETURN NEW;
  502. END;
  503. $BODY$
  504. LANGUAGE plpgsql;
  505. -- +migrate StatementEnd
  506. CREATE TRIGGER trigger_forge_l1_txs AFTER INSERT ON batch
  507. FOR EACH ROW EXECUTE PROCEDURE forge_l1_user_txs();
  508. CREATE TABLE rollup_vars (
  509. eth_block_num BIGINT PRIMARY KEY REFERENCES block (eth_block_num) ON DELETE CASCADE,
  510. fee_add_token BYTEA NOT NULL,
  511. forge_l1_timeout BIGINT NOT NULL,
  512. withdrawal_delay BIGINT NOT NULL,
  513. buckets BYTEA
  514. );
  515. CREATE TABLE auction_vars (
  516. eth_block_num BIGINT PRIMARY KEY REFERENCES block (eth_block_num) ON DELETE CASCADE,
  517. donation_address BYTEA NOT NULL,
  518. boot_coordinator BYTEA NOT NULL,
  519. default_slot_set_bid BYTEA NOT NULL,
  520. closed_auction_slots INT NOT NULL,
  521. open_auction_slots INT NOT NULL,
  522. allocation_ratio VARCHAR(200),
  523. outbidding INT NOT NULL,
  524. slot_deadline INT NOT NULL
  525. );
  526. CREATE TABLE wdelayer_vars (
  527. eth_block_num BIGINT PRIMARY KEY REFERENCES block (eth_block_num) ON DELETE CASCADE,
  528. govdao_address BYTEA NOT NULL,
  529. whg_address BYTEA NOT NULL,
  530. keeper_address BYTEA NOT NULL,
  531. withdrawal_delay BIGINT NOT NULL,
  532. emergency_start_time BIGINT NOT NULL,
  533. emergency_mode BOOLEAN NOT NULL
  534. );
  535. -- L2
  536. CREATE TABLE tx_pool (
  537. tx_id BYTEA PRIMARY KEY,
  538. from_idx BIGINT NOT NULL,
  539. from_eth_addr BYTEA,
  540. from_bjj BYTEA,
  541. to_idx BIGINT,
  542. to_eth_addr BYTEA,
  543. to_bjj BYTEA,
  544. token_id INT NOT NULL REFERENCES token (token_id) ON DELETE CASCADE,
  545. amount BYTEA NOT NULL,
  546. amount_f NUMERIC NOT NULL,
  547. fee SMALLINT NOT NULL,
  548. nonce BIGINT NOT NULL,
  549. state CHAR(4) NOT NULL,
  550. signature BYTEA NOT NULL,
  551. timestamp TIMESTAMP WITHOUT TIME ZONE DEFAULT timezone('utc', now()),
  552. batch_num BIGINT,
  553. rq_from_idx BIGINT,
  554. rq_to_idx BIGINT,
  555. rq_to_eth_addr BYTEA,
  556. rq_to_bjj BYTEA,
  557. rq_token_id INT,
  558. rq_amount BYTEA,
  559. rq_fee SMALLINT,
  560. rq_nonce BIGINT,
  561. tx_type VARCHAR(40) NOT NULL
  562. );
  563. -- +migrate StatementBegin
  564. CREATE FUNCTION set_pool_tx()
  565. RETURNS TRIGGER
  566. AS
  567. $BODY$
  568. BEGIN
  569. SELECT INTO NEW."from_eth_addr", NEW."from_bjj" eth_addr, bjj FROM account WHERE idx = NEW."from_idx";
  570. -- Set to_{eth_addr,bjj}
  571. IF NEW.to_idx > 255 THEN
  572. SELECT INTO NEW."to_eth_addr", NEW."to_bjj" eth_addr, bjj FROM account WHERE idx = NEW."to_idx";
  573. END IF;
  574. RETURN NEW;
  575. END;
  576. $BODY$
  577. LANGUAGE plpgsql;
  578. -- +migrate StatementEnd
  579. CREATE TRIGGER trigger_set_pool_tx BEFORE INSERT ON tx_pool
  580. FOR EACH ROW EXECUTE PROCEDURE set_pool_tx();
  581. CREATE TABLE account_creation_auth (
  582. eth_addr BYTEA PRIMARY KEY,
  583. bjj BYTEA NOT NULL,
  584. signature BYTEA NOT NULL,
  585. timestamp TIMESTAMP WITHOUT TIME ZONE NOT NULL DEFAULT timezone('utc', now())
  586. );
  587. -- +migrate Down
  588. -- drop triggers
  589. DROP TRIGGER trigger_token_usd_update ON token;
  590. DROP TRIGGER trigger_set_tx ON tx;
  591. DROP TRIGGER trigger_forge_l1_txs ON batch;
  592. DROP TRIGGER trigger_set_pool_tx ON tx_pool;
  593. -- drop functions
  594. DROP FUNCTION hez_idx;
  595. DROP FUNCTION set_token_usd_update;
  596. DROP FUNCTION fee_percentage;
  597. DROP FUNCTION set_tx;
  598. DROP FUNCTION forge_l1_user_txs;
  599. DROP FUNCTION set_pool_tx;
  600. -- drop tables
  601. DROP TABLE account_creation_auth;
  602. DROP TABLE tx_pool;
  603. DROP TABLE auction_vars;
  604. DROP TABLE rollup_vars;
  605. DROP TABLE wdelayer_vars;
  606. DROP TABLE tx;
  607. DROP TABLE exit_tree;
  608. DROP TABLE account;
  609. DROP TABLE token;
  610. DROP TABLE bid;
  611. DROP TABLE batch;
  612. DROP TABLE coordinator;
  613. DROP TABLE block;
  614. -- drop sequences
  615. DROP SEQUENCE tx_item_id;