Module: Netki

Defined in:
lib/netki.rb,
lib/netki/netki.rb,
lib/netki/version.rb,
lib/netki/utilities.rb

Defined Under Namespace

Classes: InvalidURIError, NetkiPartner, WalletName

Constant Summary collapse

VERSION =
"0.0.2"
KNOWN_PREFIXES =
[ 'bitcoin', 'litecoin', 'dogecoin' ]

Class Method Summary collapse

Class Method Details

._parse_bip_21(querystring) ⇒ Object



34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/netki/utilities.rb', line 34

def self._parse_bip_21(querystring)

  param_pairs = querystring.split('&') # '&' reserved as separator in bip21

  param_pairs.inject({}) do |hsh, pair|
    parts = pair.split('=') # '=' reserved as separator in bip21

    raise InvalidURIError.new("unbalanced parameter #{pair}") unless (
      parts.size == 2 &&
      parts[0].size > 0 &&
      parts[1].size > 0)
    raise InvalidURIError.new("duplicate parameter #{parts[0]}") unless hsh[parts[0]].nil?

    hsh[parts[0]] = parts[1]
    hsh
  end
end

._parse_bip_72(querystring) ⇒ Object



28
29
30
31
# File 'lib/netki/utilities.rb', line 28

def self._parse_bip_72(querystring)
  params = _parse_bip_21(querystring)
  { r: params['r'], params: params }
end

.parse_bitcoin_uri(uri, tolerate_errors: false) ⇒ Object



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/netki/utilities.rb', line 7

def self.parse_bitcoin_uri(uri, tolerate_errors: false)
  parts = uri.split(':', 2)

  unless KNOWN_PREFIXES.include?(parts.shift)
    raise InvalidURIError.new("unknown URI prefix")
  end

  # parts => [base58][?[bitcoinparam, [&bitcoinparam, ...]]
  base58address, query = parts.first.split('?', 2)
  response = { address: base58address }

  begin
    response.merge!(_parse_bip_72(query))
  rescue InvalidURIError => e
    raise e unless tolerate_errors
  end

  response
end

.process_request(api_key, partner_id, uri, method, bodyData = nil) ⇒ Object

Request Utility Functionality



10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/netki/netki.rb', line 10

def self.process_request(api_key, partner_id, uri, method, bodyData=nil)

  raise "Invalid HTTP Method" unless ['GET','POST','PUT','DELETE'].include? method

  # Setup Headers
  headers = {}
  headers["Content-Type"] = "application/json"
  headers["Authorization"] = api_key if api_key
  headers["X-Partner-ID"] = partner_id if partner_id

  # Setup Request Options
  opts = {}
  opts[:header] = headers
  opts[:body] = bodyData if bodyData

  client = HTTPClient.new
  _uri = URI.parse(uri)
  response = client.request(method, _uri, opts)

  # Short Circuit Return if 204 Response on DELETE
  return {} if response.code == 204 && method == "DELETE"

  # We should have response content at this point
  raise "Empty Response Received" if response.content.nil? || response.content.empty?

  # Verify we have the correct content type
  raise "Non-JSON Content Type" if response.headers['Content-Type'] != 'application/json'

  # Make Sure We Can Decode JSON Response
  begin
    ret_data = JSON.parse(response.content)
  rescue JSON::ParserError => e
    raise "Invalid JSON Response Received"
  end

  # Process Error
  if response.code >= 300 || !ret_data['success']
    err = ret_data['message']
    if ret_data.has_key? 'failures'
      fails = []
      ret_data['failures'].each do |f|
        fails.push(f['message'])
      end
      err = err + "[FAILURES: " + fails.join(", ") + "]"
    end
    raise err
  end

  return ret_data
end

.wallet_lookup(uri, currency, api_url = 'https://api.netki.com') ⇒ Object

Obtain a WalletName object by querying the Netki Open API.



62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/netki/netki.rb', line 62

def self.wallet_lookup(uri, currency, api_url='https://api.netki.com')
  wallet_name = URI.parse(uri).host || uri.to_s

  response = process_request(nil, nil,
    "#{api_url}/api/wallet_lookup/#{wallet_name}/#{currency.downcase}", 'GET')

  domain_parts = response['wallet_name'].split('.')
  wallet_name = domain_parts.shift

  parsed = begin
             parse_bitcoin_uri(response['wallet_address']).merge(
               {_raw: response['wallet_address']})
           rescue InvalidURIError => e
             response['wallet_address']
           end
  WalletName.new(
    domain_parts.join('.'), wallet_name,
    { response['currency'] => parsed }
  )
end