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.

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