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,8 @@
1
+ .text-white.text-center
2
+
3
+
4
+ == render @ticket
5
+ br
6
+ div
7
+ = link_to "Back to tickets", tickets_path, class: "px-4 py-2 rounded bg-purple-500 hover_bg-purple-700 text-white"
8
+ br
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ json.partial! "tickets/ticket", ticket: @ticket
@@ -0,0 +1,16 @@
1
+ = form_with(model: @transaction) do |form|
2
+ - if @transaction.errors.any?
3
+ div style="color: red"
4
+ h2 = "#{pluralize(@transaction.errors.count, "error")} prohibited this transaction from being saved:"
5
+ ul
6
+ - @transaction.errors.each do |error|
7
+ li = error.full_message
8
+ div.text-black
9
+ = form.label :receiver_key, style: "display: block", class: "text-white"
10
+ = form.text_field :receiver_key, class: "form-control"
11
+ div.text-black
12
+ = form.label :amount, style: "display: block", class: "text-white"
13
+ = form.number_field :amount, step: 0.01, min: 0, class: "form-control"
14
+
15
+ div[style="margin-top: 20px;"]
16
+ = form.submit class: "px-4 py-2 rounded bg-purple-500 hover_bg-purple-700 text-white"
@@ -0,0 +1,24 @@
1
+ div id="#{dom_id transaction}"
2
+ p
3
+ strong Sended by:
4
+ =< transaction.sender
5
+ p
6
+ strong Receiver By:
7
+ =< transaction.receiver
8
+ / only show the information below if the Show page is being rendered
9
+ - if action_name == "show"
10
+ p
11
+ strong Amount:
12
+ =< transaction.amount
13
+ p
14
+ strong Status:
15
+ =< transaction.status
16
+ p
17
+ strong Block:
18
+ =< transaction.block.id
19
+ p
20
+ strong Created at:
21
+ =< transaction.created_at
22
+ p
23
+ strong Updated at:
24
+ =< transaction.updated_at
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ json.extract! transaction, :id, :sender_key, :receiver_key, :signature_time, :confirmed, :master, :created_at, :updated_at
4
+ json.url transaction_url(transaction, format: :json)
@@ -0,0 +1,10 @@
1
+ h1 Editing transaction
2
+
3
+ == render "form", transaction: @transaction
4
+
5
+ br
6
+
7
+ div
8
+ => link_to "Show this transaction", @transaction
9
+ '|
10
+ =< link_to "Back to transactions", transactions_path
@@ -0,0 +1,19 @@
1
+ .text-white.text-center
2
+
3
+
4
+ h1 Transactions
5
+
6
+ #transactions
7
+ - @transactions.each do |transaction|
8
+ == render transaction
9
+ br
10
+ p
11
+ = link_to "Show this transaction", transaction, class: "px-4 py-2 rounded bg-purple-500 hover_bg-purple-700 text-white"
12
+ br
13
+ br
14
+ = link_to "New transaction", new_transaction_path, class: "px-4 py-2 rounded bg-purple-500 hover_bg-purple-700 text-white"
15
+ br
16
+ br
17
+ = link_to "Back to home", root_path, class: "px-4 py-2 rounded bg-purple-500 hover_bg-purple-700 text-white"
18
+ br
19
+ br
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ json.array! @transactions, partial: "transactions/transaction", as: :transaction
@@ -0,0 +1,9 @@
1
+ .text-center.text-white
2
+ h1 New transaction
3
+
4
+ == render "form", transaction: @transaction
5
+
6
+ br
7
+ div
8
+ = link_to "Back to transactions", transactions_path, class: "px-4 py-2 rounded bg-purple-500 hover_bg-purple-700 text-white"
9
+ br
@@ -0,0 +1,8 @@
1
+ .text-center.text-white
2
+
3
+
4
+ == render @transaction
5
+ br
6
+ div
7
+ = link_to "Back to transactions", transactions_path, class: "px-4 py-2 rounded bg-purple-500 hover_bg-purple-700 text-white"
8
+ br
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ json.partial! "transactions/transaction", transaction: @transaction
@@ -0,0 +1,16 @@
1
+ <h2>Resend confirmation instructions</h2>
2
+
3
+ <%= form_for(resource, as: resource_name, url: confirmation_path(resource_name), html: { method: :post }) do |f| %>
4
+ <%= render "users/shared/error_messages", resource: resource %>
5
+
6
+ <div class="field">
7
+ <%= f.label :email %><br />
8
+ <%= f.email_field :email, autofocus: true, autocomplete: "email", value: (resource.pending_reconfirmation? ? resource.unconfirmed_email : resource.email) %>
9
+ </div>
10
+
11
+ <div class="actions">
12
+ <%= f.submit "Resend confirmation instructions" %>
13
+ </div>
14
+ <% end %>
15
+
16
+ <%= render "users/shared/links" %>
@@ -0,0 +1,5 @@
1
+ <p>Welcome <%= @email %>!</p>
2
+
3
+ <p>You can confirm your account email through the link below:</p>
4
+
5
+ <p><%= link_to 'Confirm my account', confirmation_url(@resource, confirmation_token: @token) %></p>
@@ -0,0 +1,7 @@
1
+ <p>Hello <%= @email %>!</p>
2
+
3
+ <% if @resource.try(:unconfirmed_email?) %>
4
+ <p>We're contacting you to notify you that your email is being changed to <%= @resource.unconfirmed_email %>.</p>
5
+ <% else %>
6
+ <p>We're contacting you to notify you that your email has been changed to <%= @resource.email %>.</p>
7
+ <% end %>
@@ -0,0 +1,3 @@
1
+ <p>Hello <%= @resource.email %>!</p>
2
+
3
+ <p>We're contacting you to notify you that your password has been changed.</p>
@@ -0,0 +1,8 @@
1
+ <p>Hello <%= @resource.email %>!</p>
2
+
3
+ <p>Someone has requested a link to change your password. You can do this through the link below.</p>
4
+
5
+ <p><%= link_to 'Change my password', edit_password_url(@resource, reset_password_token: @token) %></p>
6
+
7
+ <p>If you didn't request this, please ignore this email.</p>
8
+ <p>Your password won't change until you access the link above and create a new one.</p>
@@ -0,0 +1,7 @@
1
+ <p>Hello <%= @resource.email %>!</p>
2
+
3
+ <p>Your account has been locked due to an excessive number of unsuccessful sign in attempts.</p>
4
+
5
+ <p>Click the link below to unlock your account:</p>
6
+
7
+ <p><%= link_to 'Unlock my account', unlock_url(@resource, unlock_token: @token) %></p>
@@ -0,0 +1,25 @@
1
+ <h2>Change your password</h2>
2
+
3
+ <%= form_for(resource, as: resource_name, url: password_path(resource_name), html: { method: :put }) do |f| %>
4
+ <%= render "users/shared/error_messages", resource: resource %>
5
+ <%= f.hidden_field :reset_password_token %>
6
+
7
+ <div class="field">
8
+ <%= f.label :password, "New password" %><br />
9
+ <% if @minimum_password_length %>
10
+ <em>(<%= @minimum_password_length %> characters minimum)</em><br />
11
+ <% end %>
12
+ <%= f.password_field :password, autofocus: true, autocomplete: "new-password" %>
13
+ </div>
14
+
15
+ <div class="field">
16
+ <%= f.label :password_confirmation, "Confirm new password" %><br />
17
+ <%= f.password_field :password_confirmation, autocomplete: "new-password" %>
18
+ </div>
19
+
20
+ <div class="actions">
21
+ <%= f.submit "Change my password" %>
22
+ </div>
23
+ <% end %>
24
+
25
+ <%= render "users/shared/links" %>
@@ -0,0 +1,16 @@
1
+ <h2>Forgot your password?</h2>
2
+
3
+ <%= form_for(resource, as: resource_name, url: password_path(resource_name), html: { method: :post }) do |f| %>
4
+ <%= render "users/shared/error_messages", resource: resource %>
5
+
6
+ <div class="field">
7
+ <%= f.label :email %><br />
8
+ <%= f.email_field :email, autofocus: true, autocomplete: "email" %>
9
+ </div>
10
+
11
+ <div class="actions">
12
+ <%= f.submit "Send me reset password instructions" %>
13
+ </div>
14
+ <% end %>
15
+
16
+ <%= render "users/shared/links" %>
@@ -0,0 +1,43 @@
1
+ <h2>Edit <%= resource_name.to_s.humanize %></h2>
2
+
3
+ <%= form_for(resource, as: resource_name, url: registration_path(resource_name), html: { method: :put }) do |f| %>
4
+ <%= render "users/shared/error_messages", resource: resource %>
5
+
6
+ <div class="field">
7
+ <%= f.label :email %><br />
8
+ <%= f.email_field :email, autofocus: true, autocomplete: "email" %>
9
+ </div>
10
+
11
+ <% if devise_mapping.confirmable? && resource.pending_reconfirmation? %>
12
+ <div>Currently waiting confirmation for: <%= resource.unconfirmed_email %></div>
13
+ <% end %>
14
+
15
+ <div class="field">
16
+ <%= f.label :password %> <i>(leave blank if you don't want to change it)</i><br />
17
+ <%= f.password_field :password, autocomplete: "new-password" %>
18
+ <% if @minimum_password_length %>
19
+ <br />
20
+ <em><%= @minimum_password_length %> characters minimum</em>
21
+ <% end %>
22
+ </div>
23
+
24
+ <div class="field">
25
+ <%= f.label :password_confirmation %><br />
26
+ <%= f.password_field :password_confirmation, autocomplete: "new-password" %>
27
+ </div>
28
+
29
+ <div class="field">
30
+ <%= f.label :current_password %> <i>(we need your current password to confirm your changes)</i><br />
31
+ <%= f.password_field :current_password, autocomplete: "current-password" %>
32
+ </div>
33
+
34
+ <div class="actions">
35
+ <%= f.submit "Update" %>
36
+ </div>
37
+ <% end %>
38
+
39
+ <h3>Cancel my account</h3>
40
+
41
+ <p>Unhappy? <%= button_to "Cancel my account", registration_path(resource_name), data: { confirm: "Are you sure?" }, method: :delete %></p>
42
+
43
+ <%= link_to "Back", :back %>
@@ -0,0 +1,37 @@
1
+ <div class="text-white text-center"
2
+ <h2>Sign up</h2>
3
+
4
+ <%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
5
+ <%= render "users/shared/error_messages", resource: resource %>
6
+ <div class="field text-black">
7
+ <%= f.label :username, class: "text-white" %><br />
8
+ <em class="text-white">(10 characters minimum)</em>
9
+ <%= f.text_field :username, autofocus: true, autocomplete: "username",class: "px-4 py-2 rounded text-black border-2 border-purple-300 focus_border-purple-900" %>
10
+ </div>
11
+
12
+ <div class="field text-black">
13
+ <%= f.label :email, class: "text-white" %><br />
14
+ <%= f.email_field :email, autofocus: true, autocomplete: "email", class: "px-4 py-2 rounded text-black border-2 border-purple-300 focus_border-purple-900" %>
15
+ </div>
16
+
17
+ <div class="field text-black">
18
+ <%= f.label :password, class: "text-white" %><br />
19
+ <% if @minimum_password_length %>
20
+ <em class="text-white">(<%= @minimum_password_length %> characters minimum)</em>
21
+ <% end %><br />
22
+ <%= f.password_field :password, autocomplete: "new-password", class: "px-4 py-2 rounded text-black border-2 border-purple-300 focus_border-purple-900" %>
23
+ </div>
24
+
25
+ <div class="field text-black">
26
+ <%= f.label :password_confirmation, class: "text-white" %><br />
27
+ <%= f.password_field :password_confirmation, autocomplete: "new-password", class: "px-4 py-2 rounded text-black border-2 border-purple-300 focus_border-purple-900" %>
28
+ </div>
29
+ <br/>
30
+ <div class="actions">
31
+ <%= f.submit "Sign up", class: "px-4 py-2 rounded bg-purple-500 hover_bg-purple-700 text-white" %>
32
+ </div>
33
+ <% end %>
34
+ <br/>
35
+ <%= render "users/shared/links" %>
36
+ <br/>
37
+ </div>
@@ -0,0 +1,30 @@
1
+ <div class="text-white text-center">
2
+
3
+ <h2>Log in</h2>
4
+
5
+ <%= form_for(resource, as: resource_name, url: session_path(resource_name)) do |f| %>
6
+ <div class="field">
7
+ <%= f.label :email %><br />
8
+ <%= f.email_field :email, autofocus: true, autocomplete: "email", class: "px-4 py-2 rounded text-black border-2 border-purple-300 focus_border-purple-900" %>
9
+ </div>
10
+
11
+ <div class="field">
12
+ <%= f.label :password %><br />
13
+ <%= f.password_field :password, autocomplete: "current-password" , class: "px-4 py-2 rounded text-black border-2 border-purple-300 focus_border-purple-900"%>
14
+ </div>
15
+
16
+ <% if devise_mapping.rememberable? %>
17
+ <div class="field">
18
+ <%= f.check_box :remember_me %>
19
+ <%= f.label :remember_me %>
20
+ </div>
21
+ <% end %>
22
+ <br/>
23
+ <div class="actions">
24
+ <%= f.submit "Log in", class: "px-4 py-2 rounded bg-purple-500 hover_bg-purple-700 text-white" %>
25
+ </div>
26
+ <br/>
27
+ <% end %>
28
+
29
+ <%= render "users/shared/links" %>
30
+ </div>
@@ -0,0 +1,15 @@
1
+ <% if resource.errors.any? %>
2
+ <div>
3
+ <h2>
4
+ <%= I18n.t("errors.messages.not_saved",
5
+ count: resource.errors.count,
6
+ resource: resource.class.model_name.human.downcase)
7
+ %>
8
+ </h2>
9
+ <ul>
10
+ <% resource.errors.full_messages.each do |message| %>
11
+ <li><%= message %></li>
12
+ <% end %>
13
+ </ul>
14
+ </div>
15
+ <% end %>
@@ -0,0 +1,25 @@
1
+ <%- if controller_name != 'sessions' %>
2
+ <%= link_to "Log in", new_session_path(resource_name), class: "px-4 py-2 rounded bg-purple-500 hover_bg-purple-700 text-white" %><br/><br/>
3
+ <% end %>
4
+
5
+ <%- if devise_mapping.registerable? && controller_name != 'registrations' %>
6
+ <%= link_to "Sign up", new_registration_path(resource_name), class: "px-4 py-2 rounded bg-purple-500 hover_bg-purple-700 text-white" %><br/><br/>
7
+ <% end %>
8
+
9
+ <%- if devise_mapping.recoverable? && controller_name != 'passwords' && controller_name != 'registrations' %>
10
+ <%= link_to "Forgot your password?", new_password_path(resource_name), class: "px-4 py-2 rounded bg-purple-500 hover_bg-purple-700 text-white" %><br/><br/>
11
+ <% end %>
12
+
13
+ <%- if devise_mapping.confirmable? && controller_name != 'confirmations' %>
14
+ <%= link_to "Didn't receive confirmation instructions?", new_confirmation_path(resource_name), class: "px-4 py-2 rounded bg-purple-500 hover_bg-purple-700 text-white" %><br/><br/>
15
+ <% end %>
16
+
17
+ <%- if devise_mapping.lockable? && resource_class.unlock_strategy_enabled?(:email) && controller_name != 'unlocks' %>
18
+ <%= link_to "Didn't receive unlock instructions?", new_unlock_path(resource_name) %><br/><br/>
19
+ <% end %>
20
+
21
+ <%- if devise_mapping.omniauthable? %>
22
+ <%- resource_class.omniauth_providers.each do |provider| %>
23
+ <%= link_to "Sign in with #{OmniAuth::Utils.camelize(provider)}", omniauth_authorize_path(resource_name, provider), method: :post %><br/><br/>
24
+ <% end %>
25
+ <% end %>
@@ -0,0 +1,16 @@
1
+ <h2>Resend unlock instructions</h2>
2
+
3
+ <%= form_for(resource, as: resource_name, url: unlock_path(resource_name), html: { method: :post }) do |f| %>
4
+ <%= render "users/shared/error_messages", resource: resource %>
5
+
6
+ <div class="field">
7
+ <%= f.label :email %><br />
8
+ <%= f.email_field :email, autofocus: true, autocomplete: "email" %>
9
+ </div>
10
+
11
+ <div class="actions">
12
+ <%= f.submit "Resend unlock instructions" %>
13
+ </div>
14
+ <% end %>
15
+
16
+ <%= render "users/shared/links" %>
@@ -0,0 +1,30 @@
1
+ = form_with(model: @wallet) do |form|
2
+ - if @wallet.errors.any?
3
+ div style="color: red"
4
+ h2 = "#{pluralize(@wallet.errors.count, "error")} prohibited this wallet from being saved:"
5
+ ul
6
+ - @wallet.errors.each do |error|
7
+ li = error.full_message
8
+
9
+ div
10
+ = form.label :user_id, style: "display: block"
11
+ = form.text_field :user_id
12
+
13
+ div
14
+ = form.label :pr_key, style: "display: block"
15
+ = form.text_field :pr_key
16
+
17
+ div
18
+ = form.label :pv_key, style: "display: block"
19
+ = form.text_field :pv_key
20
+
21
+ div
22
+ = form.label :balance, style: "display: block"
23
+ = form.text_field :balance
24
+
25
+ div
26
+ = form.label :status, style: "display: block"
27
+ = form.number_field :status
28
+
29
+ div
30
+ = form.submit
@@ -0,0 +1,13 @@
1
+ div id="#{dom_id wallet}"
2
+ p#w_username
3
+ strong User:
4
+ =< wallet.user.username
5
+ p#w_pv_key
6
+ strong Public Key:
7
+ =< wallet.pr_key
8
+ p#w_balance
9
+ strong Balance:
10
+ =< wallet.balance
11
+ p#w_status
12
+ strong Status:
13
+ =< wallet.status
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ json.extract! wallet, :id, :user_id, :pr_key, :pv_key, :balance, :status, :created_at, :updated_at
4
+ json.url wallet_url(wallet, format: :json)
@@ -0,0 +1,10 @@
1
+ h1 Editing wallet
2
+
3
+ == render "form", wallet: @wallet
4
+
5
+ br
6
+
7
+ div
8
+ => link_to "Show this wallet", @wallet
9
+ '|
10
+ =< link_to "Back to wallets", wallets_path
@@ -0,0 +1,18 @@
1
+ .text-white.text-center
2
+
3
+
4
+ h1 Wallets
5
+
6
+ #wallets
7
+ - if @wallets.user == current_user
8
+ == render @wallets
9
+ br
10
+ p
11
+ = link_to "Show this wallet", @wallets, class: "px-4 py-2 rounded bg-purple-500 hover_bg-purple-700 text-white"
12
+ br
13
+
14
+ / = link_to "New wallet", new_wallet_path
15
+ br
16
+ = link_to "Back to home", root_path, class: "px-4 py-2 rounded bg-purple-500 hover_bg-purple-700 text-white"
17
+ br
18
+ br
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ json.array! @wallets, partial: "wallets/wallet", as: :wallet
@@ -0,0 +1,8 @@
1
+ h1 New wallet
2
+
3
+ == render "form", wallet: @wallet
4
+
5
+ br
6
+
7
+ div
8
+ = link_to "Back to wallets", wallets_path
@@ -0,0 +1,11 @@
1
+ .text-white.text-center
2
+
3
+
4
+ .row
5
+ .col-md-6.offset-md-3.col-sm-12
6
+ == render @wallet
7
+ br
8
+ div
9
+ = link_to "Back to wallets", wallets_path, class: "px-4 py-2 rounded bg-purple-500 hover_bg-purple-700 text-white"
10
+ br
11
+ / = button_to "Destroy this wallet", @wallet, method: :delete
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ json.partial! "wallets/wallet", wallet: @wallet
@@ -0,0 +1,82 @@
1
+ # frozen_string_literal: true
2
+
3
+ class ApplicationWorker
4
+ include Sidekiq::Worker
5
+ include ActiveSupport::Rescuable
6
+
7
+ class UserNotFoundError < StandardError
8
+ def initialize(message = "User not found")
9
+ super
10
+ end
11
+ end
12
+
13
+ class WalletNotFoundError < StandardError
14
+ def initialize(message = "Wallet not found")
15
+ super
16
+ end
17
+ end
18
+
19
+ class AmountNotEnoughError < StandardError
20
+ def initialize(message = "Wallet balance is not enough")
21
+ super
22
+ end
23
+ end
24
+
25
+ class BlockNotFoundError < StandardError
26
+ def initialize(message = "Block not found")
27
+ super
28
+ end
29
+ end
30
+
31
+ class PoolNotFoundError < StandardError
32
+ def initialize(message = "Pool not found")
33
+ super
34
+ end
35
+ end
36
+
37
+ ERRORS = [UserNotFoundError, WalletNotFoundError, AmountNotEnoughError, BlockNotFoundError].freeze
38
+
39
+ ERRORS.each do |error|
40
+ rescue_from error do |e|
41
+ dev_error(e)
42
+ end
43
+ end
44
+
45
+ def perform
46
+ raise NotImplementedError
47
+ end
48
+
49
+ def success?
50
+ @success ||= false
51
+ end
52
+
53
+ private
54
+ def dev_error(e)
55
+ if env_acceptable?
56
+ puts "#{e.class}: #{e.message}"
57
+ puts e.backtrace
58
+ end
59
+ end
60
+
61
+ def user_exists?
62
+ User.find_by(id: user_id).present?
63
+ end
64
+
65
+ def pool_exists?
66
+ Pool.find_by(id: pool_id).present?
67
+ end
68
+
69
+ def block_exists?
70
+ Block.find_by(id: block_id).present?
71
+ rescue NameError
72
+ false
73
+ end
74
+
75
+ def wallet_exists?(method, key)
76
+ Wallet.find_by(method => key).present?
77
+ end
78
+
79
+ def env_acceptable?
80
+ Rails.env.development? || Rails.env.test?
81
+ end
82
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ class AssignContractWorker < ApplicationWorker
4
+ def perform(ticket_id)
5
+ @ticket_id = ticket_id
6
+ assign_contract
7
+ end
8
+
9
+ private
10
+ attr_reader :ticket_id
11
+
12
+ def ticket
13
+ @ticket ||= Ticket.find_by(id: ticket_id)
14
+ end
15
+
16
+ def transactions
17
+ @transactions ||= Transaction.where(id: ticket.transaction_id_list)
18
+ end
19
+
20
+ def contracts
21
+ @contracts ||= Contract.where(transaction_id: transactions.pluck(:id))
22
+ end
23
+
24
+ def assign_contract
25
+ AssignContractsService.new(contracts.pluck(:id), ticket_id).call
26
+ end
27
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ class CreateTicketWorker < ApplicationWorker
4
+ sidekiq_options retry: false
5
+
6
+ def perform(user_id, pool_id, time_ref)
7
+ @user_id = user_id
8
+ @pool_id = pool_id
9
+ @time_ref = time_ref
10
+ raise UserNotFoundError unless user_exists?
11
+ raise PoolNotFoundError unless pool_exists?
12
+ if create_ticket
13
+ @success = true
14
+ end
15
+ end
16
+
17
+ private
18
+ attr_reader :user_id, :pool_id, :time_ref
19
+
20
+ def create_ticket
21
+ CreateTicketService.new(user_id, pool_id, time_ref).call
22
+ end
23
+ end