osbc 0.1.6 → 0.1.7
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +8 -3
- data/README.md +24 -10
- data/app/controllers/api/v1/application_controller.rb +67 -0
- data/app/controllers/api/v1/block_confirmations_controller.rb +19 -38
- data/app/controllers/api/v1/ticket_manager_controller.rb +65 -0
- data/app/workers/create_ticket_worker.rb +1 -0
- data/config/initializers/sidekiq.rb +1 -0
- data/config/routes/api.rb +1 -1
- data/lib/osbc/osbc.rb +1 -1
- data/mining_concept.ipynb +2 -2
- metadata +6 -36
- data/coverage/.last_run.json +0 -5
- data/coverage/.resultset.json +0 -1746
- data/coverage/.resultset.json.lock +0 -0
- data/coverage/assets/0.12.3/DataTables-1.10.20/images/sort_asc.png +0 -0
- data/coverage/assets/0.12.3/DataTables-1.10.20/images/sort_asc_disabled.png +0 -0
- data/coverage/assets/0.12.3/DataTables-1.10.20/images/sort_both.png +0 -0
- data/coverage/assets/0.12.3/DataTables-1.10.20/images/sort_desc.png +0 -0
- data/coverage/assets/0.12.3/DataTables-1.10.20/images/sort_desc_disabled.png +0 -0
- data/coverage/assets/0.12.3/application.css +0 -1
- data/coverage/assets/0.12.3/application.js +0 -7
- data/coverage/assets/0.12.3/colorbox/border.png +0 -0
- data/coverage/assets/0.12.3/colorbox/controls.png +0 -0
- data/coverage/assets/0.12.3/colorbox/loading.gif +0 -0
- data/coverage/assets/0.12.3/colorbox/loading_background.png +0 -0
- data/coverage/assets/0.12.3/favicon_green.png +0 -0
- data/coverage/assets/0.12.3/favicon_red.png +0 -0
- data/coverage/assets/0.12.3/favicon_yellow.png +0 -0
- data/coverage/assets/0.12.3/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
- data/coverage/assets/0.12.3/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
- data/coverage/assets/0.12.3/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
- data/coverage/assets/0.12.3/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
- data/coverage/assets/0.12.3/images/ui-bg_glass_75_dadada_1x400.png +0 -0
- data/coverage/assets/0.12.3/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
- data/coverage/assets/0.12.3/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
- data/coverage/assets/0.12.3/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
- data/coverage/assets/0.12.3/images/ui-icons_222222_256x240.png +0 -0
- data/coverage/assets/0.12.3/images/ui-icons_2e83ff_256x240.png +0 -0
- data/coverage/assets/0.12.3/images/ui-icons_454545_256x240.png +0 -0
- data/coverage/assets/0.12.3/images/ui-icons_888888_256x240.png +0 -0
- data/coverage/assets/0.12.3/images/ui-icons_cd0a0a_256x240.png +0 -0
- data/coverage/assets/0.12.3/loading.gif +0 -0
- data/coverage/assets/0.12.3/magnify.png +0 -0
- data/coverage/index.html +0 -20466
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 34b4e07aede46460687f931e6c170bfa6cd32b96eec1022db4dc0edd20c8b4f4
|
4
|
+
data.tar.gz: e15914a8d36c5c60561109915cc2acdd9fe0517d2f767f02e5a118e7684f0f08
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4db75d9e4e3dbc1889e205ffe3e802e7956be058b7f93519d064297ad46d6bc0ab2fad3b27fb95a309bc3e7abd77aa9689f304fd34b6240eca9430ab0dec1568
|
7
|
+
data.tar.gz: b1f5afc4c7016ed067b8520d5e7d81324dc393eda418e3a0fbef8a87257f78ab5883daeb601aed694fe05b414028020cb1c13546da59e962c613670ed2ac63eb
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,10 @@
|
|
1
1
|
## [Unreleased]
|
2
2
|
|
3
|
-
## [0.1.
|
4
|
-
|
5
|
-
- Initial
|
3
|
+
## [0.1.5]
|
4
|
+
### Added
|
5
|
+
- Initial Version
|
6
|
+
## [0.1.6]
|
7
|
+
### Added
|
8
|
+
- Docker Compose Installation Recognition
|
9
|
+
- Refactored some tests
|
10
|
+
- Added lib tasks helper to created rake tasks for blockchain
|
data/README.md
CHANGED
@@ -12,6 +12,22 @@
|
|
12
12
|
|
13
13
|
#### Rspec is used to test the blockchain.
|
14
14
|
|
15
|
+
## Build Version: 0.1.7
|
16
|
+
### Last Update:
|
17
|
+
#### Added Open Ticket Api Methods
|
18
|
+
#### Reafactored some methods and tests
|
19
|
+
#### Removed coverage folder github repo
|
20
|
+
##### TODO
|
21
|
+
###### Add more tests
|
22
|
+
###### Add more features
|
23
|
+
###### Include pagination
|
24
|
+
###### Create Queries Folder
|
25
|
+
###### Test in kubernetes
|
26
|
+
###### Add more documentation
|
27
|
+
###### Add NFT Generator
|
28
|
+
###### Increase the environment variables for autoconfig
|
29
|
+
###### Add features to autogeneration of blockchain for better configuration
|
30
|
+
|
15
31
|
## System dependencies
|
16
32
|
1. Docker
|
17
33
|
2. Postgresql
|
@@ -159,18 +175,16 @@ The mine will depend of the contract signatures that will be formed by the serve
|
|
159
175
|
2. The server will send a message to the user to start mining if the POOL is open
|
160
176
|
3. The users will load the RANDOM WORD LIST provided by the server API
|
161
177
|
4. The user have to use 1 common word, 1 symbol sequence and 1 number sequence, randomize the characters
|
162
|
-
5. Transform the chartacters in a SHA256 hash
|
163
|
-
6.
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
8. If the hash is valid, check if the same transactions have the same block state confirmation
|
168
|
-
9. If this transactions was not confirmed at this point at block history the server will add the user signature to the transaction contract
|
178
|
+
5. Transform the shuffled chartacters in a SHA256 hash
|
179
|
+
6. The user will send the hash to the server
|
180
|
+
7. The server will validate the hash and will send a message to the user if the hash is valid
|
181
|
+
8. If the hash is valid, check if the same transactions have the same block state confirmation, if yes, the user will have to mine again in a new state of the transactions timeline
|
182
|
+
9. If this transactions was not confirmed at this point at block history the server will add the user signature to the transactions contracts included in the users ticket timeline range
|
169
183
|
10. The block only can be hashed when the minimum number of contracts valids with minimum number of signatures is reached
|
170
184
|
11. The server will use the signature timeline to determine what transactions will be added to the block
|
171
185
|
12. The server will calculate the master hash after confirm all valid contracts signatures
|
172
|
-
13.
|
173
|
-
13. The server will start a open/closed pool cycle
|
186
|
+
13. Assignmaster hash to the block, create new block and add to the blockchain with previous block hash
|
187
|
+
13. The server will start a open/closed pool cycle ( pool is open only if has a minimun of transactions to mine )
|
174
188
|
14. The server will send a message to the user to start mining when the POOL is open and user has a ticket
|
175
189
|
<p>
|
176
190
|
The timestamps of the signatures will be usefull to version the block, checking it as a timeline
|
@@ -178,7 +192,7 @@ The timestamps of the signatures will be usefull to version the block, checking
|
|
178
192
|
|
179
193
|
**The miners will be rewarded with the block reward distributed by the number of signatures**
|
180
194
|
## Contributing
|
181
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/
|
195
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/JesusGautamah/outerspace-blockchain
|
182
196
|
|
183
197
|
## License
|
184
198
|
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
@@ -0,0 +1,67 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Api::V1::ApplicationController < ActionController::API
|
4
|
+
def unauthorized?
|
5
|
+
return unauthorized_response unless find_user_by_header
|
6
|
+
end
|
7
|
+
|
8
|
+
def ticket_founded?
|
9
|
+
@ticket = Ticket.find_by(user_id: @user.id, status: :active)
|
10
|
+
return ticket_not_found_response unless @ticket.present?
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
attr_accessor :user
|
15
|
+
|
16
|
+
def find_user_by_header
|
17
|
+
return unless request.headers["X-API-KEY"].present?
|
18
|
+
api_key = request.headers["X-API-KEY"]
|
19
|
+
@user = User.find_by(api_key: api_key)
|
20
|
+
return unless @user.present?
|
21
|
+
@user.api_secret == request.headers["X-API-SECRET"]
|
22
|
+
end
|
23
|
+
|
24
|
+
def confirmation_hash_founded?
|
25
|
+
return confirmation_hash_not_found_response unless confirmation_hash.present?
|
26
|
+
end
|
27
|
+
|
28
|
+
def confirmation_hash
|
29
|
+
@confirmation_hash ||= block_confirmation_params[:user_confirmation_hash]
|
30
|
+
end
|
31
|
+
|
32
|
+
def confirmation_hash_not_found_response
|
33
|
+
render json: { error: "Confirmation hash not found" }, status: :not_found
|
34
|
+
end
|
35
|
+
|
36
|
+
def ticket_not_found_response
|
37
|
+
render json: { error: "Ticket not found" }, status: :not_found
|
38
|
+
end
|
39
|
+
|
40
|
+
def unauthorized_response
|
41
|
+
render json: { error: "Unauthorized" }, status: :unauthorized
|
42
|
+
end
|
43
|
+
|
44
|
+
def current_block
|
45
|
+
@current_block = Block.find_by(master_hash: nil)
|
46
|
+
end
|
47
|
+
|
48
|
+
def current_pool
|
49
|
+
@current_pool = Pool.find_by(block_id: current_block.id)
|
50
|
+
end
|
51
|
+
|
52
|
+
def ticket
|
53
|
+
@ticket = Ticket.find_by(user_id: user.id, status: :active)
|
54
|
+
end
|
55
|
+
|
56
|
+
def block_transactions
|
57
|
+
@block_transactions = Transaction.where(block_id: current_block.id)
|
58
|
+
end
|
59
|
+
|
60
|
+
def block_transactions_empty?
|
61
|
+
return no_transactions_response unless block_transactions.present?
|
62
|
+
end
|
63
|
+
|
64
|
+
def no_transactions_response
|
65
|
+
render json: { error: "No transactions in the block" }, status: :not_found
|
66
|
+
end
|
67
|
+
end
|
@@ -1,62 +1,43 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
class Api::V1::BlockConfirmationsController <
|
3
|
+
class Api::V1::BlockConfirmationsController < Api::V1::ApplicationController
|
4
|
+
before_action :unauthorized?
|
5
|
+
before_action :ticket_founded?, only: [:confirm_block]
|
6
|
+
before_action :confirmation_hash_founded?, only: [:confirm_block]
|
7
|
+
|
4
8
|
def confirm_block
|
5
|
-
return
|
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
|
9
|
+
return not_valid_confirmation_hash_response unless hash_confirmed?
|
11
10
|
assign_contract
|
12
11
|
end
|
13
12
|
|
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
13
|
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
14
|
render json: { words: words, number_sequences: number_sequences, symbol_sequences: symbol_sequences }, status: :ok
|
30
15
|
end
|
31
16
|
|
32
17
|
private
|
33
|
-
def
|
34
|
-
|
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"]
|
18
|
+
def hash_confirmed?
|
19
|
+
@ticket.user_acceptable_hash == confirmation_hash
|
39
20
|
end
|
40
21
|
|
41
|
-
def
|
42
|
-
|
22
|
+
def assign_contract
|
23
|
+
AssignContractWorker.perform_async(@ticket.id)
|
24
|
+
render json: { message: "Contract assigned" }, status: :ok
|
43
25
|
end
|
44
26
|
|
45
|
-
def
|
46
|
-
render json: { error: "
|
27
|
+
def not_valid_confirmation_hash_response
|
28
|
+
render json: { error: "Not valid confirmation hash" }, status: :not_found
|
47
29
|
end
|
48
30
|
|
49
|
-
def
|
50
|
-
|
31
|
+
def words
|
32
|
+
@words = @user.acceptable_words
|
51
33
|
end
|
52
34
|
|
53
|
-
def
|
54
|
-
|
55
|
-
render json: { message: "Contract assigned" }, status: :ok
|
35
|
+
def number_sequences
|
36
|
+
@number_sequences = @user.acceptable_number_sequences
|
56
37
|
end
|
57
38
|
|
58
|
-
def
|
59
|
-
|
39
|
+
def symbol_sequences
|
40
|
+
@symbol_sequences = @user.acceptable_symbol_sequences
|
60
41
|
end
|
61
42
|
|
62
43
|
def block_confirmation_params
|
@@ -0,0 +1,65 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Api::V1::TicketManagerController < Api::V1::ApplicationController
|
4
|
+
before_action :unauthorized?
|
5
|
+
before_action :block_transactions_empty?, only: [:open_ticket]
|
6
|
+
|
7
|
+
def open_ticket
|
8
|
+
return ticket_already_opened_response unless ticket_nil?
|
9
|
+
return ticket_already_opened_response if ticket_active?
|
10
|
+
return terms_not_confirmed_response unless ticket_params_confirmed?
|
11
|
+
create_ticket if acceptable_create?
|
12
|
+
ticket_opened_response
|
13
|
+
end
|
14
|
+
|
15
|
+
|
16
|
+
private
|
17
|
+
def ticket_nil?
|
18
|
+
ticket.nil?
|
19
|
+
end
|
20
|
+
|
21
|
+
def ticket_active?
|
22
|
+
return false if ticket_nil?
|
23
|
+
ticket.status == "active"
|
24
|
+
end
|
25
|
+
|
26
|
+
def acceptable_create?
|
27
|
+
ticket_nil? && ticket_params_confirmed? || ticket_params_confirmed? && ticket_active? == false
|
28
|
+
end
|
29
|
+
|
30
|
+
def ticket_params_confirmed?
|
31
|
+
open_ticket_params[:ticket_terms] == "confirmed"
|
32
|
+
end
|
33
|
+
|
34
|
+
def ticket_already_opened_response
|
35
|
+
render json: { error: "Ticket already opened" }, status: :not_found
|
36
|
+
end
|
37
|
+
|
38
|
+
def ticket_opened_response
|
39
|
+
render json: { message: "Ticket opened" }, status: :ok
|
40
|
+
end
|
41
|
+
|
42
|
+
def terms_not_confirmed_response
|
43
|
+
render json: { error: "Ticket terms not confirmed" }, status: :not_found
|
44
|
+
end
|
45
|
+
|
46
|
+
def open_ticket_params
|
47
|
+
params.permit(:ticket_terms)
|
48
|
+
end
|
49
|
+
|
50
|
+
def time_ref
|
51
|
+
@time_ref = block_transactions.first.created_at.to_s
|
52
|
+
end
|
53
|
+
|
54
|
+
def user_id
|
55
|
+
@user_id = user.id.to_s
|
56
|
+
end
|
57
|
+
|
58
|
+
def current_pool_id
|
59
|
+
@current_pool_id = current_pool.id.to_s
|
60
|
+
end
|
61
|
+
|
62
|
+
def create_ticket
|
63
|
+
CreateTicketWorker.perform_async(user_id, current_pool_id, time_ref)
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
Sidekiq.strict_args!
|
data/config/routes/api.rb
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
namespace :api do
|
4
4
|
namespace :v1 do
|
5
5
|
post "confirm_block", to: "block_confirmations#confirm_block"
|
6
|
-
|
6
|
+
post "open_ticket", to: "ticket_manager#open_ticket"
|
7
7
|
get "info_to_mine", to: "block_confirmations#info_to_mine"
|
8
8
|
end
|
9
9
|
end
|
data/lib/osbc/osbc.rb
CHANGED
data/mining_concept.ipynb
CHANGED
@@ -93,8 +93,8 @@
|
|
93
93
|
"secret = 'a239c12ecc42911ecbc3b23a9539976caaa60f7d40028dea17cb67cc538c21bd'\n",
|
94
94
|
"\n",
|
95
95
|
"headers = {\n",
|
96
|
-
" 'X-
|
97
|
-
" 'X-
|
96
|
+
" 'X-API-KEY': key,\n",
|
97
|
+
" 'X-API-SECRET': secret,\n",
|
98
98
|
"}\n",
|
99
99
|
"\n",
|
100
100
|
"\n",
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: osbc
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- jesus_gautamah
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-11-
|
11
|
+
date: 2022-11-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -340,7 +340,9 @@ files:
|
|
340
340
|
- app/assets/stylesheets/home.css
|
341
341
|
- app/channels/application_cable/channel.rb
|
342
342
|
- app/channels/application_cable/connection.rb
|
343
|
+
- app/controllers/api/v1/application_controller.rb
|
343
344
|
- app/controllers/api/v1/block_confirmations_controller.rb
|
345
|
+
- app/controllers/api/v1/ticket_manager_controller.rb
|
344
346
|
- app/controllers/application_controller.rb
|
345
347
|
- app/controllers/blocks_controller.rb
|
346
348
|
- app/controllers/chains_controller.rb
|
@@ -520,6 +522,7 @@ files:
|
|
520
522
|
- config/initializers/filter_parameter_logging.rb
|
521
523
|
- config/initializers/inflections.rb
|
522
524
|
- config/initializers/permissions_policy.rb
|
525
|
+
- config/initializers/sidekiq.rb
|
523
526
|
- config/locales/devise.en.yml
|
524
527
|
- config/locales/en.yml
|
525
528
|
- config/puma.rb
|
@@ -528,39 +531,6 @@ files:
|
|
528
531
|
- config/sidekiq.yml
|
529
532
|
- config/storage.yml
|
530
533
|
- config/tailwind.config.js
|
531
|
-
- coverage/.last_run.json
|
532
|
-
- coverage/.resultset.json
|
533
|
-
- coverage/.resultset.json.lock
|
534
|
-
- coverage/assets/0.12.3/DataTables-1.10.20/images/sort_asc.png
|
535
|
-
- coverage/assets/0.12.3/DataTables-1.10.20/images/sort_asc_disabled.png
|
536
|
-
- coverage/assets/0.12.3/DataTables-1.10.20/images/sort_both.png
|
537
|
-
- coverage/assets/0.12.3/DataTables-1.10.20/images/sort_desc.png
|
538
|
-
- coverage/assets/0.12.3/DataTables-1.10.20/images/sort_desc_disabled.png
|
539
|
-
- coverage/assets/0.12.3/application.css
|
540
|
-
- coverage/assets/0.12.3/application.js
|
541
|
-
- coverage/assets/0.12.3/colorbox/border.png
|
542
|
-
- coverage/assets/0.12.3/colorbox/controls.png
|
543
|
-
- coverage/assets/0.12.3/colorbox/loading.gif
|
544
|
-
- coverage/assets/0.12.3/colorbox/loading_background.png
|
545
|
-
- coverage/assets/0.12.3/favicon_green.png
|
546
|
-
- coverage/assets/0.12.3/favicon_red.png
|
547
|
-
- coverage/assets/0.12.3/favicon_yellow.png
|
548
|
-
- coverage/assets/0.12.3/images/ui-bg_flat_0_aaaaaa_40x100.png
|
549
|
-
- coverage/assets/0.12.3/images/ui-bg_flat_75_ffffff_40x100.png
|
550
|
-
- coverage/assets/0.12.3/images/ui-bg_glass_55_fbf9ee_1x400.png
|
551
|
-
- coverage/assets/0.12.3/images/ui-bg_glass_65_ffffff_1x400.png
|
552
|
-
- coverage/assets/0.12.3/images/ui-bg_glass_75_dadada_1x400.png
|
553
|
-
- coverage/assets/0.12.3/images/ui-bg_glass_75_e6e6e6_1x400.png
|
554
|
-
- coverage/assets/0.12.3/images/ui-bg_glass_95_fef1ec_1x400.png
|
555
|
-
- coverage/assets/0.12.3/images/ui-bg_highlight-soft_75_cccccc_1x100.png
|
556
|
-
- coverage/assets/0.12.3/images/ui-icons_222222_256x240.png
|
557
|
-
- coverage/assets/0.12.3/images/ui-icons_2e83ff_256x240.png
|
558
|
-
- coverage/assets/0.12.3/images/ui-icons_454545_256x240.png
|
559
|
-
- coverage/assets/0.12.3/images/ui-icons_888888_256x240.png
|
560
|
-
- coverage/assets/0.12.3/images/ui-icons_cd0a0a_256x240.png
|
561
|
-
- coverage/assets/0.12.3/loading.gif
|
562
|
-
- coverage/assets/0.12.3/magnify.png
|
563
|
-
- coverage/index.html
|
564
534
|
- db/migrate/20221018053949_devise_create_users.rb
|
565
535
|
- db/migrate/20221019002956_create_chains.rb
|
566
536
|
- db/migrate/20221020112137_create_blocks.rb
|
@@ -622,7 +592,7 @@ metadata:
|
|
622
592
|
allowed_push_host: https://rubygems.org
|
623
593
|
homepage_uri: https://outerspace-blockchain.herokuapp.com/
|
624
594
|
source_code_uri: https://github.com/JesusGautamah/outerspace-blockchain
|
625
|
-
changelog_uri: https://github.com/
|
595
|
+
changelog_uri: https://github.com/JesusGautamah/outerspace-blockchain/blob/main/CHANGELOG.md
|
626
596
|
post_install_message:
|
627
597
|
rdoc_options: []
|
628
598
|
require_paths:
|