netki 0.0.1 → 0.0.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 83d574cc62d629d5731a490958428d5e8324b1b4
4
- data.tar.gz: 0f640e9c4f7d8ddc7faa31861c4cc3f34053f067
3
+ metadata.gz: 803a57aec11c14749fe4e612378cb0592af844f3
4
+ data.tar.gz: 6914fbc01f9d1a448651e29a588a6e505dc2af16
5
5
  SHA512:
6
- metadata.gz: 198e72c718bf8f3be1d029e384cb656980fd339ce6e193daa5f5153729a083763f141e952b981b009c66735ed6df563e8d39d915e73f29944102522929bf1f44
7
- data.tar.gz: b05e88a104f06aa1f173567fc2546439956f6a3be42782921d1dad2fab2f7a8381883a513f07c10122dabe21b8a921a0837ac5ebc58568e9df66e5d6d172a024
6
+ metadata.gz: a65eb7dea4aa9c7bf6a096f5eeb6eadd1d14c1c28331f41d6fec07b809db269b40c3783a4ffed41f844f41e1fc73c9c7f06550140dd6058c300ce505ca4bfd02
7
+ data.tar.gz: 35cd36fec85030406ac6890544cca6585585ac90c8eb3593fe96e57e138767ff945c26341ba4d5e7c3febf5e2945f8edf8e38cec50f0ba5e14327e3592b55117
data/lib/netki/netki.rb CHANGED
@@ -1,7 +1,8 @@
1
- require "rubygems"
2
- require "bundler/setup"
3
- require "httpclient"
4
- require "json"
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+ require 'httpclient'
4
+ require 'json'
5
+ require_relative 'utilities'
5
6
 
6
7
  module Netki
7
8
 
@@ -13,8 +14,8 @@ module Netki
13
14
  # Setup Headers
14
15
  headers = {}
15
16
  headers["Content-Type"] = "application/json"
16
- headers["Authorization"] = api_key
17
- headers["X-Partner-ID"] = partner_id
17
+ headers["Authorization"] = api_key if api_key
18
+ headers["X-Partner-ID"] = partner_id if partner_id
18
19
 
19
20
  # Setup Request Options
20
21
  opts = {}
@@ -57,36 +58,54 @@ module Netki
57
58
  return ret_data
58
59
  end
59
60
 
61
+ # Obtain a WalletName object by querying the Netki Open API.
62
+ def self.wallet_lookup(uri, currency, api_url='https://api.netki.com')
63
+ wallet_name = URI.parse(uri).host || uri.to_s
64
+
65
+ response = process_request(nil, nil,
66
+ "#{api_url}/api/wallet_lookup/#{wallet_name}/#{currency.downcase}", 'GET')
67
+
68
+ domain_parts = response['wallet_name'].split('.')
69
+ wallet_name = domain_parts.shift
70
+
71
+ parsed = begin
72
+ parse_bitcoin_uri(response['wallet_address']).merge(
73
+ {_raw: response['wallet_address']})
74
+ rescue InvalidURIError => e
75
+ response['wallet_address']
76
+ end
77
+ WalletName.new(
78
+ domain_parts.join('.'), wallet_name,
79
+ { response['currency'] => parsed }
80
+ )
81
+ end
82
+
60
83
  ##
61
84
  # The WalletName object represents a Netki Wallet Name object.
62
85
  #
63
86
  class WalletName
64
87
 
65
88
  ##
66
- # :args: domain_name, name, wallets, external_id, id
67
- def initialize(domain_name, name, wallets={}, external_id=nil, id=nil) #:nodoc:
68
- @id = id
89
+ # :args: domain_name, name, wallets, external_id, id,
90
+ def initialize(domain_name, name, wallets={}, external_id: nil, id: nil)
69
91
  @domain_name = domain_name
70
92
  @name = name
71
- @wallets = wallets
93
+
94
+ @wallets = wallets.inject({}) do |hsh, (currency, value)|
95
+ hsh[currency] = value.is_a?(Hash) ? value : { address: value }
96
+ hsh
97
+ end
72
98
  @external_id = external_id
99
+ @id = id
73
100
  end
74
101
 
75
- attr_reader :id
76
- attr_reader :domain_name
77
- attr_reader :name
78
- attr_reader :external_id
79
-
80
- attr_writer :id
81
- attr_writer :domain_name
82
- attr_writer :name
83
- attr_writer :external_id
102
+ attr_accessor :domain_name, :name, :id, :external_id
84
103
 
85
104
  # :section: Getters
86
105
 
87
106
  # Get Address for Existing Currency
88
107
  def get_address(currency)
89
- @wallets[currency]
108
+ @wallets[currency][:address]
90
109
  end
91
110
 
92
111
  # Get Wallet Name Array of Used Currencies
@@ -98,7 +117,7 @@ module Netki
98
117
 
99
118
  # Set the address or URI for the given currency for this wallet name
100
119
  def set_currency_address(currency, address)
