Initial commit

This commit is contained in:
Yaser
2026-08-13 19:50:53 +03:30
commit 38084458fe
879 changed files with 95198 additions and 0 deletions

View File

@@ -0,0 +1,49 @@
module Bitcoin
class Client
Error = Class.new(StandardError)
class ConnectionError < Error; end
class ResponseError < Error
def initialize(code, msg)
super "#{msg} (#{code})"
end
end
extend Memoist
def initialize(endpoint, idle_timeout: 5)
@json_rpc_endpoint = URI.parse(endpoint)
@path = @json_rpc_endpoint.path.empty? ? "/" : @json_rpc_endpoint.path
@idle_timeout = idle_timeout
end
def json_rpc(method, params = [])
response = connection.post \
@path,
{ jsonrpc: '1.0', method: method, params: params }.to_json,
{ 'Accept' => 'application/json',
'Content-Type' => 'application/json' }
response.assert_success!
response = JSON.parse(response.body)
response['error'].tap { |error| raise ResponseError.new(error['code'], error['message']) if error }
response.fetch('result')
rescue Faraday::Error => e
raise ConnectionError, e
rescue StandardError => e
raise Error, e
end
private
def connection
@connection ||= Faraday.new(@json_rpc_endpoint) do |f|
f.adapter :net_http_persistent, pool_size: 5, idle_timeout: @idle_timeout
end.tap do |connection|
unless @json_rpc_endpoint.user.blank?
connection.basic_auth(@json_rpc_endpoint.user, @json_rpc_endpoint.password)
end
end
end
end
end