solana_rpc_ruby 1.0.0 → 1.1.2
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 +18 -1
- data/LICENSE +20 -674
- data/README.md +158 -3
- data/lib/generators/templates/solana_rpc_ruby_config.rb +2 -0
- data/lib/solana_rpc_ruby/api_client.rb +5 -3
- data/lib/solana_rpc_ruby/api_error.rb +13 -2
- data/lib/solana_rpc_ruby/helper_methods.rb +13 -0
- data/lib/solana_rpc_ruby/methods_wrapper.rb +13 -9
- data/lib/solana_rpc_ruby/request_body.rb +9 -4
- data/lib/solana_rpc_ruby/version.rb +1 -1
- data/lib/solana_rpc_ruby/websocket_client.rb +111 -0
- data/lib/solana_rpc_ruby/websocket_methods_wrapper.rb +300 -0
- data/lib/solana_rpc_ruby.rb +6 -0
- data/solana_rpc_ruby.gemspec +4 -2
- metadata +23 -7
@@ -0,0 +1,300 @@
|
|
1
|
+
require 'json'
|
2
|
+
require_relative 'request_body'
|
3
|
+
require_relative 'helper_methods'
|
4
|
+
|
5
|
+
module SolanaRpcRuby
|
6
|
+
##
|
7
|
+
# WebsocketsMethodsWrapper class serves as a wrapper for solana JSON RPC API websocket methods.
|
8
|
+
# All informations about params:
|
9
|
+
# @see https://docs.solana.com/developing/clients/jsonrpc-api#subscription-websocket
|
10
|
+
class WebsocketsMethodsWrapper
|
11
|
+
include RequestBody
|
12
|
+
include HelperMethods
|
13
|
+
|
14
|
+
# Determines which cluster will be used to send requests.
|
15
|
+
# @return [SolanaRpcRuby::WebsocketClient]
|
16
|
+
attr_accessor :websocket_client
|
17
|
+
|
18
|
+
# Cluster where requests will be sent.
|
19
|
+
# @return [String]
|
20
|
+
attr_accessor :cluster
|
21
|
+
|
22
|
+
# Unique client-generated identifying integer.
|
23
|
+
# @return [Integer]
|
24
|
+
attr_accessor :id
|
25
|
+
|
26
|
+
# Initialize object with cluster address where requests will be sent.
|
27
|
+
#
|
28
|
+
# @param api_client [ApiClient]
|
29
|
+
# @param cluster [String] cluster where requests will be sent.
|
30
|
+
# @param id [Integer] unique client-generated identifying integer.
|
31
|
+
def initialize(
|
32
|
+
websocket_client: WebsocketClient,
|
33
|
+
cluster: SolanaRpcRuby.ws_cluster,
|
34
|
+
id: rand(1...99_999)
|
35
|
+
)
|
36
|
+
@websocket_client = websocket_client.new(cluster: cluster)
|
37
|
+
@id = id
|
38
|
+
end
|
39
|
+
|
40
|
+
# @see https://docs.solana.com/developing/clients/jsonrpc-api#accountsubscribe
|
41
|
+
# Subscribe to an account to receive notifications when the lamports or data for a given account public key changes
|
42
|
+
#
|
43
|
+
# @param account_pubkey [String]
|
44
|
+
# @param commitment [String]
|
45
|
+
# @param encoding [String]
|
46
|
+
# @param &block [Proc]
|
47
|
+
#
|
48
|
+
# @return [Integer] Subscription id (needed to unsubscribe)
|
49
|
+
def account_subscribe(account_pubkey, commitment: nil, encoding: '', &block)
|
50
|
+
method = create_method_name(__method__)
|
51
|
+
|
52
|
+
params = []
|
53
|
+
params_hash = {}
|
54
|
+
params_hash['commitment'] = commitment unless blank?(commitment)
|
55
|
+
params_hash['encoding'] = encoding unless blank?(encoding)
|
56
|
+
|
57
|
+
params << account_pubkey
|
58
|
+
params << params_hash if params_hash.any?
|
59
|
+
|
60
|
+
subscribe(method, method_params: params, &block)
|
61
|
+
end
|
62
|
+
|
63
|
+
# @see https://docs.solana.com/developing/clients/jsonrpc-api#accountunsubscribe
|
64
|
+
# Unsubscribe from account change notifications
|
65
|
+
#
|
66
|
+
# @param subscription_id [Integer]
|
67
|
+
#
|
68
|
+
# @return [Bool] unsubscribe success message
|
69
|
+
def account_unsubscribe(subscription_id)
|
70
|
+
method = create_method_name(__method__)
|
71
|
+
unsubscribe(method, subscription_id: subscription_id)
|
72
|
+
end
|
73
|
+
|
74
|
+
# @see https://docs.solana.com/developing/clients/jsonrpc-api#logssubscribe
|
75
|
+
# Subscribe to transaction logging
|
76
|
+
#
|
77
|
+
# @param filter [String]|[Hash]
|
78
|
+
# @option filter [Array] :mentions
|
79
|
+
# @param commitment [String]
|
80
|
+
# @param &block [Proc]
|
81
|
+
#
|
82
|
+
# @return [Integer] Subscription id (needed to unsubscribe)
|
83
|
+
def logs_subscribe(filter, commitment: nil, &block)
|
84
|
+
method = create_method_name(__method__)
|
85
|
+
|
86
|
+
params = []
|
87
|
+
params_hash = {}
|
88
|
+
params_hash['commitment'] = commitment unless blank?(commitment)
|
89
|
+
|
90
|
+
params << filter
|
91
|
+
params << params_hash
|
92
|
+
|
93
|
+
subscribe(method, method_params: params, &block)
|
94
|
+
end
|
95
|
+
|
96
|
+
# @see https://docs.solana.com/developing/clients/jsonrpc-api#logsunsubscribe
|
97
|
+
# Unsubscribe from transaction logging
|
98
|
+
#
|
99
|
+
# @param subscription_id [Integer]
|
100
|
+
#
|
101
|
+
# @return [Bool] unsubscribe success message
|
102
|
+
|
103
|
+
def logs_unsubscribe(subscription_id)
|
104
|
+
method = create_method_name(__method__)
|
105
|
+
unsubscribe(method, subscription_id: subscription_id)
|
106
|
+
end
|
107
|
+
|
108
|
+
# @see https://docs.solana.com/developing/clients/jsonrpc-api#programsubscribe
|
109
|
+
# Subscribe to a program to receive notifications when the lamports or data for a given account owned by the program changes
|
110
|
+
#
|
111
|
+
# @param account_pubkey [String]
|
112
|
+
# @param commitment [String]
|
113
|
+
# @param encoding [String]
|
114
|
+
# @param filters [Array]
|
115
|
+
# @param &block [Proc]
|
116
|
+
#
|
117
|
+
# @return [Integer] Subscription id (needed to unsubscribe)
|
118
|
+
def program_subscribe(
|
119
|
+
program_id_pubkey,
|
120
|
+
commitment: nil,
|
121
|
+
encoding: '',
|
122
|
+
filters: [],
|
123
|
+
&block
|
124
|
+
)
|
125
|
+
method = create_method_name(__method__)
|
126
|
+
|
127
|
+
params = []
|
128
|
+
params_hash = {}
|
129
|
+
params_hash['commitment'] = commitment unless blank?(commitment)
|
130
|
+
params_hash['encoding'] = encoding unless blank?(encoding)
|
131
|
+
params_hash['filters'] = filters unless blank?(filters)
|
132
|
+
|
133
|
+
params << program_id_pubkey
|
134
|
+
params << params_hash if params_hash.any?
|
135
|
+
|
136
|
+
subscribe(method, method_params: params, &block)
|
137
|
+
end
|
138
|
+
|
139
|
+
# @see https://docs.solana.com/developing/clients/jsonrpc-api#programunsubscribe
|
140
|
+
# Unsubscribe from program-owned account change notifications
|
141
|
+
#
|
142
|
+
# @param subscription_id [Integer]
|
143
|
+
#
|
144
|
+
# @return [Bool] unsubscribe success message
|
145
|
+
|
146
|
+
def program_unsubscribe(subscription_id)
|
147
|
+
method = create_method_name(__method__)
|
148
|
+
unsubscribe(method, subscription_id: subscription_id)
|
149
|
+
end
|
150
|
+
|
151
|
+
# @see https://docs.solana.com/developing/clients/jsonrpc-api#signaturesubscribe
|
152
|
+
# Subscribe to a transaction signature to receive notification when the transaction is confirmed
|
153
|
+
# On signatureNotification, the subscription is automatically cancelled
|
154
|
+
#
|
155
|
+
# @param transaction_signature [String]
|
156
|
+
# @param commitment [String]
|
157
|
+
# @param &block [Proc]
|
158
|
+
#
|
159
|
+
# @return [Integer] Subscription id (needed to unsubscribe)
|
160
|
+
def signature_subscribe(
|
161
|
+
transaction_signature,
|
162
|
+
commitment: nil,
|
163
|
+
&block
|
164
|
+
)
|
165
|
+
method = create_method_name(__method__)
|
166
|
+
|
167
|
+
params = []
|
168
|
+
params_hash = {}
|
169
|
+
params_hash['commitment'] = commitment unless blank?(commitment)
|
170
|
+
|
171
|
+
params << transaction_signature
|
172
|
+
params << params_hash
|
173
|
+
|
174
|
+
subscribe(method, method_params: params, &block)
|
175
|
+
end
|
176
|
+
|
177
|
+
# @see https://docs.solana.com/developing/clients/jsonrpc-api#signatureunsubscribe
|
178
|
+
# Unsubscribe from signature confirmation notification
|
179
|
+
#
|
180
|
+
# @param subscription_id [Integer]
|
181
|
+
#
|
182
|
+
# @return [Bool] unsubscribe success message
|
183
|
+
def signature_unsubscribe(subscription_id)
|
184
|
+
method = create_method_name(__method__)
|
185
|
+
unsubscribe(method, subscription_id: subscription_id)
|
186
|
+
end
|
187
|
+
|
188
|
+
# @see https://docs.solana.com/developing/clients/jsonrpc-api#slotsubscribe
|
189
|
+
# Subscribe to receive notification anytime a slot is processed by the validator
|
190
|
+
#
|
191
|
+
# @param &block [Proc]
|
192
|
+
#
|
193
|
+
# @return [Integer] Subscription id (needed to unsubscribe)
|
194
|
+
def slot_subscribe(&block)
|
195
|
+
method = create_method_name(__method__)
|
196
|
+
|
197
|
+
subscribe(method, &block)
|
198
|
+
end
|
199
|
+
|
200
|
+
# @see https://docs.solana.com/developing/clients/jsonrpc-api#slotunsubscribe
|
201
|
+
# Unsubscribe from slot notifications
|
202
|
+
#
|
203
|
+
# @param subscription_id [Integer]
|
204
|
+
#
|
205
|
+
# @return [Bool] unsubscribe success message
|
206
|
+
def slot_unsubscribe(subscription_id)
|
207
|
+
method = create_method_name(__method__)
|
208
|
+
unsubscribe(method, subscription_id: subscription_id)
|
209
|
+
end
|
210
|
+
|
211
|
+
# @see https://docs.solana.com/developing/clients/jsonrpc-api#slotsupdatessubscribe---unstable
|
212
|
+
#
|
213
|
+
# This subscription is unstable; the format of this subscription may change in the future and it may not always be supported
|
214
|
+
# Subscribe to receive a notification from the validator on a variety of updates on every slot
|
215
|
+
#
|
216
|
+
# @param &block [Proc]
|
217
|
+
#
|
218
|
+
# @return [Integer] Subscription id (needed to unsubscribe)
|
219
|
+
def slots_updates_subscribe(&block)
|
220
|
+
method = create_method_name(__method__)
|
221
|
+
|
222
|
+
subscribe(method, &block)
|
223
|
+
end
|
224
|
+
|
225
|
+
# @see https://docs.solana.com/developing/clients/jsonrpc-api#slotsupdatesunsubscribe
|
226
|
+
# Unsubscribe from slot-update notifications
|
227
|
+
#
|
228
|
+
# @param subscription_id [Integer]
|
229
|
+
#
|
230
|
+
# @return [Bool] unsubscribe success message
|
231
|
+
def slots_updates_unsubscribe(subscription_id)
|
232
|
+
method = create_method_name(__method__)
|
233
|
+
unsubscribe(method, subscription_id: subscription_id)
|
234
|
+
end
|
235
|
+
|
236
|
+
# @see https://docs.solana.com/developing/clients/jsonrpc-api#rootsubscribe
|
237
|
+
#
|
238
|
+
# Subscribe to receive notification anytime a new root is set by the validator.
|
239
|
+
#
|
240
|
+
# @param &block [Proc]
|
241
|
+
#
|
242
|
+
# @return [Integer] Subscription id (needed to unsubscribe)
|
243
|
+
def root_subscribe(&block)
|
244
|
+
method = create_method_name(__method__)
|
245
|
+
|
246
|
+
subscribe(method, &block)
|
247
|
+
end
|
248
|
+
|
249
|
+
# @see https://docs.solana.com/developing/clients/jsonrpc-api#rootunsubscribe
|
250
|
+
# Unsubscribe from root notifications
|
251
|
+
#
|
252
|
+
# @param subscription_id [Integer]
|
253
|
+
#
|
254
|
+
# @return [Bool] unsubscribe success message
|
255
|
+
def root_unsubscribe(subscription_id)
|
256
|
+
method = create_method_name(__method__)
|
257
|
+
unsubscribe(method, subscription_id: subscription_id)
|
258
|
+
end
|
259
|
+
|
260
|
+
# @see https://docs.solana.com/developing/clients/jsonrpc-api#votesubscribe---unstable-disabled-by-default
|
261
|
+
#
|
262
|
+
# This subscription is unstable and only available if the validator was started with the --rpc-pubsub-enable-vote-subscription flag.
|
263
|
+
# The format of this subscription may change in the future
|
264
|
+
#
|
265
|
+
# Subscribe to receive notification anytime a new vote is observed in gossip.
|
266
|
+
# These votes are pre-consensus therefore there is no guarantee these votes will enter the ledger.
|
267
|
+
#
|
268
|
+
# @param &block [Proc]
|
269
|
+
#
|
270
|
+
# @return [Integer] Subscription id (needed to unsubscribe)
|
271
|
+
def vote_subscribe(&block)
|
272
|
+
method = create_method_name(__method__)
|
273
|
+
|
274
|
+
subscribe(method, &block)
|
275
|
+
end
|
276
|
+
|
277
|
+
# @see https://docs.solana.com/developing/clients/jsonrpc-api#rootunsubscribe
|
278
|
+
# Unsubscribe from vote notifications
|
279
|
+
#
|
280
|
+
# @param subscription_id [Integer]
|
281
|
+
#
|
282
|
+
# @return [Bool] unsubscribe success message
|
283
|
+
def vote_unsubscribe(subscription_id)
|
284
|
+
method = create_method_name(__method__)
|
285
|
+
unsubscribe(method, subscription_id: subscription_id)
|
286
|
+
end
|
287
|
+
|
288
|
+
private
|
289
|
+
|
290
|
+
def subscribe(method, method_params: [], &block)
|
291
|
+
body = create_json_body(method, method_params: method_params)
|
292
|
+
@websocket_client.connect(body, &block)
|
293
|
+
end
|
294
|
+
|
295
|
+
def unsubscribe(method, subscription_id:)
|
296
|
+
body = create_json_body(method, method_params: [subscription_id])
|
297
|
+
@websocket_client.connect(body)
|
298
|
+
end
|
299
|
+
end
|
300
|
+
end
|
data/lib/solana_rpc_ruby.rb
CHANGED
@@ -2,6 +2,8 @@ require_relative 'solana_rpc_ruby/api_client'
|
|
2
2
|
require_relative 'solana_rpc_ruby/api_error'
|
3
3
|
require_relative 'solana_rpc_ruby/methods_wrapper'
|
4
4
|
require_relative 'solana_rpc_ruby/response'
|
5
|
+
require_relative 'solana_rpc_ruby/websocket_client'
|
6
|
+
require_relative 'solana_rpc_ruby/websocket_methods_wrapper'
|
5
7
|
|
6
8
|
# Namespace for classes and modules that handle connection with solana JSON RPC API.
|
7
9
|
module SolanaRpcRuby
|
@@ -10,6 +12,10 @@ module SolanaRpcRuby
|
|
10
12
|
# @return [String] cluster address.
|
11
13
|
attr_accessor :cluster
|
12
14
|
|
15
|
+
# Default websocket cluster address that will be used if not passed.
|
16
|
+
# @return [String] websocket cluster address.
|
17
|
+
attr_accessor :ws_cluster
|
18
|
+
|
13
19
|
# Default json rpc version that will be used.
|
14
20
|
# @return [String] json rpc version.
|
15
21
|
attr_accessor :json_rpc_version
|
data/solana_rpc_ruby.gemspec
CHANGED
@@ -28,14 +28,16 @@ Gem::Specification.new do |spec|
|
|
28
28
|
'source_code_uri' => 'https://github.com/Block-Logic/solana-rpc-ruby'
|
29
29
|
}
|
30
30
|
|
31
|
+
spec.add_dependency 'faye-websocket', '~> 0.11'
|
32
|
+
|
31
33
|
spec.add_development_dependency 'rubocop', '~> 1.15'
|
32
34
|
spec.add_development_dependency 'rubocop-performance', '~> 1.11'
|
33
35
|
spec.add_development_dependency 'rubocop-rspec', '~> 2.3'
|
34
|
-
spec.add_development_dependency 'pry', '~> 0.
|
36
|
+
spec.add_development_dependency 'pry', '~> 0.14'
|
35
37
|
|
36
38
|
spec.add_development_dependency 'codecov', '~> 0.4'
|
37
39
|
spec.add_development_dependency 'dotenv', '~> 2.7'
|
38
|
-
spec.add_development_dependency 'rails', '~> 6.1
|
40
|
+
spec.add_development_dependency 'rails', '~> 6.1'
|
39
41
|
spec.add_development_dependency 'rake', '~> 13.0'
|
40
42
|
spec.add_development_dependency 'rspec', '~> 3.10'
|
41
43
|
spec.add_development_dependency 'rspec-rails', '~> 4.0'
|
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: solana_rpc_ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Block Logic Team
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-10-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: faye-websocket
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0.11'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0.11'
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: rubocop
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -58,14 +72,14 @@ dependencies:
|
|
58
72
|
requirements:
|
59
73
|
- - "~>"
|
60
74
|
- !ruby/object:Gem::Version
|
61
|
-
version: 0.
|
75
|
+
version: '0.14'
|
62
76
|
type: :development
|
63
77
|
prerelease: false
|
64
78
|
version_requirements: !ruby/object:Gem::Requirement
|
65
79
|
requirements:
|
66
80
|
- - "~>"
|
67
81
|
- !ruby/object:Gem::Version
|
68
|
-
version: 0.
|
82
|
+
version: '0.14'
|
69
83
|
- !ruby/object:Gem::Dependency
|
70
84
|
name: codecov
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -100,14 +114,14 @@ dependencies:
|
|
100
114
|
requirements:
|
101
115
|
- - "~>"
|
102
116
|
- !ruby/object:Gem::Version
|
103
|
-
version: 6.1
|
117
|
+
version: '6.1'
|
104
118
|
type: :development
|
105
119
|
prerelease: false
|
106
120
|
version_requirements: !ruby/object:Gem::Requirement
|
107
121
|
requirements:
|
108
122
|
- - "~>"
|
109
123
|
- !ruby/object:Gem::Version
|
110
|
-
version: 6.1
|
124
|
+
version: '6.1'
|
111
125
|
- !ruby/object:Gem::Dependency
|
112
126
|
name: rake
|
113
127
|
requirement: !ruby/object:Gem::Requirement
|
@@ -218,6 +232,8 @@ files:
|
|
218
232
|
- lib/solana_rpc_ruby/request_body.rb
|
219
233
|
- lib/solana_rpc_ruby/response.rb
|
220
234
|
- lib/solana_rpc_ruby/version.rb
|
235
|
+
- lib/solana_rpc_ruby/websocket_client.rb
|
236
|
+
- lib/solana_rpc_ruby/websocket_methods_wrapper.rb
|
221
237
|
- solana_rpc_ruby.gemspec
|
222
238
|
homepage: https://github.com/Block-Logic/solana-rpc-ruby
|
223
239
|
licenses:
|
@@ -240,7 +256,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
240
256
|
- !ruby/object:Gem::Version
|
241
257
|
version: '0'
|
242
258
|
requirements: []
|
243
|
-
rubygems_version: 3.
|
259
|
+
rubygems_version: 3.0.8
|
244
260
|
signing_key:
|
245
261
|
specification_version: 4
|
246
262
|
summary: Ruby wrapper for solana JSON RPC API.
|