osbc 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (310) hide show
  1. checksums.yaml +7 -0
  2. data/.env +5 -0
  3. data/.rspec +1 -0
  4. data/.rubocop.yml +273 -0
  5. data/.ruby-version +1 -0
  6. data/CHANGELOG.md +5 -0
  7. data/CODE_OF_CONDUCT.md +84 -0
  8. data/Dockerfile +17 -0
  9. data/Gemfile +109 -0
  10. data/Gemfile.lock +343 -0
  11. data/LICENSE.md +21 -0
  12. data/LICENSE.txt +21 -0
  13. data/Procfile +3 -0
  14. data/Procfile.dev +2 -0
  15. data/README.md +185 -0
  16. data/Rakefile +6 -0
  17. data/app/assets/builds/.keep +0 -0
  18. data/app/assets/config/manifest.js +5 -0
  19. data/app/assets/images/.keep +0 -0
  20. data/app/assets/images/bg.png +0 -0
  21. data/app/assets/images/gimage.png +0 -0
  22. data/app/assets/images/image.png +0 -0
  23. data/app/assets/images/logo.png +0 -0
  24. data/app/assets/images/outerspc.jpg +0 -0
  25. data/app/assets/images/proxy.jpg +0 -0
  26. data/app/assets/images/space.jpg +0 -0
  27. data/app/assets/images/space_four.jpg +0 -0
  28. data/app/assets/images/space_t.jpg +0 -0
  29. data/app/assets/images/space_th.jpg +0 -0
  30. data/app/assets/images/space_two.jpg +0 -0
  31. data/app/assets/images/th.jpg +0 -0
  32. data/app/assets/stylesheets/application.css +344 -0
  33. data/app/assets/stylesheets/application.tailwind.css +13 -0
  34. data/app/assets/stylesheets/home.css +0 -0
  35. data/app/channels/application_cable/channel.rb +6 -0
  36. data/app/channels/application_cable/connection.rb +6 -0
  37. data/app/controllers/api/v1/block_confirmations_controller.rb +65 -0
  38. data/app/controllers/application_controller.rb +72 -0
  39. data/app/controllers/blocks_controller.rb +20 -0
  40. data/app/controllers/chains_controller.rb +72 -0
  41. data/app/controllers/concerns/.keep +0 -0
  42. data/app/controllers/contracts_controller.rb +25 -0
  43. data/app/controllers/pools_controller.rb +73 -0
  44. data/app/controllers/signatures_controller.rb +25 -0
  45. data/app/controllers/tickets_controller.rb +76 -0
  46. data/app/controllers/transactions_controller.rb +48 -0
  47. data/app/controllers/users/confirmations_controller.rb +30 -0
  48. data/app/controllers/users/omniauth_callbacks_controller.rb +30 -0
  49. data/app/controllers/users/passwords_controller.rb +34 -0
  50. data/app/controllers/users/registrations_controller.rb +61 -0
  51. data/app/controllers/users/sessions_controller.rb +27 -0
  52. data/app/controllers/users/unlocks_controller.rb +30 -0
  53. data/app/controllers/wallets_controller.rb +18 -0
  54. data/app/helpers/application_helper.rb +4 -0
  55. data/app/helpers/blocks_helper.rb +4 -0
  56. data/app/helpers/chains_helper.rb +4 -0
  57. data/app/helpers/contracts_helper.rb +4 -0
  58. data/app/helpers/pools_helper.rb +4 -0
  59. data/app/helpers/signatures_helper.rb +4 -0
  60. data/app/helpers/tickets_helper.rb +4 -0
  61. data/app/helpers/transactions_helper.rb +4 -0
  62. data/app/helpers/wallets_helper.rb +4 -0
  63. data/app/javascript/application.js +3 -0
  64. data/app/javascript/controllers/application.js +9 -0
  65. data/app/javascript/controllers/hello_controller.js +7 -0
  66. data/app/javascript/controllers/index.js +11 -0
  67. data/app/jobs/application_job.rb +9 -0
  68. data/app/mailers/application_mailer.rb +6 -0
  69. data/app/models/acceptable_number_sequence.rb +4 -0
  70. data/app/models/acceptable_symbol_sequence.rb +4 -0
  71. data/app/models/acceptable_word.rb +4 -0
  72. data/app/models/application_record.rb +5 -0
  73. data/app/models/block.rb +17 -0
  74. data/app/models/chain.rb +10 -0
  75. data/app/models/concerns/.keep +0 -0
  76. data/app/models/concerns/sequences_validator.rb +30 -0
  77. data/app/models/concerns/wallet_exists_validator.rb +13 -0
  78. data/app/models/contract.rb +7 -0
  79. data/app/models/pool.rb +5 -0
  80. data/app/models/signature.rb +12 -0
  81. data/app/models/ticket.rb +11 -0
  82. data/app/models/transaction.rb +25 -0
  83. data/app/models/user.rb +44 -0
  84. data/app/models/wallet.rb +33 -0
  85. data/app/services/application_service.rb +23 -0
  86. data/app/services/assign_contracts_service.rb +162 -0
  87. data/app/services/create_ticket_service.rb +87 -0
  88. data/app/services/create_wallet_service.rb +20 -0
  89. data/app/services/transaction_to_block_service.rb +62 -0
  90. data/app/views/application/_featured_board.html.erb +77 -0
  91. data/app/views/application/home.html.slim +1 -0
  92. data/app/views/application/mining_profile.html.slim +59 -0
  93. data/app/views/application/privacy_policy.html.erb +0 -0
  94. data/app/views/application/terms.html.erb +0 -0
  95. data/app/views/blocks/_block.html.slim +13 -0
  96. data/app/views/blocks/_block.json.jbuilder +4 -0
  97. data/app/views/blocks/_form.html.slim +26 -0
  98. data/app/views/blocks/edit.html.slim +10 -0
  99. data/app/views/blocks/index.html.slim +12 -0
  100. data/app/views/blocks/index.json.jbuilder +3 -0
  101. data/app/views/blocks/new.html.slim +8 -0
  102. data/app/views/blocks/show.html.slim +8 -0
  103. data/app/views/blocks/show.json.jbuilder +3 -0
  104. data/app/views/chains/_chain.html.slim +16 -0
  105. data/app/views/chains/_chain.json.jbuilder +4 -0
  106. data/app/views/chains/_form.html.slim +30 -0
  107. data/app/views/chains/edit.html.slim +10 -0
  108. data/app/views/chains/index.html.slim +11 -0
  109. data/app/views/chains/index.json.jbuilder +3 -0
  110. data/app/views/chains/new.html.slim +8 -0
  111. data/app/views/chains/show.html.slim +10 -0
  112. data/app/views/chains/show.json.jbuilder +3 -0
  113. data/app/views/contracts/_contract.html.slim +8 -0
  114. data/app/views/contracts/_contract.json.jbuilder +4 -0
  115. data/app/views/contracts/_form.html.slim +34 -0
  116. data/app/views/contracts/edit.html.slim +10 -0
  117. data/app/views/contracts/index.html.slim +12 -0
  118. data/app/views/contracts/index.json.jbuilder +3 -0
  119. data/app/views/contracts/new.html.slim +8 -0
  120. data/app/views/contracts/show.html.slim +8 -0
  121. data/app/views/contracts/show.json.jbuilder +3 -0
  122. data/app/views/layouts/_alert.html.slim +6 -0
  123. data/app/views/layouts/_navbar.html.slim +27 -0
  124. data/app/views/layouts/_notice.html.slim +6 -0
  125. data/app/views/layouts/application.html.erb +32 -0
  126. data/app/views/layouts/mailer.html.erb +13 -0
  127. data/app/views/layouts/mailer.text.erb +1 -0
  128. data/app/views/pools/_form.html.slim +30 -0
  129. data/app/views/pools/_pool.html.slim +16 -0
  130. data/app/views/pools/_pool.json.jbuilder +4 -0
  131. data/app/views/pools/edit.html.slim +10 -0
  132. data/app/views/pools/index.html.slim +12 -0
  133. data/app/views/pools/index.json.jbuilder +3 -0
  134. data/app/views/pools/new.html.slim +8 -0
  135. data/app/views/pools/show.html.slim +8 -0
  136. data/app/views/pools/show.json.jbuilder +3 -0
  137. data/app/views/signatures/_form.html.slim +46 -0
  138. data/app/views/signatures/_signature.html.slim +28 -0
  139. data/app/views/signatures/_signature.json.jbuilder +4 -0
  140. data/app/views/signatures/edit.html.slim +10 -0
  141. data/app/views/signatures/index.html.slim +10 -0
  142. data/app/views/signatures/index.json.jbuilder +3 -0
  143. data/app/views/signatures/new.html.slim +8 -0
  144. data/app/views/signatures/show.html.slim +10 -0
  145. data/app/views/signatures/show.json.jbuilder +3 -0
  146. data/app/views/tickets/_form.html.slim +26 -0
  147. data/app/views/tickets/_ticket.html.slim +10 -0
  148. data/app/views/tickets/_ticket.json.jbuilder +4 -0
  149. data/app/views/tickets/edit.html.slim +10 -0
  150. data/app/views/tickets/index.html.slim +16 -0
  151. data/app/views/tickets/index.json.jbuilder +3 -0
  152. data/app/views/tickets/new.html.slim +10 -0
  153. data/app/views/tickets/show.html.slim +8 -0
  154. data/app/views/tickets/show.json.jbuilder +3 -0
  155. data/app/views/transactions/_form.html.slim +16 -0
  156. data/app/views/transactions/_transaction.html.slim +24 -0
  157. data/app/views/transactions/_transaction.json.jbuilder +4 -0
  158. data/app/views/transactions/edit.html.slim +10 -0
  159. data/app/views/transactions/index.html.slim +19 -0
  160. data/app/views/transactions/index.json.jbuilder +3 -0
  161. data/app/views/transactions/new.html.slim +9 -0
  162. data/app/views/transactions/show.html.slim +8 -0
  163. data/app/views/transactions/show.json.jbuilder +3 -0
  164. data/app/views/users/confirmations/new.html.erb +16 -0
  165. data/app/views/users/mailer/confirmation_instructions.html.erb +5 -0
  166. data/app/views/users/mailer/email_changed.html.erb +7 -0
  167. data/app/views/users/mailer/password_change.html.erb +3 -0
  168. data/app/views/users/mailer/reset_password_instructions.html.erb +8 -0
  169. data/app/views/users/mailer/unlock_instructions.html.erb +7 -0
  170. data/app/views/users/passwords/edit.html.erb +25 -0
  171. data/app/views/users/passwords/new.html.erb +16 -0
  172. data/app/views/users/registrations/edit.html.erb +43 -0
  173. data/app/views/users/registrations/new.html.erb +37 -0
  174. data/app/views/users/sessions/new.html.erb +30 -0
  175. data/app/views/users/shared/_error_messages.html.erb +15 -0
  176. data/app/views/users/shared/_links.html.erb +25 -0
  177. data/app/views/users/unlocks/new.html.erb +16 -0
  178. data/app/views/wallets/_form.html.slim +30 -0
  179. data/app/views/wallets/_wallet.html.slim +13 -0
  180. data/app/views/wallets/_wallet.json.jbuilder +4 -0
  181. data/app/views/wallets/edit.html.slim +10 -0
  182. data/app/views/wallets/index.html.slim +18 -0
  183. data/app/views/wallets/index.json.jbuilder +3 -0
  184. data/app/views/wallets/new.html.slim +8 -0
  185. data/app/views/wallets/show.html.slim +11 -0
  186. data/app/views/wallets/show.json.jbuilder +3 -0
  187. data/app/workers/application_worker.rb +82 -0
  188. data/app/workers/assign_contract_worker.rb +27 -0
  189. data/app/workers/create_ticket_worker.rb +23 -0
  190. data/app/workers/create_wallet_worker.rb +21 -0
  191. data/app/workers/transaction_to_block_worker.rb +48 -0
  192. data/bin/bundle +114 -0
  193. data/bin/console +15 -0
  194. data/bin/dev +9 -0
  195. data/bin/importmap +5 -0
  196. data/bin/osbc +77 -0
  197. data/bin/rails +6 -0
  198. data/bin/rake +6 -0
  199. data/bin/setup +35 -0
  200. data/config/application.rb +25 -0
  201. data/config/boot.rb +6 -0
  202. data/config/cable.yml +10 -0
  203. data/config/credentials.yml.enc +1 -0
  204. data/config/database.yml +21 -0
  205. data/config/environment.rb +7 -0
  206. data/config/environments/development.rb +73 -0
  207. data/config/environments/production.rb +95 -0
  208. data/config/environments/test.rb +62 -0
  209. data/config/importmap.rb +9 -0
  210. data/config/initializers/assets.rb +14 -0
  211. data/config/initializers/content_security_policy.rb +26 -0
  212. data/config/initializers/devise.rb +311 -0
  213. data/config/initializers/filter_parameter_logging.rb +10 -0
  214. data/config/initializers/inflections.rb +17 -0
  215. data/config/initializers/permissions_policy.rb +12 -0
  216. data/config/locales/devise.en.yml +65 -0
  217. data/config/locales/en.yml +33 -0
  218. data/config/puma.rb +45 -0
  219. data/config/routes/api.rb +9 -0
  220. data/config/routes.rb +30 -0
  221. data/config/sidekiq.yml +10 -0
  222. data/config/storage.yml +34 -0
  223. data/config/tailwind.config.js +23 -0
  224. data/config.ru +8 -0
  225. data/coverage/.last_run.json +5 -0
  226. data/coverage/.resultset.json +1853 -0
  227. data/coverage/.resultset.json.lock +0 -0
  228. data/coverage/assets/0.12.3/DataTables-1.10.20/images/sort_asc.png +0 -0
  229. data/coverage/assets/0.12.3/DataTables-1.10.20/images/sort_asc_disabled.png +0 -0
  230. data/coverage/assets/0.12.3/DataTables-1.10.20/images/sort_both.png +0 -0
  231. data/coverage/assets/0.12.3/DataTables-1.10.20/images/sort_desc.png +0 -0
  232. data/coverage/assets/0.12.3/DataTables-1.10.20/images/sort_desc_disabled.png +0 -0
  233. data/coverage/assets/0.12.3/application.css +1 -0
  234. data/coverage/assets/0.12.3/application.js +7 -0
  235. data/coverage/assets/0.12.3/colorbox/border.png +0 -0
  236. data/coverage/assets/0.12.3/colorbox/controls.png +0 -0
  237. data/coverage/assets/0.12.3/colorbox/loading.gif +0 -0
  238. data/coverage/assets/0.12.3/colorbox/loading_background.png +0 -0
  239. data/coverage/assets/0.12.3/favicon_green.png +0 -0
  240. data/coverage/assets/0.12.3/favicon_red.png +0 -0
  241. data/coverage/assets/0.12.3/favicon_yellow.png +0 -0
  242. data/coverage/assets/0.12.3/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  243. data/coverage/assets/0.12.3/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  244. data/coverage/assets/0.12.3/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  245. data/coverage/assets/0.12.3/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  246. data/coverage/assets/0.12.3/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  247. data/coverage/assets/0.12.3/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  248. data/coverage/assets/0.12.3/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  249. data/coverage/assets/0.12.3/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  250. data/coverage/assets/0.12.3/images/ui-icons_222222_256x240.png +0 -0
  251. data/coverage/assets/0.12.3/images/ui-icons_2e83ff_256x240.png +0 -0
  252. data/coverage/assets/0.12.3/images/ui-icons_454545_256x240.png +0 -0
  253. data/coverage/assets/0.12.3/images/ui-icons_888888_256x240.png +0 -0
  254. data/coverage/assets/0.12.3/images/ui-icons_cd0a0a_256x240.png +0 -0
  255. data/coverage/assets/0.12.3/loading.gif +0 -0
  256. data/coverage/assets/0.12.3/magnify.png +0 -0
  257. data/coverage/index.html +20731 -0
  258. data/db/migrate/20221018053949_devise_create_users.rb +45 -0
  259. data/db/migrate/20221019002956_create_chains.rb +13 -0
  260. data/db/migrate/20221020112137_create_blocks.rb +12 -0
  261. data/db/migrate/20221020123102_add_chain_to_blocks.rb +5 -0
  262. data/db/migrate/20221020150504_create_wallets.rb +13 -0
  263. data/db/migrate/20221022221059_create_transactions.rb +20 -0
  264. data/db/migrate/20221023011005_add_block_to_transactions.rb +5 -0
  265. data/db/migrate/20221023014707_create_contracts.rb +11 -0
  266. data/db/migrate/20221023040749_create_pools.rb +13 -0
  267. data/db/migrate/20221023041015_create_tickets.rb +11 -0
  268. data/db/migrate/20221023103509_add_contracts_count_to_block.rb +6 -0
  269. data/db/migrate/20221023110613_add_acceptable_word_list_to_users.rb +7 -0
  270. data/db/migrate/20221023113539_create_signatures.rb +19 -0
  271. data/db/migrate/20221023113750_create_acceptable_words.rb +9 -0
  272. data/db/migrate/20221023114152_create_acceptable_number_sequences.rb +9 -0
  273. data/db/migrate/20221023114203_create_acceptable_symbol_sequences.rb +9 -0
  274. data/db/migrate/20221023114324_add_user_acceptable_hash_to_tickets.rb +7 -0
  275. data/db/migrate/20221023114408_add_time_ref_to_tickets.rb +5 -0
  276. data/db/migrate/20221024125047_add_master_hash_to_blocks.rb +5 -0
  277. data/db/migrate/20221109161845_add_transactions_count_to_blocks.rb +5 -0
  278. data/db/migrate/20221117135003_add_balance_to_chains.rb +5 -0
  279. data/db/migrate/20221117203417_add_transaction_id_list_to_tickets.rb +5 -0
  280. data/db/migrate/20221118080357_add_api_keys_to_users.rb +6 -0
  281. data/db/schema.rb +179 -0
  282. data/db/seeds.rb +134 -0
  283. data/docker-compose.yml +53 -0
  284. data/entrypoint.sh +8 -0
  285. data/lib/assets/.keep +0 -0
  286. data/lib/osbc/osbc.rb +9 -0
  287. data/lib/outerspace/blockchain/version.rb +7 -0
  288. data/lib/outerspace/blockchain.rb +10 -0
  289. data/lib/tasks/.keep +0 -0
  290. data/lib/tasks/compose.rake +92 -0
  291. data/lib/tasks/compose_db.rake +71 -0
  292. data/lib/tasks/compose_logs.rake +95 -0
  293. data/lib/tasks/compose_test.rake +62 -0
  294. data/log/.keep +0 -0
  295. data/mining_concept.ipynb +284 -0
  296. data/outerspace-blockchain.gemspec +50 -0
  297. data/public/404.html +67 -0
  298. data/public/422.html +67 -0
  299. data/public/500.html +66 -0
  300. data/public/apple-touch-icon-precomposed.png +0 -0
  301. data/public/apple-touch-icon.png +0 -0
  302. data/public/favicon.ico +0 -0
  303. data/public/robots.txt +1 -0
  304. data/storage/.keep +0 -0
  305. data/tmp/.keep +0 -0
  306. data/tmp/pids/.keep +0 -0
  307. data/tmp/storage/.keep +0 -0
  308. data/vendor/.keep +0 -0
  309. data/vendor/javascript/.keep +0 -0
  310. metadata +643 -0
