silkey-sdk 0.0.1

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 (89) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +14 -0
  3. data/.rubocop.yml +59 -0
  4. data/.ruby-version +1 -0
  5. data/CHANGELOG.md +9 -0
  6. data/DEVELOPMENT.md +83 -0
  7. data/Gemfile +13 -0
  8. data/Gemfile.lock +128 -0
  9. data/LICENSE.txt +21 -0
  10. data/README.md +46 -0
  11. data/Rakefile +2 -0
  12. data/bin/console +14 -0
  13. data/bin/setup +8 -0
  14. data/doc/CHANGELOG_md.html +112 -0
  15. data/doc/LICENSE_txt.html +99 -0
  16. data/doc/Object.html +117 -0
  17. data/doc/README_md.html +144 -0
  18. data/doc/Silkey.html +269 -0
  19. data/doc/Silkey/ClientFactory.html +106 -0
  20. data/doc/Silkey/Configuration.html +217 -0
  21. data/doc/Silkey/Contract.html +106 -0
  22. data/doc/Silkey/Contract/FrozenArray.html +106 -0
  23. data/doc/Silkey/ContractFactory.html +106 -0
  24. data/doc/Silkey/LoggerService.html +106 -0
  25. data/doc/Silkey/Models.html +99 -0
  26. data/doc/Silkey/Models/JwtPayload.html +622 -0
  27. data/doc/Silkey/RegistryContract.html +106 -0
  28. data/doc/Silkey/SDK.html +356 -0
  29. data/doc/Silkey/Utils.html +709 -0
  30. data/doc/created.rid +23 -0
  31. data/doc/css/fonts.css +167 -0
  32. data/doc/css/rdoc.css +619 -0
  33. data/doc/fonts/Lato-Light.ttf +0 -0
  34. data/doc/fonts/Lato-LightItalic.ttf +0 -0
  35. data/doc/fonts/Lato-Regular.ttf +0 -0
  36. data/doc/fonts/Lato-RegularItalic.ttf +0 -0
  37. data/doc/fonts/SourceCodePro-Bold.ttf +0 -0
  38. data/doc/fonts/SourceCodePro-Regular.ttf +0 -0
  39. data/doc/images/add.png +0 -0
  40. data/doc/images/arrow_up.png +0 -0
  41. data/doc/images/brick.png +0 -0
  42. data/doc/images/brick_link.png +0 -0
  43. data/doc/images/bug.png +0 -0
  44. data/doc/images/bullet_black.png +0 -0
  45. data/doc/images/bullet_toggle_minus.png +0 -0
  46. data/doc/images/bullet_toggle_plus.png +0 -0
  47. data/doc/images/date.png +0 -0
  48. data/doc/images/delete.png +0 -0
  49. data/doc/images/find.png +0 -0
  50. data/doc/images/loadingAnimation.gif +0 -0
  51. data/doc/images/macFFBgHack.png +0 -0
  52. data/doc/images/package.png +0 -0
  53. data/doc/images/page_green.png +0 -0
  54. data/doc/images/page_white_text.png +0 -0
  55. data/doc/images/page_white_width.png +0 -0
  56. data/doc/images/plugin.png +0 -0
  57. data/doc/images/ruby.png +0 -0
  58. data/doc/images/tag_blue.png +0 -0
  59. data/doc/images/tag_green.png +0 -0
  60. data/doc/images/transparent.png +0 -0
  61. data/doc/images/wrench.png +0 -0
  62. data/doc/images/wrench_orange.png +0 -0
  63. data/doc/images/zoom.png +0 -0
  64. data/doc/index.html +112 -0
  65. data/doc/js/darkfish.js +84 -0
  66. data/doc/js/navigation.js +105 -0
  67. data/doc/js/navigation.js.gz +0 -0
  68. data/doc/js/search.js +110 -0
  69. data/doc/js/search_index.js +1 -0
  70. data/doc/js/search_index.js.gz +0 -0
  71. data/doc/js/searcher.js +229 -0
  72. data/doc/js/searcher.js.gz +0 -0
  73. data/doc/table_of_contents.html +318 -0
  74. data/lib/silkey-sdk.rb +23 -0
  75. data/lib/silkey.rb +22 -0
  76. data/lib/silkey/abi/registry_contract_abi.json +129 -0
  77. data/lib/silkey/configuration.rb +24 -0
  78. data/lib/silkey/contract.rb +38 -0
  79. data/lib/silkey/factories/client_factory.rb +30 -0
  80. data/lib/silkey/factories/contract_factory.rb +47 -0
  81. data/lib/silkey/models/jwt_payload.rb +157 -0
  82. data/lib/silkey/registry_contract/registry_contract.rb +33 -0
  83. data/lib/silkey/sdk.rb +207 -0
  84. data/lib/silkey/services/logger_service.rb +19 -0
  85. data/lib/silkey/utils.rb +107 -0
  86. data/lib/silkey/version.rb +5 -0
  87. data/lib/silkey_sdk.rb +3 -0
  88. data/silkey-sdk.gemspec +48 -0
  89. metadata +332 -0
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Silkey # :nodoc: all
4
+ class RegistryContract
5
+ CONTRACT_NAME = 'RegistryContractInstance'
6
+
7
+ class << self
8
+ def get_address(name)
9
+ new.get_address(name)
10
+ end
11
+ end
12
+
13
+ attr_reader :contract
14
+
15
+ delegate :call, to: :contract, prefix: true
16
+
17
+ def initialize(params = {})
18
+ @contract = ContractFactory.call(default_params.merge(params))
19
+ end
20
+
21
+ def get_address(name)
22
+ Silkey::Utils.add0x(contract_call.get_address(name))
23
+ end
24
+
25
+ def default_params
26
+ {
27
+ name: CONTRACT_NAME,
28
+ address: Configuration.registry_contract_address,
29
+ abi: Configuration.registry_contract_abi,
30
+ }.freeze
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,207 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Silkey
4
+ class SDK
5
+ class << self
6
+
7
+ ##
8
+ # Generates message to sign based on plain object data (keys => values)
9
+ #
10
+ # @param [Hash]
11
+ #
12
+ # @return [string]
13
+ #
14
+ # @example:
15
+ #
16
+ # Silkey::SDK.message_to_sign({ redirectUrl: 'http://silkey.io', refId: 1 });
17
+ #
18
+ # returns
19
+ #
20
+ # 'redirectUrl=http://silkey.io::refId=1'
21
+ #
22
+ def message_to_sign(hash = {})
23
+ msg = []
24
+ hash.keys.sort.each do |k|
25
+ if Silkey::Utils.empty?(hash[k])
26
+ msg.push("#{k}=")
27
+ else
28
+ msg.push("#{k}=#{hash[k]}")
29
+ end
30
+ end
31
+
32
+ msg.join('::')
33
+ end
34
+
35
+ ##
36
+ # Generates all needed parameters (including signature) for requesting Silkey SSO
37
+ #
38
+ # @param [string] private key of domain owner
39
+ #
40
+ # @param [Hash] Hash with data: {redirectUrl*, cancelUrl*, refId, scope, ssoTimestamp*}
41
+ # marked with * are required by Silkey SSO
42
+ #
43
+ # @return [Hash] {{signature, ssoTimestamp, redirectUrl, refId, scope}}
44
+ #
45
+ # @example
46
+ #
47
+ # Silkey::SDK.generate_sso_request_params(private_key, data)
48
+ #
49
+ def generate_sso_request_params(private_key, hash)
50
+ redirect_url = hash[:redirectUrl] || ''
51
+ cancel_url = hash[:cancelUrl] || ''
52
+ sso_timestamp = hash[:ssoTimestamp] || Silkey::Utils.current_timestamp
53
+ ref_id = hash[:refId] || ''
54
+ scope = hash[:scope] || ''
55
+
56
+ message = message_to_sign({
57
+ redirectUrl: redirect_url,
58
+ cancelUrl: cancel_url,
59
+ ssoTimestamp: sso_timestamp,
60
+ refId: ref_id,
61
+ scope: scope
62
+ })
63
+
64
+ {
65
+ signature: Silkey::Utils.sign_message(private_key, message),
66
+ ssoTimestamp: sso_timestamp,
67
+ redirectUrl: redirect_url,
68
+ cancelUrl: cancel_url,
69
+ refId: ref_id,
70
+ scope: scope
71
+ }
72
+ end
73
+
74
+ ##
75
+ # Verifies JWT token payload
76
+ #
77
+ # @see https://jwt.io/ for details about token payload data
78
+ #
79
+ # @param [string] JWT token returned by Silkey
80
+ #
81
+ # @param [string] silkeyPublicKey public ethereum address of Silkey
82
+ #
83
+ # @return [JwtPayload|null] null when signature(s) are invalid, otherwise token payload
84
+ #
85
+ # @throws when token is invalid or data are corrupted
86
+ #
87
+ # @example
88
+ #
89
+ # Silkey::SDK.token_payload_verifier(
90
+ # 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c',
91
+ # Silkey::SDK.fetch_silkey_public_key
92
+ # )
93
+ #
94
+ def token_payload_verifier(token, silkey_public_key = nil)
95
+ payload = token_payload(token)
96
+
97
+ if silkey_signature_valid?(payload, silkey_public_key) != false &&
98
+ user_signature_valid?(payload) != false
99
+ return Silkey::Models::JwtPayload.new.import(payload)
100
+ end
101
+
102
+ nil
103
+ rescue
104
+ nil
105
+ end
106
+
107
+ ##
108
+ # Fetches public ethereum Silkey address (directly from blockchain).
109
+ # This address can be used for token verification
110
+ #
111
+ # @param [string] providerUri ie: 'https://infura.io/v3/:infuraId' register to infura.io to get infuraId
112
+ #
113
+ # @param [string] address of silkey smart contract registry
114
+ #
115
+ # @return [string] public ethereum address of silkey signer
116
+ #
117
+ # @see List of Silkey contracts addresses: https://github.com/Silkey-Team/silkey-sdk#silkey-sdk
118
+ #
119
+ def fetch_silkey_public_key
120
+ public_key = Silkey::RegistryContract.get_address('Hades')
121
+
122
+ raise "Invalid public key: #{public_key}" unless Silkey::Utils.ethereum_address?(public_key)
123
+
124
+ public_key
125
+ end
126
+
127
+ private
128
+
129
+ def token_payload(token)
130
+ # Set password to nil and validation to false otherwise this won't work
131
+ decoded = JWT.decode token, nil, false
132
+ decoded[0]
133
+ end
134
+
135
+ def user_signature_valid?(payload)
136
+ jwt_payload = Silkey::Models::JwtPayload.new.import(payload)
137
+ utils = Silkey::Utils
138
+
139
+ if utils.empty?(jwt_payload.address) ||
140
+ utils.empty?(jwt_payload.user_signature) ||
141
+ utils.empty?(jwt_payload.user_signature_timestamp)
142
+ logger.warn('Verification failed, missing user signature/timestamp and/or address')
143
+ return false
144
+ end
145
+
146
+ signer = Silkey::Utils
147
+ .verify_message(jwt_payload.message_to_sign_by_user, jwt_payload.user_signature)
148
+
149
+ success = signer == jwt_payload.address
150
+
151
+ unless success
152
+ logger.warn("user_signature_valid?: expect #{signer} to be equal #{jwt_payload.address}")
153
+ end
154
+
155
+ success
156
+ rescue StandardError => e
157
+ logger.error(e)
158
+ false
159
+ end
160
+
161
+ def silkey_signature_valid?(payload, silkey_public_key)
162
+ jwt_payload = Silkey::Models::JwtPayload.new.import(payload)
163
+ utils = Silkey::Utils
164
+
165
+ if utils.empty?(jwt_payload.email) && utils.empty?(jwt_payload.silkey_signature)
166
+ return nil
167
+ end
168
+
169
+ if utils.empty?(jwt_payload.email) ^ utils.empty?(jwt_payload.silkey_signature)
170
+ logger.warn('Verification failed, missing silkey signature or email')
171
+ return false
172
+ end
173
+
174
+ if utils.empty?(jwt_payload.silkey_signature_timestamp)
175
+ logger.warn('Verification failed, missing silkey signature timestamp')
176
+ return false
177
+ end
178
+
179
+ signer = Silkey::Utils.verify_message(
180
+ jwt_payload.message_to_sign_by_silkey, jwt_payload.silkey_signature
181
+ )
182
+
183
+ if Silkey::Utils.empty?(silkey_public_key)
184
+ logger.warn('You are using verification without checking silkey signature. '\
185
+ 'We strongly recommended to turn on full verification. '\
186
+ 'This option can be deprecated in the future')
187
+ return true
188
+ end
189
+
190
+ success = signer == silkey_public_key
191
+
192
+ unless success
193
+ logger.warn("silkey_signature_valid?: expect #{signer} to be equal #{silkey_public_key}")
194
+ end
195
+
196
+ success
197
+ rescue StandardError => e
198
+ logger.error(e)
199
+ false
200
+ end
201
+
202
+ def logger
203
+ Silkey::LoggerService
204
+ end
205
+ end
206
+ end
207
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Silkey # :nodoc: all
4
+ class LoggerService
5
+ class << self
6
+ delegate :info, :debug, :error, :warn, to: :logger
7
+
8
+ def logger
9
+ if @logger.nil?
10
+ @logger = Logger.new(STDOUT)
11
+ @logger.level = Logger::INFO
12
+ @logger.datetime_format = '%a %d-%m-%Y %H%M '
13
+ end
14
+
15
+ @logger
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,107 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Silkey
4
+ class Utils
5
+ class << self
6
+ def empty?(string)
7
+ string.nil? || string.to_s == ''
8
+ end
9
+
10
+ def remove0x(string)
11
+ string.to_s.sub('0x', '')
12
+ end
13
+
14
+ def add0x(string)
15
+ return string if string.to_s[0..1] == '0x'
16
+
17
+ "0x#{string}"
18
+ end
19
+
20
+ def hex?(string)
21
+ return false if empty?(string)
22
+
23
+ !remove0x(string)[/\H/]
24
+ end
25
+
26
+ def str_to_bytes32(string)
27
+ return '' if empty?(string)
28
+
29
+ hex = string.to_s.unpack('H*')[0]
30
+ "0x#{hex}#{['0'].cycle(64 - hex.length).to_a.join('')}"
31
+ end
32
+
33
+ def empty_hex?(string)
34
+ return true if empty?(string)
35
+ return false unless hex?(string)
36
+
37
+ !remove0x(string).split('').reduce(false) { |non_zero, c| c != '0' || non_zero }
38
+ end
39
+
40
+ def private_key?(string)
41
+ hex_and_length?(string, 64)
42
+ end
43
+
44
+ def ethereum_address?(string)
45
+ hex_and_length?(string, 40)
46
+ end
47
+
48
+ def signature?(string)
49
+ hex_and_length?(string, 130)
50
+ end
51
+
52
+ def current_timestamp
53
+ Time.now.getutc.to_i
54
+ end
55
+
56
+ def int_to_hex(int)
57
+ return '' if empty?(int)
58
+
59
+ hex = int.to_i.to_s(16)
60
+
61
+ return hex if hex.length.even?
62
+
63
+ "0#{hex}"
64
+ end
65
+
66
+ def strings_to_hex(arr)
67
+ arr.map { |str| str.to_s.unpack('H*') }.join('')
68
+ end
69
+
70
+ def sign_message(private_key, message)
71
+ wallet = Eth::Key.new priv: Silkey::Utils.remove0x(private_key)
72
+ wallet.personal_sign(message)
73
+ end
74
+
75
+ def sign_plain_message(private_key, message)
76
+ wallet = Eth::Key.new priv: Silkey::Utils.remove0x(private_key)
77
+ bin_signature = wallet.sign(message)
78
+ Eth::Utils.bin_to_hex(bin_signature)
79
+ end
80
+
81
+ def verify_message(message, signature)
82
+ public_key = Eth::Key.personal_recover(message, signature)
83
+ return nil if public_key.nil?
84
+
85
+ Eth::Utils.public_key_to_address(public_key)
86
+ end
87
+
88
+ def verify_plain_message(message, signature)
89
+ bin_signature = Eth::Utils.hex_to_bin(signature)
90
+ hash = Eth::Utils.keccak256(message)
91
+ public_key = Eth::OpenSsl.recover_compact(hash, bin_signature)
92
+ return nil if public_key.nil?
93
+
94
+ Eth::Utils.public_key_to_address(public_key)
95
+ end
96
+
97
+ private
98
+
99
+ def hex_and_length?(string, len)
100
+ return false if empty_hex?(string)
101
+ return false unless hex?(string)
102
+
103
+ remove0x(string).length == len
104
+ end
105
+ end
106
+ end
107
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Silkey
4
+ VERSION = '0.0.1'
5
+ end
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'silkey-sdk'
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ lib = File.expand_path('lib', __dir__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+ require 'silkey/version'
6
+
7
+ Gem::Specification.new do |spec|
8
+ spec.required_ruby_version = '>= 2.6'
9
+ spec.name = 'silkey-sdk'
10
+ spec.version = Silkey::VERSION
11
+ spec.authors = ['silkey.io']
12
+ spec.email = ['dariusz@silkey.io']
13
+
14
+ spec.summary = 'Silkey SDK for Ruby.'
15
+ spec.homepage = 'https://github.com/Silkey-Team/ruby-sdk'
16
+ spec.license = 'MIT'
17
+
18
+ # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
19
+ # to allow pushing to a single host or delete this section to allow pushing to any host.
20
+ # if spec.respond_to?(:metadata)
21
+ # spec.metadata['allowed_push_host'] = "TODO: Set to 'http://mygemserver.com'"
22
+ # else
23
+ # raise 'RubyGems 2.0 or newer is required to protect against ' \
24
+ # 'public gem pushes.'
25
+ # end
26
+
27
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
28
+ f.match(%r{^(test|spec|features)/})
29
+ end
30
+
31
+ spec.bindir = 'exe'
32
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
33
+ spec.require_paths = ['lib']
34
+ spec.add_dependency 'activesupport', '~> 6.0'
35
+ spec.add_dependency 'jwt', '~> 2.2.2'
36
+ spec.add_dependency 'eth', '~> 0.4.12'
37
+ spec.add_dependency 'ethereum.rb', '~> 2.5'
38
+ spec.add_dependency 'virtus', '~> 1.0'
39
+ spec.add_dependency 'virtus_convert', '~> 0.1'
40
+ spec.add_development_dependency 'rdoc', '~> 6.2', '>= 6.2.1'
41
+ spec.add_development_dependency 'bundler', '~> 2.0'
42
+ spec.add_development_dependency 'factory_bot', '~> 6.1'
43
+ spec.add_development_dependency 'pry', '~> 0.13'
44
+ spec.add_development_dependency 'rake', '~> 13.0'
45
+ spec.add_development_dependency 'rspec', '~> 3.10'
46
+ spec.add_development_dependency 'rubocop', '~> 1.3'
47
+ spec.add_development_dependency 'rubocop-performance', '~> 1.8'
48
+ end
metadata ADDED
@@ -0,0 +1,332 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: silkey-sdk
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - silkey.io
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2020-11-20 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '6.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '6.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: jwt
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 2.2.2
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 2.2.2
41
+ - !ruby/object:Gem::Dependency
42
+ name: eth
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 0.4.12
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 0.4.12
55
+ - !ruby/object:Gem::Dependency
56
+ name: ethereum.rb
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '2.5'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '2.5'
69
+ - !ruby/object:Gem::Dependency
70
+ name: virtus
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '1.0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '1.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: virtus_convert
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '0.1'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '0.1'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rdoc
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '6.2'
104
+ - - ">="
105
+ - !ruby/object:Gem::Version
106
+ version: 6.2.1
107
+ type: :development
108
+ prerelease: false
109
+ version_requirements: !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - "~>"
112
+ - !ruby/object:Gem::Version
113
+ version: '6.2'
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ version: 6.2.1
117
+ - !ruby/object:Gem::Dependency
118
+ name: bundler
119
+ requirement: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - "~>"
122
+ - !ruby/object:Gem::Version
123
+ version: '2.0'
124
+ type: :development
125
+ prerelease: false
126
+ version_requirements: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - "~>"
129
+ - !ruby/object:Gem::Version
130
+ version: '2.0'
131
+ - !ruby/object:Gem::Dependency
132
+ name: factory_bot
133
+ requirement: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - "~>"
136
+ - !ruby/object:Gem::Version
137
+ version: '6.1'
138
+ type: :development
139
+ prerelease: false
140
+ version_requirements: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - "~>"
143
+ - !ruby/object:Gem::Version
144
+ version: '6.1'
145
+ - !ruby/object:Gem::Dependency
146
+ name: pry
147
+ requirement: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - "~>"
150
+ - !ruby/object:Gem::Version
151
+ version: '0.13'
152
+ type: :development
153
+ prerelease: false
154
+ version_requirements: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - "~>"
157
+ - !ruby/object:Gem::Version
158
+ version: '0.13'
159
+ - !ruby/object:Gem::Dependency
160
+ name: rake
161
+ requirement: !ruby/object:Gem::Requirement
162
+ requirements:
163
+ - - "~>"
164
+ - !ruby/object:Gem::Version
165
+ version: '13.0'
166
+ type: :development
167
+ prerelease: false
168
+ version_requirements: !ruby/object:Gem::Requirement
169
+ requirements:
170
+ - - "~>"
171
+ - !ruby/object:Gem::Version
172
+ version: '13.0'
173
+ - !ruby/object:Gem::Dependency
174
+ name: rspec
175
+ requirement: !ruby/object:Gem::Requirement
176
+ requirements:
177
+ - - "~>"
178
+ - !ruby/object:Gem::Version
179
+ version: '3.10'
180
+ type: :development
181
+ prerelease: false
182
+ version_requirements: !ruby/object:Gem::Requirement
183
+ requirements:
184
+ - - "~>"
185
+ - !ruby/object:Gem::Version
186
+ version: '3.10'
187
+ - !ruby/object:Gem::Dependency
188
+ name: rubocop
189
+ requirement: !ruby/object:Gem::Requirement
190
+ requirements:
191
+ - - "~>"
192
+ - !ruby/object:Gem::Version
193
+ version: '1.3'
194
+ type: :development
195
+ prerelease: false
196
+ version_requirements: !ruby/object:Gem::Requirement
197
+ requirements:
198
+ - - "~>"
199
+ - !ruby/object:Gem::Version
200
+ version: '1.3'
201
+ - !ruby/object:Gem::Dependency
202
+ name: rubocop-performance
203
+ requirement: !ruby/object:Gem::Requirement
204
+ requirements:
205
+ - - "~>"
206
+ - !ruby/object:Gem::Version
207
+ version: '1.8'
208
+ type: :development
209
+ prerelease: false
210
+ version_requirements: !ruby/object:Gem::Requirement
211
+ requirements:
212
+ - - "~>"
213
+ - !ruby/object:Gem::Version
214
+ version: '1.8'
215
+ description:
216
+ email:
217
+ - dariusz@silkey.io
218
+ executables: []
219
+ extensions: []
220
+ extra_rdoc_files: []
221
+ files:
222
+ - ".gitignore"
223
+ - ".rubocop.yml"
224
+ - ".ruby-version"
225
+ - CHANGELOG.md
226
+ - DEVELOPMENT.md
227
+ - Gemfile
228
+ - Gemfile.lock
229
+ - LICENSE.txt
230
+ - README.md
231
+ - Rakefile
232
+ - bin/console
233
+ - bin/setup
234
+ - doc/CHANGELOG_md.html
235
+ - doc/LICENSE_txt.html
236
+ - doc/Object.html
237
+ - doc/README_md.html
238
+ - doc/Silkey.html
239
+ - doc/Silkey/ClientFactory.html
240
+ - doc/Silkey/Configuration.html
241
+ - doc/Silkey/Contract.html
242
+ - doc/Silkey/Contract/FrozenArray.html
243
+ - doc/Silkey/ContractFactory.html
244
+ - doc/Silkey/LoggerService.html
245
+ - doc/Silkey/Models.html
246
+ - doc/Silkey/Models/JwtPayload.html
247
+ - doc/Silkey/RegistryContract.html
248
+ - doc/Silkey/SDK.html
249
+ - doc/Silkey/Utils.html
250
+ - doc/created.rid
251
+ - doc/css/fonts.css
252
+ - doc/css/rdoc.css
253
+ - doc/fonts/Lato-Light.ttf
254
+ - doc/fonts/Lato-LightItalic.ttf
255
+ - doc/fonts/Lato-Regular.ttf
256
+ - doc/fonts/Lato-RegularItalic.ttf
257
+ - doc/fonts/SourceCodePro-Bold.ttf
258
+ - doc/fonts/SourceCodePro-Regular.ttf
259
+ - doc/images/add.png
260
+ - doc/images/arrow_up.png
261
+ - doc/images/brick.png
262
+ - doc/images/brick_link.png
263
+ - doc/images/bug.png
264
+ - doc/images/bullet_black.png
265
+ - doc/images/bullet_toggle_minus.png
266
+ - doc/images/bullet_toggle_plus.png
267
+ - doc/images/date.png
268
+ - doc/images/delete.png
269
+ - doc/images/find.png
270
+ - doc/images/loadingAnimation.gif
271
+ - doc/images/macFFBgHack.png
272
+ - doc/images/package.png
273
+ - doc/images/page_green.png
274
+ - doc/images/page_white_text.png
275
+ - doc/images/page_white_width.png
276
+ - doc/images/plugin.png
277
+ - doc/images/ruby.png
278
+ - doc/images/tag_blue.png
279
+ - doc/images/tag_green.png
280
+ - doc/images/transparent.png
281
+ - doc/images/wrench.png
282
+ - doc/images/wrench_orange.png
283
+ - doc/images/zoom.png
284
+ - doc/index.html
285
+ - doc/js/darkfish.js
286
+ - doc/js/navigation.js
287
+ - doc/js/navigation.js.gz
288
+ - doc/js/search.js
289
+ - doc/js/search_index.js
290
+ - doc/js/search_index.js.gz
291
+ - doc/js/searcher.js
292
+ - doc/js/searcher.js.gz
293
+ - doc/table_of_contents.html
294
+ - lib/silkey-sdk.rb
295
+ - lib/silkey.rb
296
+ - lib/silkey/abi/registry_contract_abi.json
297
+ - lib/silkey/configuration.rb
298
+ - lib/silkey/contract.rb
299
+ - lib/silkey/factories/client_factory.rb
300
+ - lib/silkey/factories/contract_factory.rb
301
+ - lib/silkey/models/jwt_payload.rb
302
+ - lib/silkey/registry_contract/registry_contract.rb
303
+ - lib/silkey/sdk.rb
304
+ - lib/silkey/services/logger_service.rb
305
+ - lib/silkey/utils.rb
306
+ - lib/silkey/version.rb
307
+ - lib/silkey_sdk.rb
308
+ - silkey-sdk.gemspec
309
+ homepage: https://github.com/Silkey-Team/ruby-sdk
310
+ licenses:
311
+ - MIT
312
+ metadata: {}
313
+ post_install_message:
314
+ rdoc_options: []
315
+ require_paths:
316
+ - lib
317
+ required_ruby_version: !ruby/object:Gem::Requirement
318
+ requirements:
319
+ - - ">="
320
+ - !ruby/object:Gem::Version
321
+ version: '2.6'
322
+ required_rubygems_version: !ruby/object:Gem::Requirement
323
+ requirements:
324
+ - - ">="
325
+ - !ruby/object:Gem::Version
326
+ version: '0'
327
+ requirements: []
328
+ rubygems_version: 3.1.4
329
+ signing_key:
330
+ specification_version: 4
331
+ summary: Silkey SDK for Ruby.
332
+ test_files: []