solana_rpc_ruby 1.0.0.pre

Sign up to get free protection for your applications and to get access to all the features.
data/README.md ADDED
@@ -0,0 +1,50 @@
1
+ ![specs](https://github.com/Block-Logic/solana-rpc-ruby/actions/workflows/specs.yml/badge.svg?branch=177580443_create_wrapper_for_solana_rpc)
2
+ # solana_rpc_ruby
3
+ A Solana RPC Client for Ruby. This gem provides a wrapper methods for Solana RPC JSON API https://docs.solana.com/developing/clients/jsonrpc-api.
4
+
5
+ ## Getting started
6
+
7
+ ### Requirements
8
+
9
+ This gem requires Ruby 2.6+ and h Rails 6.0+. It MIGHT work with lower versions, but was not tested againt them.
10
+ Add the following line to your Gemfile:
11
+
12
+ ```ruby
13
+ gem 'solana_rpc_ruby'
14
+ ```
15
+
16
+ Then run `bundle install`
17
+
18
+ Next, you need to run the generator:
19
+
20
+ ```console
21
+ rails g solana_rpc_ruby:install
22
+ ```
23
+
24
+ The latter command will generate a new config file `config/solana_rpc_ruby_config.rb` looking like this:
25
+
26
+ ```ruby
27
+ require 'solana_rpc_ruby'
28
+
29
+ SolanaRpcRuby.config do |c|
30
+ c.cluster = 'https://api.testnet.solana.com'
31
+ c.json_rpc_version = '2.0'
32
+ c.encoding = 'base58'
33
+ # ...other options
34
+ end
35
+ ```
36
+ You can customize it to your needs.
37
+
38
+ ### Usage examples
39
+ ```ruby
40
+ # If you set default cluster you don't need to pass it every time.
41
+ method_wrapper = SolanaRpcRuby::MethodsWrapper.new(cluster: 'https://api.testnet.solana.com')
42
+ response = method_wrapper.get_account_info(account_pubkey)
43
+ puts response
44
+ ```
45
+
46
+ All info about methods you can find in the docs on: FILL THE ADDRESS!!!
47
+ Also, as a reference you can use docs from solana: https://docs.solana.com/developing/clients/jsonrpc-api
48
+ ## License
49
+
50
+ Copyright (c) [Block Logic Team]. License type is [MIT](https://github.com/Block-Logic/solana-rpc-ruby/blob/main/LICENSE).
data/Rakefile ADDED
@@ -0,0 +1,19 @@
1
+ require 'rake'
2
+
3
+ begin
4
+ require 'bundler/setup'
5
+ Bundler::GemHelper.install_tasks
6
+ rescue LoadError
7
+ puts 'although not required, bundler is recommended for running the tests'
8
+ end
9
+
10
+ task default: :spec
11
+
12
+ require 'rspec/core/rake_task'
13
+ RSpec::Core::RakeTask.new(:spec)
14
+
15
+ require 'rubocop/rake_task'
16
+ RuboCop::RakeTask.new do |task|
17
+ task.requires << 'rubocop-performance'
18
+ task.requires << 'rubocop-rspec'
19
+ end
@@ -0,0 +1,13 @@
1
+ require 'rails/generators'
2
+ module SolanaRpcRuby
3
+ module Generators
4
+ class InstallGenerator < Rails::Generators::Base
5
+ source_root File.expand_path('../templates', __dir__)
6
+
7
+ desc 'Creates a SolanaRpcRuby config file.'
8
+ def copy_config
9
+ template 'solana_rpc_ruby_config.rb', "#{Rails.root}/config/solana_rpc_ruby.rb"
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,14 @@
1
+ require_relative 'solana_rpc_ruby'
2
+
3
+ # DEVNET_CLUSTER = 'https://api.devnet.solana.com'
4
+ # MAINNET_CLUSTER = 'https://api.mainnet-beta.solana.com'
5
+ # TESTNET_CLUSTER = 'https://api.testnet.solana.com'
6
+
7
+ SolanaRpcRuby.config do |c|
8
+ # These are mandatory options that you must set before using gem:
9
+ #
10
+ # c.cluster = 'https://api.testnet.solana.com'
11
+ # c.json_rpc = '2.0
12
+ # c.encoding = 'base58'
13
+ # c.id = 1
14
+ end
@@ -0,0 +1,27 @@
1
+ require_relative 'solana_rpc_ruby/api_client'
2
+ require_relative 'solana_rpc_ruby/api_error'
3
+ require_relative 'solana_rpc_ruby/methods_wrapper'
4
+ require_relative 'solana_rpc_ruby/response'
5
+
6
+ # Namespace for classes and modules that handle connection with solana JSON RPC API.
7
+ module SolanaRpcRuby
8
+ class << self
9
+ # Default cluster address that will be used if not passed.
10
+ # @return [String] cluster address.
11
+ attr_accessor :cluster
12
+
13
+ # Default json rpc version that will be used.
14
+ # @return [String] json rpc version.
15
+ attr_accessor :json_rpc_version
16
+
17
+ # Default encoding that will be used.
18
+ # @return [String] encoding.
19
+ attr_accessor :encoding
20
+
21
+ # Config set from initializer.
22
+ # @return [String] encoding.
23
+ def config
24
+ yield self
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,63 @@
1
+ require 'net/http'
2
+
3
+ module SolanaRpcRuby
4
+ ##
5
+ # ApiClient class serves as a client for solana JSON RPC API.
6
+ # @see https://docs.solana.com/developing/clients/jsonrpc-api
7
+ class ApiClient
8
+ # Determines which cluster will be used to send requests.
9
+ # @return [String]
10
+ attr_accessor :cluster
11
+
12
+ # Default headers.
13
+ # @return [Hash]
14
+ attr_accessor :default_headers
15
+
16
+ # Initialize object with cluster address where requests will be sent.
17
+ #
18
+ # @param cluster [String]
19
+ def initialize(cluster = nil)
20
+ @cluster = cluster || SolanaRpcRuby.cluster
21
+
22
+ message = 'Cluster is missing. Please provide default cluster in config or pass it to the client directly.'
23
+ raise ArgumentError, message unless @cluster
24
+ end
25
+
26
+ # Sends request to the api.
27
+ #
28
+ # @param body [Hash]
29
+ # @param http_method [Symbol]
30
+ # @param params [Hash]
31
+ #
32
+ # @return [Object] Net::HTTPOK
33
+ def call_api(body:, http_method:, params: {})
34
+ uri = URI(@cluster)
35
+ rpc_response = Net::HTTP.public_send(
36
+ http_method,
37
+ uri,
38
+ body,
39
+ default_headers,
40
+ )
41
+
42
+ rpc_response
43
+
44
+ rescue Timeout::Error,
45
+ Net::HTTPError,
46
+ Net::HTTPNotFound,
47
+ Net::HTTPServerException,
48
+ Net::HTTPFatalError,
49
+ Net::ReadTimeout => e
50
+
51
+ fail ApiError.new(message: e.message)
52
+ rescue StandardError => e
53
+ message = "#{e.class} #{e.message}\n Backtrace: \n #{e.backtrace}"
54
+ fail ApiError.new(message: message)
55
+ end
56
+
57
+ private
58
+
59
+ def default_headers
60
+ { "Content-Type" => "application/json" }
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,27 @@
1
+ module SolanaRpcRuby
2
+ ##
3
+ # ApiError is a wrapper class for errors
4
+ #
5
+ class ApiError < StandardError
6
+ # Error code.
7
+ # @return [Integer]
8
+ attr_reader :code
9
+
10
+ # Error message.
11
+ # @return [String]
12
+ attr_reader :message
13
+
14
+ # Initialize object with json response from the API with error.
15
+ #
16
+ # @param code [Integer]
17
+ # @param message [String]
18
+ #
19
+ # @return [SolanaRpcRuby::ApiError]
20
+ def initialize(code: nil, message:)
21
+ @code = code
22
+ @message = message
23
+
24
+ super message
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,16 @@
1
+ module SolanaRpcRuby
2
+ # Namespace for helper methods.
3
+ module HelperMethods
4
+ # Checks if the object is nil or empty.
5
+ #
6
+ # @param object [String, Array, Hash]
7
+ #
8
+ # @return [Boolean]
9
+ def blank?(object)
10
+ raise ArgumentError, 'Object must be a String, Array or Hash or nil class.'\
11
+ unless object.is_a?(String) || object.is_a?(Array) || object.is_a?(Hash) || object.nil?
12
+
13
+ object.nil? || object.empty?
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,1316 @@
1
+ require 'json'
2
+ require 'pry'
3
+ require_relative 'request_body'
4
+ require_relative 'helper_methods'
5
+
6
+ module SolanaRpcRuby
7
+ ##
8
+ # MethodsWrapper class serves as a wrapper for solana JSON RPC API methods.
9
+ # All informations about params:
10
+ # @see https://docs.solana.com/developing/clients/jsonrpc-api#json-rpc-api-reference
11
+ class MethodsWrapper
12
+ include RequestBody
13
+ include HelperMethods
14
+
15
+ # Determines which cluster will be used to send requests.
16
+ # @return [SolanaRpcRuby::ApiClient]
17
+ attr_accessor :api_client
18
+
19
+ # Cluster where requests will be sent.
20
+ # @return [String]
21
+ attr_accessor :cluster
22
+
23
+ # Initialize object with cluster address where requests will be sent.
24
+ #
25
+ # @param api_client [ApiClient]
26
+ # @param cluster [String] cluster where requests will be sent.
27
+ def initialize(api_client: ApiClient, cluster: SolanaRpcRuby.cluster)
28
+ @api_client = api_client.new(cluster)
29
+ end
30
+
31
+ # @see https://docs.solana.com/developing/clients/jsonrpc-api#getaccountinfo
32
+ # Returns all information associated with the account of provided Pubkey
33
+ #
34
+ # @param account_pubkey [String]
35
+ # @param encoding [String]
36
+ # @param data_slice [Hash]
37
+ # @option data_slice [Integer] :offset
38
+ # @option data_slice [Integer] :length
39
+ #
40
+ # @return [Response, ApiError] Response when success, ApiError on failure.
41
+ def get_account_info(account_pubkey, encoding: '', data_slice: {})
42
+ http_method = :post
43
+ method = create_method_name(__method__)
44
+
45
+ params = []
46
+ params_hash = {}
47
+
48
+ params_hash['encoding'] = encoding unless blank?(encoding)
49
+ params_hash['dataSlice'] = data_slice unless data_slice.empty?
50
+
51
+ params << account_pubkey
52
+ params << params_hash unless params_hash.empty?
53
+
54
+ body = create_json_body(method, method_params: params)
55
+
56
+ send_request(body, http_method)
57
+ end
58
+
59
+ # @see https://docs.solana.com/developing/clients/jsonrpc-api#getbalance
60
+ # Returns the balance of the account of provided Pubkey
61
+ #
62
+ # @param account_pubkey [String]
63
+ # @param commitment [String]
64
+ #
65
+ # @return [Response, ApiError] Response when success, ApiError on failure.
66
+ def get_balance(account_pubkey, commitment: nil)
67
+ http_method = :post
68
+ method = create_method_name(__method__)
69
+
70
+ params = []
71
+
72
+ params_hash = {}
73
+
74
+ params_hash['commitment'] = commitment unless blank?(commitment)
75
+
76
+ params << account_pubkey
77
+ params << params_hash unless params_hash.empty?
78
+
79
+ body = create_json_body(method, method_params: params)
80
+
81
+ send_request(body, http_method)
82
+ end
83
+
84
+ # @see https://docs.solana.com/developing/clients/jsonrpc-api#getblock
85
+ # NEW: This method is only available in solana-core v1.7 or newer. Please use getConfirmedBlock for solana-core v1.6
86
+ # Returns identity and transaction information about a confirmed block in the ledger
87
+ #
88
+ # @param slot [Integer]
89
+ # @param encoding [String]
90
+ # @param transaction_details [String]
91
+ # @param rewards [Boolean]
92
+ # @param commitment [String]
93
+ #
94
+ # @return [Response, ApiError] Response when success, ApiError on failure.
95
+ def get_block(slot, encoding: '', transaction_details: '', rewards: true, commitment: nil)
96
+ http_method = :post
97
+ method = create_method_name(__method__)
98
+
99
+ params = []
100
+
101
+ params_hash = {}
102
+ params_hash['encoding'] = encoding unless blank?(encoding)
103
+ params_hash['transactionDetails'] = transaction_details unless blank?(transaction_details)
104
+ params_hash['rewards'] = rewards unless rewards.nil?
105
+ params_hash['commitment'] = commitment unless blank?(commitment)
106
+
107
+ params << slot
108
+ params << params_hash unless params_hash.empty?
109
+
110
+ body = create_json_body(method, method_params: params)
111
+
112
+ send_request(body, http_method)
113
+ end
114
+
115
+ # @see https://docs.solana.com/developing/clients/jsonrpc-api#getblockheight
116
+ # Returns the current block height of the node
117
+ #
118
+ # @param commitment [String]
119
+ #
120
+ # @return [Response, ApiError] Response when success, ApiError on failure.
121
+ def get_block_height(commitment: nil)
122
+ http_method = :post
123
+ method = create_method_name(__method__)
124
+
125
+ params = []
126
+ params_hash = {}
127
+
128
+ params_hash['commitment'] = commitment unless blank?(commitment)
129
+ params << params_hash unless params_hash.empty?
130
+
131
+ body = create_json_body(method, method_params: params)
132
+
133
+ send_request(body, http_method)
134
+ end
135
+
136
+ # @see https://docs.solana.com/developing/clients/jsonrpc-api#getblockproduction
137
+ # Returns recent block production information from the current or previous epoch.
138
+ #
139
+ # @param identity [String]
140
+ # @param range [Hash]
141
+ # @option range [Integer] first_slot (required for range)
142
+ # @option range [Integer] last_slot (optional for range)
143
+ # @param commitment [String]
144
+ #
145
+ # @return [Response, ApiError] Response when success, ApiError on failure.
146
+ def get_block_production(identity: nil, range: {}, commitment: nil)
147
+ http_method = :post
148
+ method = create_method_name(__method__)
149
+
150
+ params = []
151
+ params_hash = {}
152
+ range_hash = {}
153
+
154
+ range_hash['firstSlot'] = range[:first_slot] unless !range.key?(:first_slot)
155
+ range_hash['lastSlot'] = range[:last_slot] unless !range.key?(:last_slot)
156
+
157
+ params_hash['identity'] = identity unless blank?(identity)
158
+ params_hash['range'] = range_hash unless range_hash.empty?
159
+
160
+ params << params_hash unless params_hash.empty?
161
+
162
+ body = create_json_body(method, method_params: params)
163
+
164
+ send_request(body, http_method)
165
+ end
166
+
167
+ # @see https://docs.solana.com/developing/clients/jsonrpc-api#getblockcommitment
168
+ # Returns commitment for particular block
169
+ #
170
+ # @param block [Integer]
171
+ #
172
+ # @return [Response, ApiError] Response when success, ApiError on failure.
173
+ def get_block_commitment(block)
174
+ http_method = :post
175
+ method = create_method_name(__method__)
176
+
177
+ params = []
178
+
179
+ params << block
180
+
181
+ body = create_json_body(method, method_params: params)
182
+
183
+ send_request(body, http_method)
184
+ end
185
+
186
+ # @see https://docs.solana.com/developing/clients/jsonrpc-api#getblocks
187
+ # NEW: This method is only available in solana-core v1.7 or newer. Please use getConfirmedBlocks for solana-core v1.6
188
+ # Returns a list of confirmed blocks between two slots
189
+ #
190
+ # @param start_slot [Integer]
191
+ # @param end_slot [Integer]
192
+ #
193
+ # @return [Response, ApiError] Response when success, ApiError on failure.
194
+ def get_blocks(start_slot, end_slot: nil)
195
+ http_method = :post
196
+ method = create_method_name(__method__)
197
+
198
+ params = []
199
+
200
+ params << start_slot
201
+ params << end_slot unless end_slot.nil?
202
+
203
+ body = create_json_body(method, method_params: params)
204
+
205
+ send_request(body, http_method)
206
+ end
207
+
208
+ # @see https://docs.solana.com/developing/clients/jsonrpc-api#getblockswithlimit
209
+ # NEW: This method is only available in solana-core v1.7 or newer. Please use getConfirmedBlocks for solana-core v1.6
210
+ # Returns a list of confirmed blocks starting at the given slot
211
+ #
212
+ # @param start_slot [Integer]
213
+ # @param limit [Integer]
214
+ # @param commitment [String]
215
+ #
216
+ # @return [Response, ApiError] Response when success, ApiError on failure.
217
+ def get_blocks_with_limit(start_slot, limit, commitment: nil)
218
+ http_method = :post
219
+ method = create_method_name(__method__)
220
+
221
+ params = []
222
+ params_hash = {}
223
+
224
+ params_hash['commitment'] = commitment unless blank?(commitment)
225
+
226
+ params << start_slot
227
+ params << limit
228
+ params << params_hash unless params_hash.empty?
229
+
230
+ body = create_json_body(method, method_params: params)
231
+
232
+ send_request(body, http_method)
233
+ end
234
+
235
+ # @see https://docs.solana.com/developing/clients/jsonrpc-api#getblocktime
236
+ # Returns the estimated production time of a block.
237
+ #
238
+ # @param block [Integer]
239
+ #
240
+ # @return [Response, ApiError] Response when success, ApiError on failure.
241
+ def get_block_time(block)
242
+ http_method = :post
243
+ method = create_method_name(__method__)
244
+
245
+ params = []
246
+
247
+ params << block
248
+
249
+ body = create_json_body(method, method_params: params)
250
+
251
+ send_request(body, http_method)
252
+ end
253
+
254
+ # @see https://docs.solana.com/developing/clients/jsonrpc-api#getclusternodes
255
+ # Returns information about all the nodes participating in the cluster
256
+ #
257
+ # @return [Response, ApiError] Response when success, ApiError on failure.
258
+ def get_cluster_nodes
259
+ http_method = :post
260
+ method = create_method_name(__method__)
261
+
262
+ body = create_json_body(method)
263
+
264
+ send_request(body, http_method)
265
+ end
266
+
267
+ # @see https://docs.solana.com/developing/clients/jsonrpc-api#getepochinfo
268
+ # DEPRECATED: Please use getBlocks instead This method is expected to be removed in solana-core v1.8
269
+ # Returns a list of confirmed blocks between two slots
270
+ #
271
+ # @param start_slot [Integer]
272
+ # @param end_slot [Integer]
273
+ #
274
+ # @return [Response, ApiError] Response when success, ApiError on failure.
275
+ def get_confirmed_blocks(start_slot, end_slot: nil)
276
+ http_method = :post
277
+ method = create_method_name(__method__)
278
+
279
+ params = []
280
+
281
+ params << start_slot
282
+ params << end_slot unless end_slot.nil? # optional
283
+
284
+ body = create_json_body(method, method_params: params)
285
+
286
+ send_request(body, http_method)
287
+ end
288
+
289
+ # @see https://docs.solana.com/developing/clients/jsonrpc-api#getepochinfo
290
+ # Returns information about the current epoch
291
+ #
292
+ # @param commitment [String]
293
+ #
294
+ # @return [Response, ApiError] Response when success, ApiError on failure.
295
+ def get_epoch_info(commitment: nil)
296
+ http_method = :post
297
+ method = create_method_name(__method__)
298
+
299
+ params = []
300
+ params_hash = {}
301
+
302
+ params_hash['commitment'] = commitment unless blank?(commitment)
303
+
304
+ params << params_hash unless params_hash.empty?
305
+
306
+ body = create_json_body(method, method_params: params)
307
+
308
+ send_request(body, http_method)
309
+ end
310
+
311
+ # @see https://docs.solana.com/developing/clients/jsonrpc-api#getepochschedule
312
+ # Returns epoch schedule information from this cluster's genesis config
313
+ #
314
+ # @return [Response, ApiError] Response when success, ApiError on failure.
315
+ def get_epoch_schedule
316
+ http_method = :post
317
+ method = create_method_name(__method__)
318
+
319
+ body = create_json_body(method)
320
+
321
+ send_request(body, http_method)
322
+ end
323
+
324
+ # @see https://docs.solana.com/developing/clients/jsonrpc-api#getfeecalculatorforblockhash
325
+ # Returns the fee calculator associated with the query blockhash, or null if the blockhash has expired
326
+ #
327
+ # @param query_blockhash [String]
328
+ # @param commitment [String]
329
+ #
330
+ # @return [Response, ApiError] Response when success, ApiError on failure.
331
+ def get_fee_calculator_for_blockhash(query_blockhash, commitment: nil)
332
+ http_method = :post
333
+ method = create_method_name(__method__)
334
+
335
+ params = []
336
+ params_hash = {}
337
+
338
+ params_hash['commitment'] = commitment unless blank?(commitment)
339
+
340
+ params << query_blockhash
341
+ params << params_hash unless params_hash.empty?
342
+
343
+ body = create_json_body(method, method_params: params)
344
+
345
+ send_request(body, http_method)
346
+ end
347
+
348
+ # @see https://docs.solana.com/developing/clients/jsonrpc-api#getfeerategovernor
349
+ # Returns the fee rate governor information from the root bank
350
+ #
351
+ # @return [Response, ApiError] Response when success, ApiError on failure.
352
+ def get_fee_rate_governor
353
+ http_method = :post
354
+ method = create_method_name(__method__)
355
+
356
+ body = create_json_body(method)
357
+
358
+ send_request(body, http_method)
359
+ end
360
+
361
+ # @see https://docs.solana.com/developing/clients/jsonrpc-api#getfees
362
+ # Returns a recent block hash from the ledger, a fee schedule that can be used to compute
363
+ # the cost of submitting a transaction using it, and the last slot in which the blockhash will be valid.
364
+ #
365
+ # @param commitment [String]
366
+ #
367
+ # @return [Response, ApiError] Response when success, ApiError on failure.
368
+ def get_fees(commitment: nil)
369
+ http_method = :post
370
+ method = create_method_name(__method__)
371
+
372
+ params = []
373
+ params_hash = {}
374
+
375
+ params_hash['commitment'] = commitment unless blank?(commitment)
376
+ params << params_hash unless params_hash.empty?
377
+
378
+ body = create_json_body(method, method_params: params)
379
+
380
+ send_request(body, http_method)
381
+ end
382
+
383
+ # @see https://docs.solana.com/developing/clients/jsonrpc-api#getfirstavailableblock
384
+ # Returns the slot of the lowest confirmed block that has not been purged from the ledger
385
+ #
386
+ # @return [Response, ApiError] Response when success, ApiError on failure.
387
+ def get_first_available_block
388
+ http_method = :post
389
+ method = create_method_name(__method__)
390
+
391
+ body = create_json_body(method)
392
+
393
+ send_request(body, http_method)
394
+ end
395
+
396
+ # @see https://docs.solana.com/developing/clients/jsonrpc-api#getgenesishash
397
+ # Returns the genesis hash.
398
+ #
399
+ # @return [Response, ApiError] Response when success, ApiError on failure.
400
+ def get_genesis_hash
401
+ http_method = :post
402
+ method = create_method_name(__method__)
403
+
404
+ body = create_json_body(method)
405
+
406
+ send_request(body, http_method)
407
+ end
408
+
409
+ # @see https://docs.solana.com/developing/clients/jsonrpc-api#gethealth
410
+ # Returns the current health of the node.
411
+ #
412
+ # @return [Response, ApiError] Response when success, ApiError on failure.
413
+ def get_health
414
+ http_method = :post
415
+ method = create_method_name(__method__)
416
+
417
+ body = create_json_body(method)
418
+
419
+ send_request(body, http_method)
420
+ end
421
+
422
+ # @see https://docs.solana.com/developing/clients/jsonrpc-api#getidentity
423
+ # Returns the identity pubkey for the current node.
424
+ #
425
+ # @return [Response, ApiError] Response when success, ApiError on failure.
426
+ def get_identity
427
+ http_method = :post
428
+ method = create_method_name(__method__)
429
+
430
+ body = create_json_body(method)
431
+
432
+ send_request(body, http_method)
433
+ end
434
+
435
+ # @see https://docs.solana.com/developing/clients/jsonrpc-api#getinflationgovernor
436
+ # Returns the current inflation governor.
437
+ #
438
+ # @param commitment [String]
439
+ #
440
+ # @return [Response, ApiError] Response when success, ApiError on failure.
441
+ def get_inflation_governor(commitment: nil)
442
+ http_method = :post
443
+ method = create_method_name(__method__)
444
+
445
+ params = []
446
+ params_hash = {}
447
+
448
+ params_hash['commitment'] = commitment unless blank?(commitment)
449
+
450
+ params << params_hash unless params_hash.empty?
451
+
452
+ body = create_json_body(method, method_params: params)
453
+
454
+ send_request(body, http_method)
455
+ end
456
+
457
+ # @see https://docs.solana.com/developing/clients/jsonrpc-api#getinflationrate
458
+ # Returns the specific inflation values for the current epoch.
459
+ #
460
+ # @return [Response, ApiError] Response when success, ApiError on failure.
461
+ def get_inflation_rate
462
+ http_method = :post
463
+ method = create_method_name(__method__)
464
+
465
+ body = create_json_body(method)
466
+
467
+ send_request(body, http_method)
468
+ end
469
+
470
+ # @see https://docs.solana.com/developing/clients/jsonrpc-api#getinflationreward
471
+ # Returns the inflation reward for a list of addresses for an epoch.
472
+ #
473
+ # @param addresses [Array]
474
+ # @param commitment [String]
475
+ # @param epoch [Integer]
476
+ #
477
+ # @return [Response, ApiError] Response when success, ApiError on failure.
478
+ def get_inflation_reward(addresses, commitment: nil, epoch: nil)
479
+ http_method = :post
480
+ method = create_method_name(__method__)
481
+
482
+ params = []
483
+ params_hash = {}
484
+
485
+ params << addresses
486
+
487
+ params_hash['commitment'] = commitment unless blank?(commitment)
488
+ params_hash['epoch'] = epoch unless epoch.nil?
489
+
490
+ params << params_hash unless params_hash.empty?
491
+
492
+ body = create_json_body(method, method_params: params)
493
+
494
+ send_request(body, http_method)
495
+ end
496
+
497
+ # @see https://docs.solana.com/developing/clients/jsonrpc-api#getlargestaccounts
498
+ # Returns the 20 largest accounts, by lamport balance (results may be cached up to two hours)
499
+ #
500
+ # @param commitment [String]
501
+ # @param filter [String]
502
+ #
503
+ # @return [Response, ApiError] Response when success, ApiError on failure.
504
+ def get_largest_accounts(commitment: nil, filter: '')
505
+ http_method = :post
506
+ method = create_method_name(__method__)
507
+
508
+ params = []
509
+ params_hash = {}
510
+
511
+ params_hash['commitment'] = commitment unless blank?(commitment)
512
+ params_hash['filter'] = filter unless filter.empty?
513
+
514
+ params << params_hash unless params_hash.empty?
515
+
516
+ body = create_json_body(method, method_params: params)
517
+
518
+ send_request(body, http_method)
519
+ end
520
+
521
+ # @see https://docs.solana.com/developing/clients/jsonrpc-api#getleaderschedule
522
+ # Returns the leader schedule for an epoch.
523
+ #
524
+ # @param epoch [Integer]
525
+ # @param commitment [String]
526
+ # @param identity [String]
527
+ #
528
+ # @return [Response, ApiError] Response when success, ApiError on failure.
529
+ def get_leader_schedule(epoch: nil, commitment: nil, identity: '')
530
+ http_method = :post
531
+ method = create_method_name(__method__)
532
+
533
+ params = []
534
+ params_hash = {}
535
+
536
+ params_hash['epoch'] = epoch unless epoch.nil?
537
+ params_hash['identity'] = identity unless identity.empty?
538
+ params_hash['commitment'] = commitment unless blank?(commitment)
539
+
540
+ params << params_hash unless params_hash.empty?
541
+
542
+ body = create_json_body(method, method_params: params)
543
+
544
+ send_request(body, http_method)
545
+ end
546
+
547
+ # @see https://docs.solana.com/developing/clients/jsonrpc-api#getmaxretransmitslot
548
+ # Get the max slot seen from retransmit stage.
549
+ #
550
+ # @return [Response, ApiError] Response when success, ApiError on failure.
551
+ def get_max_retransmit_slot
552
+ http_method = :post
553
+ method = create_method_name(__method__)
554
+
555
+ body = create_json_body(method)
556
+
557
+ send_request(body, http_method)
558
+ end
559
+
560
+ # @see https://docs.solana.com/developing/clients/jsonrpc-api#getmaxshredinsertslot
561
+ # Get the max slot seen from after shred insert.
562
+ #
563
+ # @return [Response, ApiError] Response when success, ApiError on failure.
564
+ def get_max_shred_insert_slot
565
+ http_method = :post
566
+ method = create_method_name(__method__)
567
+
568
+ body = create_json_body(method)
569
+
570
+ send_request(body, http_method)
571
+ end
572
+
573
+ # @see https://docs.solana.com/developing/clients/jsonrpc-api#getminimumbalanceforrentexemption
574
+ # Returns minimum balance required to make account rent exempt.
575
+ #
576
+ # @param account_data_length [String]
577
+ # @param commitment [String]
578
+ #
579
+ # @return [Response, ApiError] Response when success, ApiError on failure.
580
+ def get_minimum_balance_for_rent_exemption(
581
+ account_data_length,
582
+ commitment: nil
583
+ )
584
+ http_method = :post
585
+ method = create_method_name(__method__)
586
+
587
+ params = []
588
+ params_hash = {}
589
+
590
+ params_hash['commitment'] = commitment unless blank?(commitment)
591
+
592
+ params << account_data_length
593
+ params << params_hash unless params_hash.empty?
594
+
595
+ body = create_json_body(method, method_params: params)
596
+
597
+ send_request(body, http_method)
598
+ end
599
+
600
+ # @see https://docs.solana.com/developing/clients/jsonrpc-api#getmultipleaccounts
601
+ # Returns the account information for a list of Pubkeys.
602
+ # @param account_data_length [String]
603
+ # @param commitment [String]
604
+ #
605
+ # @return [Response, ApiError] Response when success, ApiError on failure. # @param account_data_length [String]
606
+ # @param commitment [String]
607
+ #
608
+ # @return [Response, ApiError] Response when success, ApiError on failure.
609
+ def get_multiple_accounts(
610
+ pubkeys,
611
+ commitment: nil,
612
+ encoding: '',
613
+ data_slice: {}
614
+ )
615
+ http_method = :post
616
+ method = create_method_name(__method__)
617
+
618
+ params = []
619
+ params_hash = {}
620
+
621
+ params_hash['commitment'] = commitment unless blank?(commitment)
622
+ params_hash['encoding'] = encoding unless blank?(encoding)
623
+ params_hash['dataSlice'] = data_slice unless data_slice.empty?
624
+
625
+ params << pubkeys
626
+ params << params_hash unless params_hash.empty?
627
+
628
+ body = create_json_body(method, method_params: params)
629
+
630
+ send_request(body, http_method)
631
+ end
632
+
633
+ # @see https://docs.solana.com/developing/clients/jsonrpc-api#getprogramaccounts
634
+ # Returns all accounts owned by the provided program Pubkey
635
+ #
636
+ # @param pubkey [String]
637
+ # @param commitment [String]
638
+ # @param encoding [String]
639
+ # @param data_slice [Hash]
640
+ # @option data_slice [Integer] :offset
641
+ # @option data_slice [Integer] :length
642
+ # @param filters [Array<Hash, Hash>]
643
+ # @param with_context [Boolean]
644
+ #
645
+ # @return [Response, ApiError] Response when success, ApiError on failure.
646
+ def get_program_accounts(
647
+ pubkey,
648
+ commitment: nil,
649
+ encoding: '',
650
+ data_slice: {},
651
+ filters: [],
652
+ with_context: false
653
+ )
654
+ http_method = :post
655
+ method = create_method_name(__method__)
656
+
657
+ params = []
658
+ params_hash = {}
659
+
660
+ params_hash['commitment'] = commitment unless blank?(commitment)
661
+ params_hash['encoding'] = encoding unless blank?(encoding)
662
+ params_hash['dataSlice'] = data_slice unless data_slice.empty?
663
+ params_hash['filters'] = filters unless filters.empty?
664
+ params_hash['withContext'] = with_context
665
+
666
+ params << pubkey
667
+ params << params_hash unless params_hash.empty?
668
+
669
+ body = create_json_body(method, method_params: params)
670
+
671
+ send_request(body, http_method)
672
+ end
673
+
674
+ # @see https://docs.solana.com/developing/clients/jsonrpc-api#getrecentblockhash
675
+ # Returns a recent block hash from the ledger, and a fee schedule
676
+ # that can be used to compute the cost of submitting a transaction using it.
677
+ #
678
+ # @param commitment [String]
679
+ #
680
+ # @return [Response, ApiError] Response when success, ApiError on failure.
681
+ def get_recent_blockhash(commitment: nil)
682
+ http_method = :post
683
+ method = create_method_name(__method__)
684
+
685
+ params = []
686
+ params_hash = {}
687
+
688
+ params_hash['commitment'] = commitment unless blank?(commitment)
689
+
690
+ params << params_hash unless params_hash.empty?
691
+
692
+ body = create_json_body(method, method_params: params)
693
+
694
+ send_request(body, http_method)
695
+ end
696
+
697
+ # @see https://docs.solana.com/developing/clients/jsonrpc-api#getrecentperformancesamples
698
+ # Returns a list of recent performance samples, in reverse slot order.
699
+ # Performance samples are taken every 60 seconds and include the number of transactions and slots that occur in a given time window.
700
+ #
701
+ # @param limit [Integer]
702
+ #
703
+ # @return [Response, ApiError] Response when success, ApiError on failure.
704
+ def get_recent_performance_samples(limit: nil)
705
+ http_method = :post
706
+ method = create_method_name(__method__)
707
+
708
+ params = []
709
+
710
+ params << limit unless limit.nil?
711
+
712
+ body = create_json_body(method, method_params: params)
713
+
714
+ send_request(body, http_method)
715
+ end
716
+
717
+ # @see https://docs.solana.com/developing/clients/jsonrpc-api#getsnapshotslot
718
+ # Returns the highest slot that the node has a snapshot for.
719
+ #
720
+ # @return [Response, ApiError] Response when success, ApiError on failure.
721
+ def get_snapshot_slot
722
+ http_method = :post
723
+ method = create_method_name(__method__)
724
+
725
+ body = create_json_body(method)
726
+
727
+ send_request(body, http_method)
728
+ end
729
+
730
+ # @see https://docs.solana.com/developing/clients/jsonrpc-api#getsignaturesforaddress
731
+ # NEW: This method is only available in solana-core v1.7 or newer.
732
+ # Please use getConfirmedSignaturesForAddress2 for solana-core v1.6
733
+ #
734
+ # Returns confirmed signatures for transactions involving an address backwards
735
+ # in time from the provided signature or most recent confirmed block
736
+ #
737
+ # @param account_address [String]
738
+ # @param limit [Integer]
739
+ # @param before [String]
740
+ # @param until_ [String]
741
+ # @param commitment [String]
742
+ #
743
+ # @return [Response, ApiError] Response when success, ApiError on failure.
744
+ def get_signatures_for_address(
745
+ account_address,
746
+ limit: nil,
747
+ before: '',
748
+ until_: '',
749
+ commitment: nil
750
+ )
751
+ http_method = :post
752
+ method = create_method_name(__method__)
753
+
754
+ params = []
755
+ params_hash = {}
756
+
757
+ params_hash['limit'] = limit unless limit.nil?
758
+ params_hash['before'] = before unless before.empty?
759
+ params_hash['until'] = until_ unless until_.empty?
760
+ params_hash['commitment'] = commitment unless blank?(commitment)
761
+
762
+ params << account_address
763
+ params << params_hash unless params_hash.empty?
764
+
765
+ body = create_json_body(method, method_params: params)
766
+
767
+ send_request(body, http_method)
768
+ end
769
+
770
+ # @see https://docs.solana.com/developing/clients/jsonrpc-api#getsignaturestatuses # NEW: This method is only available in solana-core v1.7 or newer.
771
+ #
772
+ # Returns the statuses of a list of signatures.
773
+ # Unless the searchTransactionHistory configuration parameter is included,
774
+ # this method only searches the recent status cache of signatures,
775
+ # which retains statuses for all active slots plus MAX_RECENT_BLOCKHASHES rooted slots.
776
+ #
777
+ # @param transaction_signatures [Array]
778
+ # @param search_transaction_history [Boolean]
779
+ #
780
+ # @return [Response, ApiError] Response when success, ApiError on failure.
781
+ def get_signature_statuses(
782
+ transaction_signatures,
783
+ search_transaction_history: false
784
+ )
785
+ http_method = :post
786
+ method = create_method_name(__method__)
787
+
788
+ params = []
789
+ params_hash = {}
790
+
791
+ params_hash['searchTransactionHistory'] = search_transaction_history unless search_transaction_history.nil?
792
+
793
+ params << transaction_signatures
794
+ params << params_hash unless params_hash.empty?
795
+
796
+ body = create_json_body(method, method_params: params)
797
+
798
+ send_request(body, http_method)
799
+ end
800
+
801
+ # @see https://docs.solana.com/developing/clients/jsonrpc-api#getslot
802
+ # Returns the current slot the node is processing.
803
+ #
804
+ # @param commitment [String]
805
+ #
806
+ # @return [Response, ApiError] Response when success, ApiError on failure.
807
+ def get_slot(commitment: nil)
808
+ http_method = :post
809
+ method = create_method_name(__method__)
810
+
811
+ params = []
812
+ params_hash = {}
813
+
814
+ params_hash['commitment'] = commitment unless blank?(commitment)
815
+
816
+ params << params_hash unless params_hash.empty?
817
+
818
+ body = create_json_body(method, method_params: params)
819
+
820
+ send_request(body, http_method)
821
+ end
822
+
823
+ # @see https://docs.solana.com/developing/clients/jsonrpc-api#getslotleader
824
+ # Returns the current slot leader
825
+ #
826
+ # @param commitment [String]
827
+ #
828
+ # @return [Response, ApiError] Response when success, ApiError on failure.
829
+ def get_slot_leader(commitment: nil)
830
+ http_method = :post
831
+ method = create_method_name(__method__)
832
+
833
+ params = []
834
+ params_hash = {}
835
+
836
+ params_hash['commitment'] = commitment unless blank?(commitment)
837
+
838
+ params << params_hash unless params_hash.empty?
839
+
840
+ body = create_json_body(method, method_params: params)
841
+
842
+ send_request(body, http_method)
843
+ end
844
+
845
+ # @see https://docs.solana.com/developing/clients/jsonrpc-api#getslotleaders
846
+ # Returns the slot leaders for a given slot range.
847
+ #
848
+ # @param start_slot [Integer]
849
+ # @param limit [Integer]
850
+ #
851
+ # @return [Response, ApiError] Response when success, ApiError on failure.
852
+ def get_slot_leaders(start_slot, limit)
853
+ http_method = :post
854
+ method = create_method_name(__method__)
855
+
856
+ params = [start_slot, limit]
857
+
858
+ body = create_json_body(method, method_params: params)
859
+
860
+ send_request(body, http_method)
861
+ end
862
+
863
+ # @see https://docs.solana.com/developing/clients/jsonrpc-api#getstakeactivation
864
+ # Returns epoch activation information for a stake account.
865
+ #
866
+ # @param pubkey [String]
867
+ # @param commitment [String]
868
+ # @param epoch [Integer]
869
+ #
870
+ # @return [Response, ApiError] Response when success, ApiError on failure.
871
+ def get_stake_activation(pubkey, commitment: nil, epoch: nil)
872
+ http_method = :post
873
+ method = create_method_name(__method__)
874
+
875
+ params = []
876
+ params_hash = {}
877
+
878
+ params_hash['commitment'] = commitment unless blank?(commitment)
879
+ params_hash['epoch'] = epoch unless epoch.nil?
880
+
881
+ params << pubkey
882
+ params << params_hash unless params_hash.empty?
883
+
884
+ body = create_json_body(method, method_params: params)
885
+
886
+ send_request(body, http_method)
887
+ end
888
+
889
+ # @see https://docs.solana.com/developing/clients/jsonrpc-api#getsupply
890
+ # Returns information about the current supply.
891
+ #
892
+ # @param commitment [String]
893
+ #
894
+ # @return [Response, ApiError] Response when success, ApiError on failure.
895
+ def get_supply(commitment: nil)
896
+ http_method = :post
897
+ method = create_method_name(__method__)
898
+
899
+ params = []
900
+ params_hash = {}
901
+
902
+ params_hash['commitment'] = commitment unless blank?(commitment)
903
+
904
+ params << params_hash unless params_hash.empty?
905
+
906
+ body = create_json_body(method, method_params: params)
907
+
908
+ send_request(body, http_method)
909
+ end
910
+
911
+ # @see https://docs.solana.com/developing/clients/jsonrpc-api#gettokenaccountbalance
912
+ #
913
+ # Returns the token balance of an SPL Token account.
914
+ #
915
+ # @param token_account_pubkey [String]
916
+ # @param commitment [String]
917
+ #
918
+ # @return [Response, ApiError] Response when success, ApiError on failure.
919
+ def get_token_account_balance(token_account_pubkey, commitment: nil)
920
+ http_method = :post
921
+ method = create_method_name(__method__)
922
+
923
+ params = []
924
+ params_hash = {}
925
+
926
+ params_hash['commitment'] = commitment unless blank?(commitment)
927
+
928
+ params << token_account_pubkey
929
+ params << params_hash unless params_hash.empty?
930
+
931
+ body = create_json_body(method, method_params: params)
932
+
933
+ send_request(body, http_method)
934
+ end
935
+
936
+ # @see https://docs.solana.com/developing/clients/jsonrpc-api#gettokenaccountsbydelegate # Returns the token balance of an SPL Token account.
937
+ #
938
+ # Returns all SPL Token accounts by approved Delegate.
939
+ #
940
+ # IMPORTANT: According to docs there should be mint or program_id passed in, not both.
941
+ #
942
+ # @param token_account_pubkey [String]
943
+ # @param mint [String]
944
+ # @param program_id [String]
945
+ # @param commitment [String]
946
+ # @param encoding [String]
947
+ # @param data_slice [Hash]
948
+ # @option data_slice [Integer] :offset
949
+ # @option data_slice [Integer] :length
950
+ #
951
+ # @return [Response, ApiError] Response when success, ApiError on failure.
952
+ def get_token_accounts_by_delegate(
953
+ token_account_pubkey,
954
+ mint: '',
955
+ program_id: '',
956
+ commitment: nil,
957
+ encoding: '',
958
+ data_slice: {}
959
+ )
960
+
961
+ raise ArgumentError, 'You should pass mint or program_id, not both.' if !mint.empty? && !program_id.empty?
962
+
963
+ http_method = :post
964
+ method = create_method_name(__method__)
965
+
966
+ params = []
967
+ params_hash = {}
968
+ params_hash_2 = {}
969
+
970
+ params_hash['mint'] = mint unless mint.empty?
971
+ params_hash['programId'] = program_id unless program_id.empty?
972
+
973
+ params_hash_2['commitment'] = commitment unless blank?(commitment)
974
+ params_hash_2['encoding'] = encoding unless blank?(encoding)
975
+ params_hash_2['dataSlice'] = data_slice unless data_slice.empty?
976
+
977
+ params << token_account_pubkey
978
+ params << params_hash unless params_hash.empty?
979
+ params << params_hash_2 if params_hash_2.any?
980
+
981
+ body = create_json_body(method, method_params: params)
982
+
983
+ send_request(body, http_method)
984
+ end
985
+
986
+ # @see https://docs.solana.com/developing/clients/jsonrpc-api#gettokenaccountsbyowner #
987
+ #
988
+ # Returns all SPL Token accounts by token owner.
989
+ #
990
+ # IMPORTANT: According to docs there should be mint or program_id passed in, not both.
991
+ #
992
+ # @param token_account_pubkey [String]
993
+ # @param mint [String]
994
+ # @param program_id [String]
995
+ # @param commitment [String]
996
+ # @param encoding [String]
997
+ # @param data_slice [Hash]
998
+ # @option data_slice [Integer] :offset
999
+ # @option data_slice [Integer] :length
1000
+ #
1001
+ # @return [Response, ApiError] Response when success, ApiError on failure.
1002
+ def get_token_accounts_by_owner(
1003
+ token_account_pubkey,
1004
+ mint: '',
1005
+ program_id: '',
1006
+ commitment: nil,
1007
+ encoding: '',
1008
+ data_slice: {}
1009
+ )
1010
+
1011
+ raise ArgumentError, 'You should pass mint or program_id, not both.' if !mint.empty? && !program_id.empty?
1012
+
1013
+ http_method = :post
1014
+ method = create_method_name(__method__)
1015
+
1016
+ params = []
1017
+ params_hash = {}
1018
+ params_hash_2 = {}
1019
+ param_data_slice = {}
1020
+
1021
+ params_hash['mint'] = mint unless mint.empty?
1022
+ params_hash['programId'] = program_id unless program_id.empty?
1023
+
1024
+ params_hash_2['commitment'] = commitment unless blank?(commitment)
1025
+ params_hash_2['encoding'] = encoding unless blank?(encoding)
1026
+ params_hash_2['dataSlice'] = data_slice unless data_slice.empty?
1027
+
1028
+ params << token_account_pubkey
1029
+ params << params_hash unless params_hash.empty?
1030
+ params << params_hash_2 unless params_hash_2.empty?
1031
+
1032
+ body = create_json_body(method, method_params: params)
1033
+
1034
+ send_request(body, http_method)
1035
+ end
1036
+
1037
+ # @see https://docs.solana.com/developing/clients/jsonrpc-api#gettokenlargestaccounts #
1038
+ #
1039
+ # Returns the 20 largest accounts of a particular SPL Token type.
1040
+ #
1041
+ # @param token_mint_pubkey [String]
1042
+ # @param commitment [String]
1043
+ #
1044
+ # @return [Response, ApiError] Response when success, ApiError on failure.
1045
+ def get_token_largest_accounts(
1046
+ token_mint_pubkey,
1047
+ commitment: nil
1048
+ )
1049
+
1050
+ http_method = :post
1051
+ method = create_method_name(__method__)
1052
+
1053
+ params = []
1054
+ params_hash = {}
1055
+
1056
+ params_hash['commitment'] = commitment unless blank?(commitment)
1057
+
1058
+ params << token_mint_pubkey
1059
+ params << params_hash unless params_hash.empty?
1060
+
1061
+ body = create_json_body(method, method_params: params)
1062
+
1063
+ send_request(body, http_method)
1064
+ end
1065
+
1066
+ # @see https://docs.solana.com/developing/clients/jsonrpc-api#gettransaction
1067
+ #
1068
+ # Returns transaction details for a confirmed transaction
1069
+ #
1070
+ # @param transaction_signature [String]
1071
+ # @param encoding [String]
1072
+ # @param commitment [String]
1073
+ #
1074
+ # @return [Response, ApiError] Response when success, ApiError on failure.
1075
+ def get_transaction(transaction_signature, encoding: '', commitment: nil)
1076
+ http_method = :post
1077
+ method = create_method_name(__method__)
1078
+
1079
+ params = []
1080
+ params_hash = {}
1081
+
1082
+ params_hash['commitment'] = commitment unless blank?(commitment)
1083
+ params_hash['encoding'] = encoding unless blank?(encoding)
1084
+
1085
+ params << transaction_signature
1086
+ params << params_hash unless params_hash.empty?
1087
+
1088
+ body = create_json_body(method, method_params: params)
1089
+
1090
+ send_request(body, http_method)
1091
+ end
1092
+
1093
+ # @see https://docs.solana.com/developing/clients/jsonrpc-api#gettransactioncount
1094
+ #
1095
+ # Returns the current Transaction count from the ledger
1096
+ #
1097
+ # @param commitment [String]
1098
+ #
1099
+ # @return [Response, ApiError] Response when success, ApiError on failure.
1100
+ def get_transaction_count(commitment: nil)
1101
+ http_method = :post
1102
+ method = create_method_name(__method__)
1103
+
1104
+ params = []
1105
+ params_hash = {}
1106
+
1107
+ params_hash['commitment'] = commitment unless blank?(commitment)
1108
+
1109
+ params << params_hash unless params_hash.empty?
1110
+
1111
+ body = create_json_body(method, method_params: params)
1112
+
1113
+ send_request(body, http_method)
1114
+ end
1115
+
1116
+ # @see https://docs.solana.com/developing/clients/jsonrpc-api#getversion
1117
+ #
1118
+ # Returns the current solana versions running on the node.
1119
+ #
1120
+ # @return [Response, ApiError] Response when success, ApiError on failure.
1121
+ def get_version
1122
+ http_method = :post
1123
+ method = create_method_name(__method__)
1124
+
1125
+ body = create_json_body(method)
1126
+
1127
+ send_request(body, http_method)
1128
+ end
1129
+
1130
+ # @see https://docs.solana.com/developing/clients/jsonrpc-api#getvoteaccounts
1131
+ # Returns the account info and associated stake for all the voting accounts in the current bank.
1132
+ #
1133
+ # @param commitment [String]
1134
+ # @param vote_pubkey [String]
1135
+ #
1136
+ # @return [Response, ApiError] Response when success, ApiError on failure.
1137
+ def get_vote_accounts(commitment: nil, vote_pubkey: nil)
1138
+ http_method = :post
1139
+ method = create_method_name(__method__)
1140
+
1141
+ params = []
1142
+ params_hash = {}
1143
+
1144
+ params_hash['votePubkey'] = vote_pubkey unless blank?(vote_pubkey)
1145
+ params_hash['commitment'] = commitment unless blank?(commitment)
1146
+
1147
+ params << params_hash unless params_hash.empty?
1148
+
1149
+ body = create_json_body(method, method_params: params)
1150
+
1151
+ send_request(body, http_method)
1152
+ end
1153
+
1154
+ # @see https://docs.solana.com/developing/clients/jsonrpc-api#minimumledgerslot
1155
+ #
1156
+ # Returns the current solana versions running on the node.
1157
+ #
1158
+ # @return [Response, ApiError] Response when success, ApiError on failure.
1159
+ def get_version
1160
+ http_method = :post
1161
+ method = create_method_name(__method__)
1162
+
1163
+ body = create_json_body(method)
1164
+
1165
+ send_request(body, http_method)
1166
+ end
1167
+
1168
+ # @see https://docs.solana.com/developing/clients/jsonrpc-api#minimumledgerslot
1169
+ #
1170
+ # Returns the lowest slot that the node has information about in its ledger.
1171
+ # This value may increase over time if the node is configured to purge older ledger data
1172
+ #
1173
+ # @return [Response, ApiError] Response when success, ApiError on failure.
1174
+ def minimum_ledger_slot
1175
+ http_method = :post
1176
+ method = create_method_name(__method__)
1177
+
1178
+ body = create_json_body(method)
1179
+
1180
+ send_request(body, http_method)
1181
+ end
1182
+
1183
+ # @see https://docs.solana.com/developing/clients/jsonrpc-api#requestairdrop
1184
+ #
1185
+ # Requests an airdrop of lamports to a Pubkey
1186
+ #
1187
+ # @param pubkey [String]
1188
+ # @param lamports [Integer]
1189
+ # @param commitment [String]
1190
+ #
1191
+ # @return [Response, ApiError] Response when success, ApiError on failure.
1192
+ def request_airdrop(pubkey, lamports, commitment: nil)
1193
+ http_method = :post
1194
+ method = create_method_name(__method__)
1195
+
1196
+ params = []
1197
+ params_hash = {}
1198
+
1199
+ params << pubkey
1200
+ params << lamports
1201
+ params << params_hash unless params_hash.empty?
1202
+
1203
+ body = create_json_body(method, method_params: params)
1204
+
1205
+ send_request(body, http_method)
1206
+ end
1207
+
1208
+ # @see https://docs.solana.com/developing/clients/jsonrpc-api#sendtransaction
1209
+ #
1210
+ # Submits a signed transaction to the cluster for processing.
1211
+ #
1212
+ # @param transaction_signature [String]
1213
+ # @param skip_pre_flight [Boolean]
1214
+ # @param pre_flight_commitment [String]
1215
+ # @param encoding [String]
1216
+ #
1217
+ # @return [Response, ApiError] Response when success, ApiError on failure.
1218
+ def send_transaction(
1219
+ transaction_signature,
1220
+ skip_pre_flight: false,
1221
+ pre_flight_commitment: nil,
1222
+ encoding: ''
1223
+ )
1224
+ http_method = :post
1225
+ method = create_method_name(__method__)
1226
+
1227
+ params = []
1228
+ params_hash = {}
1229
+
1230
+ params_hash['skipPreFlight'] = skip_pre_flight unless skip_pre_flight.nil?
1231
+ params_hash['preflightCommitment'] = pre_flight_commitment unless blank?(pre_flight_commitment)
1232
+ params_hash['encoding'] = encoding unless blank?(encoding)
1233
+
1234
+ params << transaction_signature
1235
+ params << params_hash unless params_hash.empty?
1236
+
1237
+ body = create_json_body(method, method_params: params)
1238
+
1239
+ send_request(body, http_method)
1240
+ end
1241
+
1242
+
1243
+ # @see https://docs.solana.com/developing/clients/jsonrpc-api#simulatetransaction
1244
+ #
1245
+ # Simulate sending a transaction
1246
+ # accounts_addresses should be an empty array (?)
1247
+ #
1248
+ # @param transaction_signature [String]
1249
+ # @param accounts_addresses [Array]
1250
+ # @param sig_verify [Boolean]
1251
+ # @param commitment [String]
1252
+ # @param encoding [String]
1253
+ # @param replace_recent_blockhash [Boolean]
1254
+ # @param accounts_encoding [String]
1255
+ #
1256
+ # @return [Response, ApiError] Response when success, ApiError on failure.
1257
+ def simulate_transaction(
1258
+ transaction_signature,
1259
+ accounts_addresses,
1260
+ sig_verify: false,
1261
+ commitment: nil,
1262
+ encoding: '',
1263
+ replace_recent_blockhash: false,
1264
+ accounts_encoding: ''
1265
+ )
1266
+
1267
+ raise ArgumentError, 'Params sig_verify and replace_recent_blockhash cannot both be set to true.' \
1268
+ if sig_verify && replace_recent_blockhash
1269
+
1270
+ http_method = :post
1271
+ method = create_method_name(__method__)
1272
+
1273
+ params = []
1274
+ params_hash = {}
1275
+ params_hash['accounts'] = {}
1276
+
1277
+ params_hash['accounts']['addresses'] = accounts_addresses
1278
+ params_hash['accounts']['encoding'] = accounts_encoding unless blank?(accounts_encoding)
1279
+ params_hash['sigVerify'] = sig_verify unless sig_verify.nil?
1280
+ params_hash['commitment'] = commitment unless blank?(commitment)
1281
+ params_hash['encoding'] = encoding unless blank?(encoding)
1282
+ params_hash['replaceRecentBlockhash'] = replace_recent_blockhash unless replace_recent_blockhash.nil?
1283
+
1284
+ params << transaction_signature
1285
+ params << params_hash unless params_hash.empty?
1286
+
1287
+ body = create_json_body(method, method_params: params)
1288
+
1289
+ send_request(body, http_method)
1290
+ end
1291
+
1292
+ private
1293
+ def send_request(body, http_method)
1294
+ api_response = api_client.call_api(
1295
+ body: body,
1296
+ http_method: http_method,
1297
+ )
1298
+
1299
+ if api_response.body
1300
+ response = Response.new(api_response)
1301
+
1302
+ fail ApiError.new(response.parsed_response) if response.parsed_response.key?('error')
1303
+
1304
+ return response
1305
+ end
1306
+ end
1307
+
1308
+ def create_method_name(method)
1309
+ return '' unless method
1310
+
1311
+ method.to_s.split('_').map.with_index do |string, i|
1312
+ i == 0 ? string : string.capitalize
1313
+ end.join
1314
+ end
1315
+ end
1316
+ end