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.

642 lines
21 KiB

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