@@ -0,0 +1,344 @@
1
+ /*
2
+ * This is a manifest file that'll be compiled into application.css, which will include all the files
3
+ * listed below.
4
+ *
5
+ * Any CSS (and SCSS, if configured) file within this directory, lib/assets/stylesheets, or any plugin's
6
+ * vendor/assets/stylesheets directory can be referenced here using a relative path.
7
+ *
8
+ * You're free to add application-wide styles to this file and they'll appear at the bottom of the
9
+ * compiled file so the styles you add here take precedence over styles defined in any other CSS
10
+ * files in this directory. Styles in this file should be added after the last require_* statement.
11
+ * It is generally better to create a new file per style scope.
12
+ *
13
+ *= require_tree .
14
+ *= require_self
15
+ */
16
+
17
+
18
+ body {
19
+ /* background-color: #f5f5f5;
20
+ background-repeat: no-repeat;
21
+ background-position: center;
22
+ background-size: cover; */
23
+ background-attachment: fixed;
24
+ margin: 0;
25
+ padding: 0;
26
+ font-family: 'Lato', sans-serif;
27
+ font-size: 14px;
28
+ color: #333;
29
+ height: 100%;
30
+ min-height: 100%;
31
+ overflow-x: hidden;
32
+ overflow-y: scroll;
33
+ -webkit-overflow-scrolling: touch;
34
+ }
35
+
36
+
37
+ .form-group input.form-control, .form-group textarea.form-control, .form-group select.form-control, .form-group .form-control {
38
+ font-family: 'Lato', sans-serif;
39
+ font-size: 14px;
40
+ color: white;
41
+ background-color: #333;
42
+ width: 100%;
43
+ }
44
+
45
+ .pt-\[17\%\] {
46
+ padding-top: 17%;
47
+ }
48
+ .mt-\[-10\%\] {
49
+ margin-top: -10%;
50
+ }
51
+ .pt-\[56\.25\%\] {
52
+ padding-top: 56.25%;
53
+ }
54
+
55
+ .hero img {
56
+
57
+ height: auto;
58
+ width: 100%;
59
+ max-width: 100%;
60
+ margin: 0 auto;
61
+ display: block;
62
+ padding: 0;
63
+ border: 0;
64
+ vertical-align: middle;
65
+ max-height: 100%;
66
+ z-index: 1;
67
+ position: absolute;
68
+
69
+
70
+
71
+
72
+ }
73
+
74
+ .bg-future {
75
+ background-color: rgba(0,0,0,0.6);
76
+ width: 100%;
77
+
78
+ }
79
+
80
+
81
+ .table-container {
82
+ margin-top: 50px;
83
+ }
84
+
85
+ .backimage {
86
+ background-image: radial-gradient(#2fff00 1px, transparent 1px);
87
+ background-size: 32px 32px;
88
+ background-color: #1e1c1c;
89
+ }
90
+
91
+ .glitch-wrapper {
92
+ width: 100%;
93
+ height: 100%;
94
+ display: flex;
95
+ align-items: center;
96
+ justify-content: center;
97
+ text-align: center;
98
+ background-color: #222;
99
+ }
100
+
101
+ .glitch {
102
+ position: relative;
103
+ font-size: 20px;
104
+ font-weight: 700;
105
+ line-height: 1.2;
106
+ color: #fff;
107
+ letter-spacing: 5px;
108
+ animation: shift 4s ease-in-out infinite alternate;
109
+ z-index: 1;
110
+ }
111
+
112
+ .glitch:before {
113
+ content: attr(data-glitch);
114
+ position: absolute;
115
+ top: 0;
116
+ left: -2px;
117
+ text-shadow: 16px 0 rgb(0, 255, 55);
118
+ width: 100%;
119
+ color: #fff;
120
+ background-color: rgba(0,0,0,0.5);
121
+ overflow: hidden;
122
+ clip: rect(0, 900px, 0, 0);
123
+ animation: noise-before 3s infinite linear alternate-reverse;
124
+ }
125
+
126
+ .glitch:after {
127
+ content: attr(data-glitch);
128
+ position: absolute;
129
+ top: 0;
130
+ left: 2px;
131
+ text-shadow: 22px 0 #982098;
132
+ width: 100%;
133
+ color: #fff;
134
+ background-color: rgba(0, 0, 0, 0.2);
135
+ overflow: hidden;
136
+ clip: rect(0, 900px, 0, 0);
137
+ animation: noise-after 2s infinite linear alternate-reverse;
138
+ }
139
+
140
+ @keyframes noise-before {
141
+ 0% {
142
+ clip: rect(61px, 9999px, 52px, 0);
143
+ }
144
+
145
+ 5% {
146
+ clip: rect(33px, 9999px, 144px, 0);
147
+ }
148
+
149
+ 10% {
150
+ clip: rect(121px, 9999px, 115px, 0);
151
+ }
152
+
153
+ 15% {
154
+ clip: rect(144px, 9999px, 162px, 0);
155
+ }
156
+
157
+ 20% {
158
+ clip: rect(62px, 9999px, 180px, 0);
159
+ }
160
+
161
+ 25% {
162
+ clip: rect(34px, 9999px, 42px, 0);
163
+ }
164
+
165
+ 30% {
166
+ clip: rect(147px, 9999px, 179px, 0);
167
+ }
168
+
169
+ 35% {
170
+ clip: rect(99px, 9999px, 63px, 0);
171
+ }
172
+
173
+ 40% {
174
+ clip: rect(188px, 9999px, 122px, 0);
175
+ }
176
+
177
+ 45% {
178
+ clip: rect(154px, 9999px, 14px, 0);
179
+ }
180
+
181
+ 50% {
182
+ clip: rect(63px, 9999px, 37px, 0);
183
+ }
184
+
185
+ 55% {
186
+ clip: rect(161px, 9999px, 147px, 0);
187
+ }
188
+
189
+ 60% {
190
+ clip: rect(109px, 9999px, 175px, 0);
191
+ }
192
+
193
+ 65% {
194
+ clip: rect(157px, 9999px, 88px, 0);
195
+ }
196
+
197
+ 70% {
198
+ clip: rect(173px, 9999px, 131px, 0);
199
+ }
200
+
201
+ 75% {
202
+ clip: rect(62px, 9999px, 70px, 0);
203
+ }
204
+
205
+ 80% {
206
+ clip: rect(24px, 9999px, 153px, 0);
207
+ }
208
+
209
+ 85% {
210
+ clip: rect(138px, 9999px, 40px, 0);
211
+ }
212
+
213
+ 90% {
214
+ clip: rect(79px, 9999px, 136px, 0);
215
+ }
216
+
217
+ 95% {
218
+ clip: rect(25px, 9999px, 34px, 0);
219
+ }
220
+
221
+ 100% {
222
+ clip: rect(173px, 9999px, 166px, 0);
223
+ }
224
+ }
225
+
226
+ @keyframes noise-after {
227
+ 0% {
228
+ clip: rect(26px, 9999px, 33px, 0);
229
+ }
230
+
231
+ 5% {
232
+ clip: rect(140px, 9999px, 198px, 0);
233
+ }
234
+
235
+ 10% {
236
+ clip: rect(184px, 9999px, 89px, 0);
237
+ }
238
+
239
+ 15% {
240
+ clip: rect(121px, 9999px, 6px, 0);
241
+ }
242
+
243
+ 20% {
244
+ clip: rect(181px, 9999px, 99px, 0);
245
+ }
246
+
247
+ 25% {
248
+ clip: rect(154px, 9999px, 133px, 0);
249
+ }
250
+
251
+ 30% {
252
+ clip: rect(134px, 9999px, 169px, 0);
253
+ }
254
+
255
+ 35% {
256
+ clip: rect(26px, 9999px, 187px, 0);
257
+ }
258
+
259
+ 40% {
260
+ clip: rect(147px, 9999px, 137px, 0);
261
+ }
262
+
263
+ 45% {
264
+ clip: rect(31px, 9999px, 52px, 0);
265
+ }
266
+
267
+ 50% {
268
+ clip: rect(191px, 9999px, 109px, 0);
269
+ }
270
+
271
+ 55% {
272
+ clip: rect(74px, 9999px, 54px, 0);
273
+ }
274
+
275
+ 60% {
276
+ clip: rect(145px, 9999px, 75px, 0);
277
+ }
278
+
279
+ 65% {
280
+ clip: rect(153px, 9999px, 198px, 0);
281
+ }
282
+
283
+ 70% {
284
+ clip: rect(99px, 9999px, 136px, 0);
285
+ }
286
+
287
+ 75% {
288
+ clip: rect(118px, 9999px, 192px, 0);
289
+ }
290
+
291
+ 80% {
292
+ clip: rect(1px, 9999px, 83px, 0);
293
+ }
294
+
295
+ 85% {
296
+ clip: rect(145px, 9999px, 98px, 0);
297
+ }
298
+
299
+ 90% {
300
+ clip: rect(121px, 9999px, 154px, 0);
301
+ }
302
+
303
+ 95% {
304
+ clip: rect(156px, 9999px, 44px, 0);
305
+ }
306
+
307
+ 100% {
308
+ clip: rect(67px, 9999px, 122px, 0);
309
+ }
310
+ }
311
+
312
+ @keyframes shift {
313
+ 0%, 40%, 44%, 58%, 61%, 65%, 69%, 73%, 100% {
314
+ transform: skewX(0deg);
315
+ }
316
+
317
+ 41% {
318
+ transform: skewX(10deg);
319
+ }
320
+
321
+ 42% {
322
+ transform: skewX(-10deg);
323
+ }
324
+
325
+ 59% {
326
+ transform: skewX(40deg) skewY(10deg);
327
+ }
328
+
329
+ 60% {
330
+ transform: skewX(-40deg) skewY(-10deg);
331
+ }
332
+
333
+ 63% {
334
+ transform: skewX(10deg) skewY(-5deg);
335
+ }
336
+
337
+ 70% {
338
+ transform: skewX(-50deg) skewY(-20deg);
339
+ }
340
+
341
+ 71% {
342
+ transform: skewX(10deg) skewY(-10deg);
343
+ }
344
+ }
@@ -0,0 +1,13 @@
1
+ @tailwind base;
2
+ @tailwind components;
3
+ @tailwind utilities;
4
+
5
+ /*
6
+
7
+ @layer components {
8
+ .btn-primary {
9
+ @apply py-2 px-4 bg-blue-200;
10
+ }
11
+ }
12
+
13
+ */
File without changes
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ApplicationCable
4
+ class Channel < ActionCable::Channel::Base
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ApplicationCable
4
+ class Connection < ActionCable::Connection::Base
5
+ end
6
+ end
@@ -0,0 +1,65 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Api::V1::BlockConfirmationsController < ActionController::API
4
+ def confirm_block
5
+ return unauthorized_response unless find_user_by_header
6
+ @ticket = Ticket.find_by(user_id: @user.id, status: :active)
7
+ return ticket_not_found_response unless @ticket.present?
8
+ confirmation_hash = block_confirmation_params[:user_confirmation_hash]
9
+ return confirmation_hash_not_found_response unless confirmation_hash.present?
10
+ return not_valid_confirmation_hash_response unless @ticket.user_acceptable_hash == confirmation_hash
11
+ assign_contract
12
+ end
13
+
14
+ def transactions_to_mine
15
+ return unauthorized_response unless find_user_by_header
16
+ ticket = Ticket.find_by(user_id: @user.id)
17
+ return ticket_not_found_response unless ticket.present?
18
+ transactions_ids = ticket.transaction_id_list
19
+ transactions = Transaction.where(id: transactions_ids)
20
+ transactions_json = transactions.to_json
21
+ render json: transactions_json, status: :ok
22
+ end
23
+
24
+ def info_to_mine
25
+ return unauthorized_response unless find_user_by_header
26
+ words = @user.acceptable_words
27
+ number_sequences = @user.acceptable_number_sequences
28
+ symbol_sequences = @user.acceptable_symbol_sequences
29
+ render json: { words: words, number_sequences: number_sequences, symbol_sequences: symbol_sequences }, status: :ok
30
+ end
31
+
32
+ private
33
+ def find_user_by_header
34
+ return unless request.headers["X-Api-Key"].present?
35
+ api_key = request.headers["X-Api-Key"]
36
+ @user = User.find_by(api_key: api_key)
37
+ return unless @user.present?
38
+ @user.api_secret == request.headers["X-Api-Secret"]
39
+ end
40
+
41
+ def unauthorized_response
42
+ render json: { error: "Unauthorized" }, status: :unauthorized
43
+ end
44
+
45
+ def ticket_not_found_response
46
+ render json: { error: "Ticket not found" }, status: :not_found
47
+ end
48
+
49
+ def confirmation_hash_not_found_response
50
+ render json: { error: "Confirmation hash not found" }, status: :not_found
51
+ end
52
+
53
+ def assign_contract
54
+ AssignContractWorker.perform_async(@ticket.id)
55
+ render json: { message: "Contract assigned" }, status: :ok
56
+ end
57
+
58
+ def not_valid_confirmation_hash_response
59
+ render json: { error: "Not valid confirmation hash" }, status: :not_found
60
+ end
61
+
62
+ def block_confirmation_params
63
+ params.permit(:user_confirmation_hash)
64
+ end
65
+ end
@@ -0,0 +1,72 @@
1
+ # frozen_string_literal: true
2
+
3
+ # This class is Application Controller and his methods is available for all controllers
4
+ class ApplicationController < ActionController::Base
5
+ protect_from_forgery with: :exception
6
+ before_action :configure_permitted_parameters, if: :devise_controller?
7
+ before_action :authenticate_user!, only: [:mining_profile]
8
+ before_action :set_contracts, :set_blocks, :set_current_block, :set_current_pool, :set_block_transactions
9
+
10
+
11
+ def home
12
+ @contracts = contracts
13
+ end
14
+
15
+ def mining_profile
16
+ @words = current_user.acceptable_words
17
+ @numbers = current_user.acceptable_number_sequences
18
+ @symbols = current_user.acceptable_symbol_sequences
19
+ @ticket = current_user.tickets.where(status: :active).last
20
+ end
21
+
22
+ def terms; end
23
+
24
+
25
+ def privacy_policy; end
26
+
27
+ private
28
+ def blocks
29
+ @blocks = Block.all.order(created_at: :desc).limit(5)
30
+ end
31
+
32
+ def contracts
33
+ @contracts = Contract.last(5)
34
+ end
35
+
36
+ def current_block
37
+ @current_block = Block.find_by(master_hash: nil)
38
+ end
39
+
40
+ def current_pool
41
+ @current_pool = Pool.find_by(block_id: current_block.id)
42
+ end
43
+
44
+ def block_transactions
45
+ @block_transactions = Transaction.where(block_id: current_block.id)
46
+ end
47
+
48
+ def set_contracts
49
+ contracts
50
+ end
51
+
52
+ def set_blocks
53
+ blocks
54
+ end
55
+
56
+ def set_current_block
57
+ current_block
58
+ end
59
+
60
+ def set_current_pool
61
+ current_pool
62
+ end
63
+
64
+ def set_block_transactions
65
+ block_transactions
66
+ end
67
+
68
+ protected
69
+ def configure_permitted_parameters
70
+ devise_parameter_sanitizer.permit(:sign_up)
71
+ end
72
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ class BlocksController < ApplicationController
4
+ before_action :set_block, only: %i[ show ]
5
+
6
+ # GET /blocks or /blocks.json
7
+ def index
8
+ @blocks = Block.all
9
+ end
10
+
11
+ # GET /blocks/1 or /blocks/1.json
12
+ def show
13
+ end
14
+
15
+ private
16
+ # Use callbacks to share common setup or constraints between actions.
17
+ def set_block
18
+ @block = Block.find(params[:id])
19
+ end
20
+ end
@@ -0,0 +1,72 @@
1
+ # frozen_string_literal: true
2
+
3
+ class ChainsController < ApplicationController
4
+ before_action :set_chain, only: %i[ show edit update destroy ]
5
+
6
+ # GET /chains or /chains.json
7
+ def index
8
+ @chains = Chain.all
9
+ end
10
+
11
+ # GET /chains/1 or /chains/1.json
12
+ def show
13
+ end
14
+
15
+ # GET /chains/new
16
+ def new
17
+ @chain = Chain.new
18
+ end
19
+
20
+ # GET /chains/1/edit
21
+ def edit
22
+ end
23
+
24
+ # POST /chains or /chains.json
25
+ def create
26
+ @chain = Chain.new(chain_params)
27
+
28
+ respond_to do |format|
29
+ if @chain.save
30
+ format.html { redirect_to chain_url(@chain), notice: "Chain was successfully created." }
31
+ format.json { render :show, status: :created, location: @chain }
32
+ else
33
+ format.html { render :new, status: :unprocessable_entity }
34
+ format.json { render json: @chain.errors, status: :unprocessable_entity }
35
+ end
36
+ end
37
+ end
38
+
39
+ # PATCH/PUT /chains/1 or /chains/1.json
40
+ def update
41
+ respond_to do |format|
42
+ if @chain.update(chain_params)
43
+ format.html { redirect_to chain_url(@chain), notice: "Chain was successfully updated." }
44
+ format.json { render :show, status: :ok, location: @chain }
45
+ else
46
+ format.html { render :edit, status: :unprocessable_entity }
47
+ format.json { render json: @chain.errors, status: :unprocessable_entity }
48
+ end
49
+ end
50
+ end
51
+
52
+ # DELETE /chains/1 or /chains/1.json
53
+ def destroy
54
+ @chain.destroy
55
+
56
+ respond_to do |format|
57
+ format.html { redirect_to chains_url, notice: "Chain was successfully destroyed." }
58
+ format.json { head :no_content }
59
+ end
60
+ end
61
+
62
+ private
63
+ # Use callbacks to share common setup or constraints between actions.
64
+ def set_chain
65
+ @chain = Chain.find(params[:id])
66
+ end
67
+
68
+ # Only allow a list of trusted parameters through.
69
+ def chain_params
70
+ params.require(:chain).permit(:name, :blocks_count, :maintainer, :chain_version, :description)
71
+ end
72
+ end
File without changes
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ class ContractsController < ApplicationController
4
+ before_action :set_contract, only: %i[ show edit update destroy ]
5
+
6
+ # GET /contracts or /contracts.json
7
+ def index
8
+ @contracts = Contract.all
9
+ end
10
+
11
+ # GET /contracts/1 or /contracts/1.json
12
+ def show
13
+ end
14
+
15
+ private
16
+ # Use callbacks to share common setup or constraints between actions.
17
+ def set_contract
18
+ @contract = Contract.find(params[:id])
19
+ end
20
+
21
+ # Only allow a list of trusted parameters through.
22
+ def contract_params
23
+ params.require(:contract).permit(:first_sig, :second_sig, :third_sig, :fourth_sig, :status, :transaction_id)
24
+ end
25
+ end
@@ -0,0 +1,73 @@
1
+ # frozen_string_literal: true
2
+
3
+ class PoolsController < ApplicationController
4
+ before_action :set_pool, only: %i[ show edit update destroy ]
5
+ before_action :authenticate_user!
6
+
7
+ # GET /pools or /pools.json
8
+ def index
9
+ @pools = Pool.all
10
+ end
11
+
12
+ # GET /pools/1 or /pools/1.json
13
+ def show
14
+ end
15
+
16
+ # GET /pools/new
17
+ def new
18
+ @pool = Pool.new
19
+ end
20
+
21
+ # GET /pools/1/edit
22
+ def edit
23
+ end
24
+
25
+ # POST /pools or /pools.json
26
+ def create
27
+ @pool = Pool.new(pool_params)
28
+
29
+ respond_to do |format|
30
+ if @pool.save
31
+ format.html { redirect_to pool_url(@pool), notice: "Pool was successfully created." }
32
+ format.json { render :show, status: :created, location: @pool }
33
+ else
34
+ format.html { render :new, status: :unprocessable_entity }
35
+ format.json { render json: @pool.errors, status: :unprocessable_entity }
36
+ end
37
+ end
38
+ end
39
+
40
+ # PATCH/PUT /pools/1 or /pools/1.json
41
+ def update
42
+ respond_to do |format|
43
+ if @pool.update(pool_params)
44
+ format.html { redirect_to pool_url(@pool), notice: "Pool was successfully updated." }
45
+ format.json { render :show, status: :ok, location: @pool }
46
+ else
47
+ format.html { render :edit, status: :unprocessable_entity }
48
+ format.json { render json: @pool.errors, status: :unprocessable_entity }
49
+ end
50
+ end
51
+ end
52
+
53
+ # DELETE /pools/1 or /pools/1.json
54
+ def destroy
55
+ @pool.destroy
56
+
57
+ respond_to do |format|
58
+ format.html { redirect_to pools_url, notice: "Pool was successfully destroyed." }
59
+ format.json { head :no_content }
60
+ end
61
+ end
62
+
63
+ private
64
+ # Use callbacks to share common setup or constraints between actions.
65
+ def set_pool
66
+ @pool = Pool.find(params[:id])
67
+ end
68
+
69
+ # Only allow a list of trusted parameters through.
70
+ def pool_params
71
+ params.require(:pool).permit(:block_id, :users_count, :signatures_count, :amount, :stage)
72
+ end
73
+ end