101
- @wallets[currency] = address
120
+ @wallets[currency][:address] = address
102
121
  end
103
122
 
104
123
  # Remove a used currency from this wallet name
@@ -119,18 +138,21 @@ module Netki
119
138
  # Save the currency WalletName object to the remote service
120
139
  def save
121
140
  wallet_data = []
122
- @wallets.each do |currency, wallet_address|
123
- wallet_data.push({
124
- currency: currency,
125
- wallet_address: wallet_address
126
- })
141
+ @wallets.each do |currency, wallet|
142
+ # NOTE: Unsure if remote service supports storing metadata (params/bip70 req)?
143
+ wallet_data.push(
144
+ {
145
+ currency: currency,
146
+ wallet_address: wallet[:_raw] ? wallet[:_raw] : wallet[:address]
147
+ }
148
+ )
127
149
  end
128
150
 
129
151
  wn_data = {
130
- domain_name: @domain_name,
131
- name: @name,
132
- wallets: wallet_data,
133
- external_id: @external_id
152
+ domain_name: @domain_name,
153
+ name: @name,
154
+ wallets: wallet_data,
155
+ external_id: @external_id || 'null'
134
156
  }
135
157
 
136
158
  wn_api_data = {}
@@ -286,7 +308,10 @@ module Netki
286
308
  # Create a new Wallet Name object using this factory method.
287
309
  # * domain_name -> The pre-configured domain name you would like to add this new wallet name to
288
310
  # * name -> The DNS name that you would like this new wallet name to have (ie.. name.domain_name)
289
- # * wallets -> This is a hash where the key is the currency (ie.. btc, ltc, dgc, tusd) and the value is the wallet address or URL of the BIP32 / BIP70 address server
311
+ # * wallets -> This is a hash where the key is the currency (ie.. btc, ltc, dgc, tusd) and the value is:
312
+ # the wallet address OR
313
+ # URL of the BIP32 / BIP70 address server OR
314
+ # a hash containing an :address and other metadata
290
315
  # * external_id -> Any unique external ID that you may want to use to track this specific wallet name
291
316
  #
292
317
  def create_new_walletname(domain_name, name, wallets={}, external_id=nil)
@@ -323,4 +348,4 @@ module Netki
323
348
  wn_list
324
349
  end
325
350
  end
326
- end
351
+ end
@@ -0,0 +1,51 @@
1
+ module Netki
2
+
3
+ KNOWN_PREFIXES = [ 'bitcoin', 'litecoin', 'dogecoin' ]
4
+
5
+ class InvalidURIError < StandardError; end
6
+
7
+ def self.parse_bitcoin_uri(uri, tolerate_errors: false)
8
+ parts = uri.split(':', 2)
9
+
10
+ unless KNOWN_PREFIXES.include?(parts.shift)
11
+ raise InvalidURIError.new("unknown URI prefix")
12
+ end
13
+
14
+ # parts => [base58][?[bitcoinparam, [&bitcoinparam, ...]]
15
+ base58address, query = parts.first.split('?', 2)
16
+ response = { address: base58address }
17
+
18
+ begin
19
+ response.merge!(_parse_bip_72(query))
20
+ rescue InvalidURIError => e
21
+ raise e unless tolerate_errors
22
+ end
23
+
24
+ response
25
+ end
26
+
27
+ # https://github.com/bitcoin/bips/blob/master/bip-0072.mediawiki
28
+ def self._parse_bip_72(querystring)
29
+ params = _parse_bip_21(querystring)
30
+ { r: params['r'], params: params }
31
+ end
32
+
33
+ # https://github.com/bitcoin/bips/blob/master/bip-0021.mediawiki
34
+ def self._parse_bip_21(querystring)
35
+
36
+ param_pairs = querystring.split('&') # '&' reserved as separator in bip21
37
+
38
+ param_pairs.inject({}) do |hsh, pair|
39
+ parts = pair.split('=') # '=' reserved as separator in bip21
40
+
41
+ raise InvalidURIError.new("unbalanced parameter #{pair}") unless (
42
+ parts.size == 2 &&
43
+ parts[0].size > 0 &&
44
+ parts[1].size > 0)
45
+ raise InvalidURIError.new("duplicate parameter #{parts[0]}") unless hsh[parts[0]].nil?
46
+
47
+ hsh[parts[0]] = parts[1]
48
+ hsh
49
+ end
50
+ end
51
+ end
data/lib/netki/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Netki
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: netki
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matt David
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2015-08-08 00:00:00.000000000 Z
11
+ date: 2015-08-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: httpclient
@@ -125,6 +125,7 @@ files:
125
125
  - bin/setup
126
126
  - lib/netki.rb
127
127
  - lib/netki/netki.rb
128
+ - lib/netki/utilities.rb
128
129
  - lib/netki/version.rb
129
130
  - netki.gemspec
130
131
  homepage: https://github.com/netkicorp/ruby-partner-client