nanook 2.1.0 → 2.5.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: e1c2a7e556469efac09a609f78e8f3a4e0533a89
4
- data.tar.gz: 12d86898565f21e0c483c891be2b36f1c838216e
2
+ SHA256:
3
+ metadata.gz: d03d4611714f05048845e583058c3d99216e0d7bc4e82994556f7abd6bc94d4e
4
+ data.tar.gz: 404045d0de5f045400897c648e22267c0981ff9d498e9404f08ef77aaadfbfac
5
5
  SHA512:
6
- metadata.gz: 47b9839217c59af70980fb20b1f8cefe716654170d15c908dc25f24bcba7ba34ef8b9bc5dc0b50912b447e6a779d022dbc264b2a469219c383fae754d8828843
7
- data.tar.gz: 94d4e68c2a9a8debbd06c48b98e3b30d8ec2fac6d567e5c40dba50044c82cd894b11051b9b7df32ae818dbc830b1a27b2826b0a5267e959f415dd9e90c2069bb
6
+ metadata.gz: 7b5a0bf64ca64119b0e692b527677154a291c8080ade14c52624e41d59fb772c9e5f55c0f58bd8a460ea806fdcbbeebd0009f248547771f228f48a4829e2a014
7
+ data.tar.gz: d78534084ba296713af7e3384222319916d3e6e61977d044d8cd724a46b70469c7df7299ba6ed35118dc491aa9de8cb9766a9fb42ab6a16e4543a95e30d76793
data/CHANGELOG.md CHANGED
@@ -4,9 +4,85 @@ All notable changes to this project will be documented in this file.
4
4
  The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
5
5
  and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
6
6
 
7
+ ## 2.5.1
8
+
9
+ ### Fixed
10
+
11
+ - undefined method 'new' for `BigDecimal:Class` (thank you @MihaiVoinea)
12
+
13
+ ## 2.5.0
14
+
15
+ ### Added
16
+
17
+ - New `Nanook::Node#bootstrap_lazy` method.
18
+ - New `Nanook::Node#bootstrap_status` method.
19
+ - New `Nanook::Node#difficulty` method.
20
+ - New `Nanook::Node#uptime` method.
21
+ - New `Nanook::Wallet#lock` method.
22
+
23
+ ### Changed
24
+
25
+ - `Nanook::Node#chain` now takes optional `offset` argument.
26
+ - `Nanook::Node#successors` now takes optional `offset` argument.
27
+ - `Nanook::Node#successors` now aliased as `Nanook::Node#ancestors`
28
+ - Updated docs to use `nano_` prefixed addresses.
29
+
30
+ ## 2.4.0
31
+
32
+ ### Added
33
+
34
+ - New `Nanook::Node#confirmation_history` method.
35
+ - New `Nanook::Block#confirm` method.
36
+ - New `Nanook::Block#confirmed_recently?` method.
37
+
38
+ ### Changed
39
+
40
+ - `Nanook::Block#generate_work` now can take optional `use_peers` argument.
41
+
42
+ ## 2.3.0
43
+
44
+ ### Added
45
+
46
+ - New `Nanook::Wallet#default_representative` method.
47
+ - New `Nanook::Wallet#change_default_representative` method.
48
+ - New `Nanook::Wallet#info` method.
49
+
50
+ ## 2.2.0
51
+
52
+ ### Added
53
+
54
+ - New `Nanook::Account#block_count` method returns number of blocks in ledger for an account.
55
+ - `Nanook::Node#block_count_type` is now an alias to the preferred `#block_count_by_type`
56
+ method.
57
+ - new `Nanook::Node#representatives_online` method.
58
+ - `Nanook::Node#synchronizing_blocks` aliased by `#unchecked`, for people familiar with
59
+ what the RPC calls it.
60
+ - `Nanook::Node#version` now an aliased by `#info`
61
+ method.
62
+ - `Nanook::WalletAccount#exists?` now aliased by `#open?`
63
+
64
+ ### Removed
65
+
66
+ - `Nanook::WalletAccount#account_id` Removed, as there was already an `id` method that returned this.
67
+ - `Nanook::WalletAccount#wallet_id` Removed, as the `WalletAccount` object should be considered a kind of Account.
68
+
69
+ ### Changed
70
+
71
+ - `Nanook::Account#delegators` now takes `unit` argument.
72
+ - `Nanook::Account#ledger` now takes `unit` and `modified_since` arguments.
73
+ - `Nanook::Node#representatives` now takes `unit` argument.
74
+ - `Nanook::Node#synced?` is deprecated with a `warn`. Nodes never seem to reach 100%
75
+ synchronized, so this method is useless.
76
+ - `Nanook::Rpc::DEFAULT_TIMEOUT` reduced from 500 to 60.
77
+
7
78
  ## 2.1.0
8
79
 
9
- - Payment methods check the account id of the recipient is valid, raises ArgumentError if not.
80
+ ### Changed
81
+
82
+ - Payment methods no longer check that recipient account has an open block, as this prevents
83
+ funds being sent to accounts about to be opened.
84
+ - Payment methods now check the account id of the recipient is valid, raises ArgumentError if not.
85
+ - Payment methods now return a Nanook::Error if the RPC returns an error when trying to pay, instead of a String.
10
86
 
11
87
  ## 2.0.0
12
88
 
@@ -24,6 +100,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
24
100
  - Added ruby version requirement >= 2.0 to gemspec.
25
101
 
26
102
  ### Changed
103
+
27
104
  - `Nanook::Rpc#inspect` displays full hostname with scheme and port.
28
105
  - `Nanook::Account#new` `account` param is now required.
29
106
  - `Nanook::Account#info` now also returns the `id` of the account.
@@ -41,6 +118,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
41
118
  - Changed documentation generating tool from rdoc to yard.
42
119
 
43
120
  ### Fixed
121
+
44
122
  - Missing `Nanook#rpc` accessor.
45
123
  - `Nanook::Block#publish` can return false when publish fails.
46
124
  - `Nanook::Block#info` correctly handles `allow_unchecked: true` errors.
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Nanook
2
2
 
3
- This is a Ruby library for managing a [nano currency](https://nano.org/) node, including making and receiving payments, using the [nano RPC protocol](https://github.com/nanocurrency/raiblocks/wiki/RPC-protocol). Nano is a fee-less, fast, environmentally-friendly cryptocurrency. It's awesome. See [https://nano.org](https://nano.org/).
3
+ This is a Ruby library for managing a [nano currency](https://nano.org/) node, including making and receiving payments, using the [nano RPC protocol](https://docs.nano.org/commands/rpc-protocol). Nano is a fee-less, fast, environmentally-friendly cryptocurrency. It's awesome. See [https://nano.org](https://nano.org/).
4
4
 
5
5
  [![Gem Version](https://badge.fury.io/rb/nanook.svg)](https://badge.fury.io/rb/nanook)
6
6
  [![CircleCI](https://circleci.com/gh/lukes/nanook/tree/master.svg?style=shield)](https://circleci.com/gh/lukes/nanook/tree/master)
@@ -11,7 +11,7 @@ This is a Ruby library for managing a [nano currency](https://nano.org/) node, i
11
11
  Add this line to your application's Gemfile:
12
12
 
13
13
  ```ruby
14
- gem 'nanook', "~> 2.1"
14
+ gem 'nanook'
15
15
  ```
16
16
 
17
17
  And then execute:
@@ -76,7 +76,7 @@ wallet = Nanook.new.wallet(wallet_id)
76
76
  wallet.pay(from: your_account_id, to: recipient_account_id, amount: 0.2, id: unique_id)
77
77
  ```
78
78
 
79
- The `id` can be any string and needs to be unique per payment. It serves an important purpose; it allows you to make this call multiple times with the same `id` and be reassured that you will only ever send that nano payment once. From the [Nano RPC](https://github.com/nanocurrency/raiblocks/wiki/RPC-protocol#account-create):
79
+ The `id` can be any string and needs to be unique per payment. It serves an important purpose; it allows you to make this call multiple times with the same `id` and be reassured that you will only ever send that nano payment once. From the [Nano RPC](https://docs.nano.org/commands/rpc-protocol/#send):
80
80
 
81
81
  > You can (and should) specify a unique id for each spend to provide idempotency. That means that if you [make the payment call] two times with the same id, the second request won't send any additional Nano.
82
82
 
@@ -86,7 +86,7 @@ The unit of the `amount` is NANO (which is currently technically Mnano — s
86
86
  account.pay(to: recipient_account_id, amount: 999, unit: :raw, id: unique_id)
87
87
  ```
88
88
 
89
- Note, there may be a delay in receiving a response due to Proof of Work being done. From the [Nano RPC](https://github.com/nanocurrency/raiblocks/wiki/RPC-protocol#account-create):
89
+ Note, there may be a delay in receiving a response due to Proof of Work being done. From the [Nano RPC](https://docs.nano.org/commands/rpc-protocol/#send):
90
90
 
91
91
  > Proof of Work is precomputed for one transaction in the background. If it has been a while since your last transaction it will send instantly, the next one will need to wait for Proof of Work to be generated.
92
92
 
@@ -120,11 +120,11 @@ wallet.receive(block_id, into: account_id)
120
120
 
121
121
  ## All commands
122
122
 
123
- Below is a quick reference list of commands. See the [full Nanook documentation](https://lukes.github.io/nanook/2.0.0/) for a searchable detailed description of every class and method, what the arguments mean, and example responses (Tip: the classes are listed under the "**Nanook** < Object" item in the sidebar).
123
+ Below is a quick reference list of commands. See the [full Nanook documentation](https://lukes.github.io/nanook/2.5.1/) for a searchable detailed description of every class and method, what the arguments mean, and example responses (Tip: the classes are listed under the "**Nanook** < Object" item in the sidebar).
124
124
 
125
125
  ### Wallets
126
126
 
127
- See the [full documentation for Nanook::Wallet](https://lukes.github.io/nanook/2.0.0/classes/Nanook/Wallet.html) for a detailed description of each method and example responses.
127
+ See the [full documentation for Nanook::Wallet](https://lukes.github.io/nanook/2.5.1/Nanook/Wallet.html) for a detailed description of each method and example responses.
128
128
 
129
129
  #### Create wallet:
130
130
 
@@ -150,7 +150,7 @@ wallet.balance
150
150
  wallet.balance(account_break_down: true)
151
151
  wallet.balance(unit: :raw)
152
152
  wallet.pay(from: your_account_id, to: recipient_account_id, amount: 2, id: unique_id)
153
- wallet.pay(from: your_account_id, to: recipient_account_id, amount: 2, unit: :raw, id: unique_id)
153
+ wallet.pay(from: your_account_id, to: recipient_account_id, amount: 2, id: unique_id, unit: :raw)
154
154
  wallet.pending
155
155
  wallet.pending(limit: 1)
156
156
  wallet.pending(detailed: true)
@@ -159,10 +159,16 @@ wallet.receive(into: account_id)
159
159
  wallet.receive(pending_block_id, into: account_id)
160
160
 
161
161
  wallet.account.create
162
+ wallet.account.create(5)
162
163
  wallet.accounts
163
164
  wallet.contains?(account_id)
164
165
 
166
+ wallet.default_representative
167
+ wallet.change_default_representative(new_representative)
168
+ wallet.info
169
+ wallet.info(unit: :raw)
165
170
  wallet.export
171
+ wallet.lock
166
172
  wallet.locked?
167
173
  wallet.unlock(password)
168
174
  wallet.change_password(password)
@@ -185,13 +191,15 @@ Nanook.new.wallet(wallet_id).account.create(5)
185
191
 
186
192
  #### Working with a single account:
187
193
 
194
+ See the [full documentation for Nanook::WalletAccount](https://lukes.github.io/nanook/2.5.1/Nanook/WalletAccount.html) for a detailed description of each method and example responses.
195
+
188
196
  ```ruby
189
197
  account = Nanook.new.wallet(wallet_id).account(account_id)
190
198
 
191
199
  account.balance
192
200
  account.balance(unit: :raw)
193
201
  account.pay(to: recipient_account_id, amount: 2, id: unique_id)
194
- account.pay(to: recipient_account_id, amount: 2, unit: :raw, id: unique_id)
202
+ account.pay(to: recipient_account_id, amount: 2, id: unique_id, unit: :raw)
195
203
  account.pending
196
204
  account.pending(limit: 1)
197
205
  account.pending(detailed: true)
@@ -206,11 +214,14 @@ account.info(unit: :raw)
206
214
  account.last_modified_at
207
215
  account.ledger
208
216
  account.ledger(limit: 10)
217
+ account.ledger(modified_since: Time.now)
218
+ account.ledger(unit: :raw)
209
219
  account.history
210
220
  account.history(limit: 1)
211
221
  account.history(unit: :raw)
212
222
  account.public_key
213
223
  account.delegators
224
+ account.delegators(unit: :raw)
214
225
  account.representative
215
226
  account.change_representative(new_representative)
216
227
  account.weight
@@ -220,7 +231,7 @@ account.destroy
220
231
 
221
232
  #### Working with any account (not necessarily in your wallet):
222
233
 
223
- See the [full documentation for Nanook::Account](https://lukes.github.io/nanook/2.0.0/classes/Nanook/Account.html) for a detailed description of each method and example responses.
234
+ See the [full documentation for Nanook::Account](https://lukes.github.io/nanook/2.5.1/Nanook/Account.html) for a detailed description of each method and example responses.
224
235
 
225
236
  ```ruby
226
237
  account = Nanook.new.account(account_id)
@@ -239,18 +250,21 @@ account.info(unit: :raw)
239
250
  account.last_modified_at
240
251
  account.ledger
241
252
  account.ledger(limit: 10)
253
+ account.ledger(modified_since: Time.now)
254
+ account.ledger(unit: :raw)
242
255
  account.history
243
256
  account.history(limit: 1)
244
257
  account.history(unit: :raw)
245
258
  account.public_key
246
259
  account.delegators
260
+ account.delegators(unit: :raw)
247
261
  account.representative
248
262
  account.weight
249
263
  ```
250
264
 
251
265
  ### Blocks
252
266
 
253
- See the [full documentation for Nanook::Block](https://lukes.github.io/nanook/2.0.0/classes/Nanook/Block.html) for a detailed description of each method and example responses.
267
+ See the [full documentation for Nanook::Block](https://lukes.github.io/nanook/2.5.1/Nanook/Block.html) for a detailed description of each method and example responses.
254
268
 
255
269
  ```ruby
256
270
  block = Nanook.new.block(block_id)
@@ -260,6 +274,9 @@ block.info(allow_unchecked: true) # Verified blocks AND unchecked synchronizing
260
274
  block.account
261
275
  block.chain
262
276
  block.chain(limit: 10)
277
+ block.chain(offset: 10)
278
+ block.confirm
279
+ block.confirmed_recently?
263
280
  block.history
264
281
  block.history(limit: 10)
265
282
  block.republish
@@ -269,28 +286,39 @@ block.pending?
269
286
  block.publish
270
287
  block.successors
271
288
  block.successors(limit: 10)
289
+ block.successors(offset: 10)
272
290
 
273
291
  block.generate_work
292
+ block.generate_work(use_peers: true)
274
293
  block.cancel_work
275
294
  block.is_valid_work?(work_id)
276
295
  ```
277
296
 
278
297
  ### Managing your nano node
279
298
 
299
+ See the [full documentation for Nanook::Node](https://lukes.github.io/nanook/2.5.1/Nanook/Node.html) for a detailed description of each method and example responses.
300
+
280
301
  ```ruby
281
302
  node = Nanook.new.node
282
303
 
283
304
  node.account_count
284
305
  node.block_count
285
- node.block_count_type
286
- node.bootstrap_any
306
+ node.block_count_by_type
287
307
  node.bootstrap(address: "::ffff:138.201.94.249", port: 7075)
308
+ node.bootstrap_any
309
+ node.bootstrap_lazy(block_id)
310
+ node.bootstrap_lazy(block_id, force: true)
311
+ node.bootstrap_status
312
+ node.confirmation_history
313
+ node.difficulty
314
+ node.difficulty(include_trend: true)
288
315
  node.peers
289
316
  node.representatives
317
+ node.representatives(unit: :raw)
318
+ node.representatives_online
290
319
  node.synchronizing_blocks
291
320
  node.synchronizing_blocks(limit: 1)
292
321
  node.sync_progress
293
- node.synced?
294
322
  node.version
295
323
 
296
324
  node.stop
@@ -325,12 +353,12 @@ key.info
325
353
 
326
354
  ## Nanook Metal
327
355
 
328
- You can do any call listed in the [Nano RPC](https://github.com/nanocurrency/raiblocks/wiki/RPC-protocol) directly through the `rpc` method. The first argument should match the `action` of the RPC call, and then all remaining parameters are passed in as arguments.
356
+ You can do any call listed in the [Nano RPC](https://docs.nano.org/commands/rpc-protocol) directly through the `rpc` method. The first argument should match the `action` of the RPC call, and then all remaining parameters are passed in as arguments.
329
357
 
330
- E.g., the [accounts_create command](https://github.com/nanocurrency/raiblocks/wiki/RPC-protocol#accounts-create) can be called like this:
358
+ E.g., the [accounts_create command](https://docs.nano.org/commands/rpc-protocol/#accounts_create) can be called like this:
331
359
 
332
360
  ```ruby
333
- Nano.new.rpc(:accounts_create, wallet: wallet_id, count: 2)
361
+ Nanook.new.rpc.call(:accounts_create, wallet: wallet_id, count: 2)
334
362
  ```
335
363
 
336
364
  ## Contributing
@@ -351,11 +379,11 @@ The gem is available as open source under the terms of the [MIT License](https:/
351
379
 
352
380
  ## Buy me a nano coffee
353
381
 
354
- This library is totally free to use, but feel free to send some nano [my way](https://www.nanode.co/account/xrb_3c3ek3k8135f6e8qtfy8eruk9q3yzmpebes7btzncccdest8ymzhjmnr196j) if you'd like to!
382
+ This library is totally free to use, but feel free to send some nano [my way](https://www.nanode.co/account/nano_3c3ek3k8135f6e8qtfy8eruk9q3yzmpebes7btzncccdest8ymzhjmnr196j) if you'd like to!
355
383
 
356
- xrb_3c3ek3k8135f6e8qtfy8eruk9q3yzmpebes7btzncccdest8ymzhjmnr196j
384
+ nano_3c3ek3k8135f6e8qtfy8eruk9q3yzmpebes7btzncccdest8ymzhjmnr196j
357
385
 
358
- ![alt xrb_3c3ek3k8135f6e8qtfy8eruk9q3yzmpebes7btzncccdest8ymzhjmnr196j](https://raw.githubusercontent.com/lukes/nanook/master/img/qr.png)
386
+ ![alt nano_3c3ek3k8135f6e8qtfy8eruk9q3yzmpebes7btzncccdest8ymzhjmnr196j](https://raw.githubusercontent.com/lukes/nanook/master/img/qr.png)
359
387
 
360
388
 
361
389
 
data/lib/nanook.rb CHANGED
@@ -2,7 +2,7 @@ require 'net/http'
2
2
  require 'uri'
3
3
  require 'forwardable'
4
4
 
5
- Dir[File.dirname(__FILE__) + '/nanook/*.rb'].each {|file| require file }
5
+ Dir[File.dirname(__FILE__) + '/nanook/*.rb'].each { |file| require file }
6
6
 
7
7
  # ==== Initializing
8
8
  #
@@ -42,12 +42,12 @@ class Nanook
42
42
  # Returns a new instance of {Nanook}.
43
43
  #
44
44
  # ==== Examples:
45
- # Connecting to http://localhost:7076 with the default timeout of 600s:
45
+ # Connecting to http://localhost:7076 with the default timeout of 10s:
46
46
  # Nanook.new
47
47
  # Setting a custom timeout:
48
- # Nanook.new(timeout: 600)
48
+ # Nanook.new(timeout: 10)
49
49
  # Connecting to a custom RPC host and setting a timeout:
50
- # Nanook.new("http://ip6-localhost.com:7076", timeout: 600)
50
+ # Nanook.new("http://ip6-localhost.com:7076", timeout: 10)
51
51
  #
52
52
  # @param uri [String] default is {Nanook::Rpc::DEFAULT_URI}. The RPC host to connect to
53
53
  # @param timeout [Integer] default is {Nanook::Rpc::DEFAULT_TIMEOUT}. Connection timeout in number of seconds
@@ -58,7 +58,7 @@ class Nanook
58
58
  # Returns a new instance of {Nanook::Account}.
59
59
  #
60
60
  # ==== Example:
61
- # account = Nanook.new.account("xrb_3e3j5tkog48pnny9dmfzj1r16pg8t1e76dz5tmac6iq689wyjfpi00000000")
61
+ # account = Nanook.new.account("nano_3e3j5tkog48pnny9dmfzj1r16pg8t1e76dz5tmac6iq689wyjfpi00000000")
62
62
  #
63
63
  # @param account [String] the id of the account you want to work with
64
64
  # @return [Nanook::Account]
@@ -8,12 +8,12 @@ class Nanook
8
8
  # Initialize this class through the convenient {Nanook#account} method:
9
9
  #
10
10
  # nanook = Nanook.new
11
- # account = nanook.account("xrb_...")
11
+ # account = nanook.account("nano_...")
12
12
  #
13
13
  # Or compose the longhand way like this:
14
14
  #
15
15
  # rpc_conn = Nanook::Rpc.new
16
- # account = Nanook::Account.new(rpc_conn, "xrb_...")
16
+ # account = Nanook::Account.new(rpc_conn, "nano_...")
17
17
  class Account
18
18
 
19
19
  def initialize(rpc, account)
@@ -21,23 +21,43 @@ class Nanook
21
21
  @account = account
22
22
  end
23
23
 
24
- # Returns information about this account's delegators.
25
- # === Example response:
24
+ # Information about this accounts that have set this account as their representative.
25
+ #
26
+ # === Example:
27
+ #
28
+ # account.delegators
29
+ #
30
+ # Example response:
31
+ #
26
32
  # {
27
- # :xrb_13bqhi1cdqq8yb9szneoc38qk899d58i5rcrgdk5mkdm86hekpoez3zxw5sd=>500000000000000000000000000000000000,
28
- # :xrb_17k6ug685154an8gri9whhe5kb5z1mf5w6y39gokc1657sh95fegm8ht1zpn=>961647970820730000000000000000000000
33
+ # :nano_13bqhi1cdqq8yb9szneoc38qk899d58i5rcrgdk5mkdm86hekpoez3zxw5sd=>500000000000000000000000000000000000,
34
+ # :nano_17k6ug685154an8gri9whhe5kb5z1mf5w6y39gokc1657sh95fegm8ht1zpn=>961647970820730000000000000000000000
29
35
  # }
30
36
  #
31
- # @return [Hash{Symbol=>String}] Delegators
32
- def delegators
33
- rpc(:delegators)[:delegators]
37
+ # @param unit (see #balance)
38
+ # @return [Hash{Symbol=>Integer}] account ids which delegate to this account, and their account balance
39
+ def delegators(unit: Nanook.default_unit)
40
+ unless Nanook::UNITS.include?(unit)
41
+ raise ArgumentError.new("Unsupported unit: #{unit}")
42
+ end
43
+
44
+ response = rpc(:delegators)[:delegators]
45
+
46
+ return response if unit == :raw
47
+
48
+ r = response.map do |account_id, balance|
49
+ balance = Nanook::Util.raw_to_NANO(balance)
50
+
51
+ [account_id, balance]
52
+ end
53
+
54
+ Hash[r].to_symbolized_hash
34
55
  end
35
56
 
36
- # Returns a boolean indicating if the account exists.
57
+ # Returns true if the account has an <i>open</i> block.
37
58
  #
38
- # Existence is determined by if the account has an _open_ block.
39
- # An _open_ block is a special kind of block that gets published when
40
- # an account receives a payment for the first time.
59
+ # An open block gets published when an account receives a payment
60
+ # for the first time.
41
61
  #
42
62
  # The reliability of this check depends on the node host having
43
63
  # synchronized itself with most of the blocks on the nano network,
@@ -45,40 +65,33 @@ class Nanook
45
65
  # You can check if a node's synchronization is particular low
46
66
  # using {Nanook::Node#sync_progress}.
47
67
  #
48
- # @return [Boolean] Indicates if this account exists in the nano network
68
+ # ==== Example:
69
+ #
70
+ # account.exists? # => true
71
+ # # or
72
+ # account.open? # => true
73
+ #
74
+ # @return [Boolean] Indicates if this account has an open block
49
75
  def exists?
50
76
  response = rpc(:account_info)
51
77
  !response.empty? && !response[:open_block].nil?
52
78
  end
79
+ alias_method :open?, :exists?
53
80
 
54
- # Returns an account's history of send and receive payments.
81
+ # An account's history of send and receive payments.
55
82
  #
56
83
  # ==== Example:
57
84
  #
58
85
  # account.history
59
- # account.history(limit: 1)
60
86
  #
61
- # ==== Example response:
62
- # [
63
- # {
64
- # :type=>"send",
65
- # :account=>"xrb_1kdc5u48j3hr5r7eof9iao47szqh81ndqgq5e5hrsn1g9a3sa4hkkcotn3uq",
66
- # :amount=>2,
67
- # :hash=>"2C3C570EA8898443C0FD04A1C385A3E3A8C985AD792635FCDCEBB30ADF6A0570"
68
- # }
69
- # ]
70
- # ==== Example:
71
- #
72
- # account.history
73
- # account.history(unit: :raw)
87
+ # Example response:
74
88
  #
75
- # ==== Example response:
76
89
  # [
77
90
  # {
78
- # :type=>"send",
79
- # :account=>"xrb_1kdc5u48j3hr5r7eof9iao47szqh81ndqgq5e5hrsn1g9a3sa4hkkcotn3uq",
80
- # :amount=>2000000000000000000000000000000,
81
- # :hash=>"2C3C570EA8898443C0FD04A1C385A3E3A8C985AD792635FCDCEBB30ADF6A0570"
91
+ # type: "send",
92
+ # account: "nano_1kdc5u48j3hr5r7eof9iao47szqh81ndqgq5e5hrsn1g9a3sa4hkkcotn3uq",
93
+ # amount: 2,
94
+ # hash: "2C3C570EA8898443C0FD04A1C385A3E3A8C985AD792635FCDCEBB30ADF6A0570"
82
95
  # }
83
96
  # ]
84
97
  #
@@ -102,65 +115,78 @@ class Nanook
102
115
  end
103
116
  end
104
117
 
105
- # @return [Time] last modified time of the account in UTC time zone.
118
+ # The last modified time of the account in the time zone of
119
+ # your nano node (usually UTC).
120
+ #
121
+ # ==== Example:
122
+ #
123
+ # account.last_modified_at # => Time
124
+ #
125
+ # @return [Time] last modified time of the account in the time zone of
126
+ # your nano node (usually UTC).
106
127
  def last_modified_at
107
128
  response = rpc(:account_info)
108
129
  Time.at(response[:modified_timestamp])
109
130
  end
110
131
 
111
- # Returns the public key belonging to an account.
132
+ # The public key of the account.
112
133
  #
113
- # ==== Example response:
114
- # "3068BB1CA04525BB0E416C485FE6A67FD52540227D267CC8B6E8DA958A7FA039"
134
+ # ==== Example:
135
+ #
136
+ # account.public_key # => "3068BB1..."
115
137
  #
116
- # @return [String] public key of this account
138
+ # @return [String] public key of the account
117
139
  def public_key
118
140
  rpc(:account_key)[:key]
119
141
  end
120
142
 
121
- # Returns the representative account for the account.
122
- # Representatives are accounts which cast votes in the case of a
143
+ # The representative account id for the account.
144
+ # Representatives are accounts that cast votes in the case of a
123
145
  # fork in the network.
124
146
  #
125
- # ==== Example response
147
+ # ==== Example:
126
148
  #
127
- # "xrb_3pczxuorp48td8645bs3m6c3xotxd3idskrenmi65rbrga5zmkemzhwkaznh"
149
+ # account.representative # => "nano_3pc..."
128
150
  #
129
- # @return [String] Representative account of this account
151
+ # @return [String] Representative account of the account
130
152
  def representative
131
153
  rpc(:account_representative)[:representative]
132
154
  end
133
155
 
134
- # Returns a Hash containing the account's balance.
156
+ # The account's balance, including pending (unreceived payments).
157
+ # To receive a pending amount see {WalletAccount#receive}.
135
158
  #
136
- # ==== Example:
159
+ # ==== Examples:
137
160
  #
138
161
  # account.balance
139
162
  #
140
- # # =>
141
- # # {
142
- # # balance=>2, # Account balance
143
- # # pending=>1.1 # Amount pending and not yet received by the account
144
- # # }
163
+ # Example response:
145
164
  #
146
- # ==== Example balance returned in raw:
165
+ # {
166
+ # balance: 2,
167
+ # pending: 1.1
168
+ # }
169
+ #
170
+ # Asking for the balance to be returned in raw instead of NANO:
147
171
  #
148
172
  # account.balance(unit: :raw)
149
173
  #
150
- # # =>
151
- # # {
152
- # # balance: 2000000000000000000000000000000,
153
- # # pending: 1100000000000000000000000000000
154
- # # }
174
+ # Example response:
175
+ #
176
+ # {
177
+ # balance: 2000000000000000000000000000000,
178
+ # pending: 1100000000000000000000000000000
179
+ # }
155
180
  #
156
181
  # @param unit [Symbol] default is {Nanook.default_unit}.
157
182
  # Must be one of {Nanook::UNITS}.
158
183
  # Represents the unit that the balances will be returned in.
159
184
  # Note: this method interprets
160
- # +:nano+ as NANO, which is technically Mnano
185
+ # +:nano+ as NANO, which is technically Mnano.
161
186
  # See {https://nano.org/en/faq#what-are-nano-units- What are Nano's Units}
162
187
  #
163
188
  # @raise ArgumentError if an invalid +unit+ was given.
189
+ # @return [Hash{Symbol=>Integer|Float}]
164
190
  def balance(unit: Nanook.default_unit)
165
191
  unless Nanook::UNITS.include?(unit)
166
192
  raise ArgumentError.new("Unsupported unit: #{unit}")
@@ -174,57 +200,69 @@ class Nanook
174
200
  end
175
201
  end
176
202
 
177
- # Returns the id of the account.
203
+ # @return [Integer] number of blocks for this account
204
+ def block_count
205
+ rpc(:account_block_count)[:block_count]
206
+ end
207
+
208
+ # The id of the account.
209
+ #
210
+ # ==== Example:
211
+ #
212
+ # account.id # => "nano_16u..."
213
+ #
178
214
  # @return [String] the id of the account
179
215
  def id
180
216
  @account
181
217
  end
182
218
 
183
- # Returns a Hash containing information about the account.
219
+ # Information about the account.
184
220
  #
185
- # ==== Example 1
221
+ # ==== Examples:
186
222
  #
187
223
  # account.info
188
224
  #
189
- # ==== Example 1 response
225
+ # Example response:
226
+ #
190
227
  # {
191
- # :id=>"xrb_16u1uufyoig8777y6r8iqjtrw8sg8maqrm36zzcm95jmbd9i9aj5i8abr8u5"
192
- # :balance=>11.439597000000001,
193
- # :block_count=>4
194
- # :frontier=>"2C3C570EA8898443C0FD04A1C385A3E3A8C985AD792635FCDCEBB30ADF6A0570",
195
- # :modified_timestamp=>1520500357,
196
- # :open_block=>"C82376314C387080A753871A32AD70F4168080C317C5E67356F0A62EB5F34FF9",
197
- # :representative_block=>"C82376314C387080A753871A32AD70F4168080C317C5E67356F0A62EB5F34FF9",
228
+ # id: "nano_16u1uufyoig8777y6r8iqjtrw8sg8maqrm36zzcm95jmbd9i9aj5i8abr8u5",
229
+ # balance: 11.439597000000001,
230
+ # block_count: 4,
231
+ # frontier: "2C3C570EA8898443C0FD04A1C385A3E3A8C985AD792635FCDCEBB30ADF6A0570",
232
+ # modified_timestamp: 1520500357,
233
+ # open_block: "C82376314C387080A753871A32AD70F4168080C317C5E67356F0A62EB5F34FF9",
234
+ # representative_block: "C82376314C387080A753871A32AD70F4168080C317C5E67356F0A62EB5F34FF9"
198
235
  # }
199
236
  #
200
- # ==== Example 2
237
+ # Asking for more detail to be returned:
201
238
  #
202
239
  # account.info(detailed: true)
203
240
  #
204
- # ==== Example 2 response
241
+ # Example response:
242
+ #
205
243
  # {
206
- # :id=>"xrb_16u1uufyoig8777y6r8iqjtrw8sg8maqrm36zzcm95jmbd9i9aj5i8abr8u5"
207
- # :balance=>11.439597000000001,
208
- # :block_count=>4,
209
- # :frontier=>"2C3C570EA8898443C0FD04A1C385A3E3A8C985AD792635FCDCEBB30ADF6A0570",
210
- # :modified_timestamp=>1520500357,
211
- # :open_block=>"C82376314C387080A753871A32AD70F4168080C317C5E67356F0A62EB5F34FF9",
212
- # :pending=>0,
213
- # :public_key=>"A82C906460046D230D7D37C6663723DC3EFCECC4B3254EBF45294B66746F4FEF",
214
- # :representative=>"xrb_3pczxuorp48td8645bs3m6c3xotxd3idskrenmi65rbrga5zmkemzhwkaznh",
215
- # :representative_block=>"C82376314C387080A753871A32AD70F4168080C317C5E67356F0A62EB5F34FF9",
216
- # :weight=>0
244
+ # id: "nano_16u1uufyoig8777y6r8iqjtrw8sg8maqrm36zzcm95jmbd9i9aj5i8abr8u5",
245
+ # balance: 11.439597000000001,
246
+ # block_count: 4,
247
+ # frontier: "2C3C570EA8898443C0FD04A1C385A3E3A8C985AD792635FCDCEBB30ADF6A0570",
248
+ # modified_timestamp: 1520500357,
249
+ # open_block: "C82376314C387080A753871A32AD70F4168080C317C5E67356F0A62EB5F34FF9",
250
+ # pending: 0,
251
+ # public_key: "A82C906460046D230D7D37C6663723DC3EFCECC4B3254EBF45294B66746F4FEF",
252
+ # representative: "nano_3pczxuorp48td8645bs3m6c3xotxd3idskrenmi65rbrga5zmkemzhwkaznh",
253
+ # representative_block: "C82376314C387080A753871A32AD70F4168080C317C5E67356F0A62EB5F34FF9",
254
+ # weight: 0
217
255
  # }
218
256
  #
219
257
  # @param detailed [Boolean] (default is false). When +true+, four
220
258
  # additional calls are made to the RPC to return more information
221
259
  # @param unit (see #balance)
222
- # @return [Hash] information about the account containing:
223
- # [+id] The account id
260
+ # @return [Hash{Symbol=>String|Integer|Float}] information about the account containing:
261
+ # [+id+] The account id
224
262
  # [+frontier+] The latest block hash
225
263
  # [+open_block+] The first block in every account's blockchain. When this block was published the account was officially open
226
264
  # [+representative_block+] The block that named the representative for the account
227
- # [+balance+] Amount in {NANO}[https://nano.org/en/faq#what-are-nano-units-]
265
+ # [+balance+] Amount in either NANO or raw (depending on the <tt>unit:</tt> argument)
228
266
  # [+last_modified+] Unix timestamp
229
267
  # [+block_count+] Number of blocks in the account's blockchain
230
268
  #
@@ -267,24 +305,18 @@ class Nanook
267
305
  "#{self.class.name}(id: \"#{id}\", object_id: \"#{"0x00%x" % (object_id << 1)}\")"
268
306
  end
269
307
 
270
- # Returns information about the given account as well as other
308
+ # Information about the given account as well as other
271
309
  # accounts up the ledger. The number of accounts returned is determined
272
310
  # by the <tt>limit:</tt> argument.
273
311
  #
274
- # The information in each Hash is the same as what the
275
- # #info(detailed: false) method returns.
276
- #
277
- # ==== Arguments
278
- #
279
- # [+limit:+] Number of accounts to return in the ledger (default is 1)
280
- #
281
- # ==== Example
312
+ # ==== Example:
282
313
  #
283
314
  # account.ledger(limit: 2)
284
315
  #
285
- # ==== Example response
316
+ # Example response:
317
+ #
286
318
  # {
287
- # :xrb_3c3ek3k8135f6e8qtfy8eruk9q3yzmpebes7btzncccdest8ymzhjmnr196j=>{
319
+ # :nano_3c3ek3k8135f6e8qtfy8eruk9q3yzmpebes7btzncccdest8ymzhjmnr196j=>{
288
320
  # :frontier=>"2C3C570EA8898443C0FD04A1C385A3E3A8C985AD792635FCDCEBB30ADF6A0570",
289
321
  # :open_block=>"C82376314C387080A753871A32AD70F4168080C317C5E67356F0A62EB5F34FF9",
290
322
  # :representative_block=>"C82376314C387080A753871A32AD70F4168080C317C5E67356F0A62EB5F34FF9",
@@ -292,42 +324,67 @@ class Nanook
292
324
  # :modified_timestamp=>1520500357,
293
325
  # :block_count=>4
294
326
  # },
295
- # :xrb_3c3ettq59kijuuad5fnaq35itc9schtr4r7r6rjhmwjbairowzq3wi5ap7h8=>{ ... }
327
+ # :nano_3c3ettq59kijuuad5fnaq35itc9schtr4r7r6rjhmwjbairowzq3wi5ap7h8=>{ ... }
296
328
  # }
297
- def ledger(limit: 1)
298
- rpc(:ledger, count: limit)[:accounts]
329
+ #
330
+ # @param [Integer] limit number of accounts to return in the ledger (default is 1)
331
+ # @param [Time] modified_since return only accounts modified in the local database after this time
332
+ # @param unit (see #balance)
333
+ # @return [Hash{Symbol=>String|Integer}]
334
+ def ledger(limit: 1, modified_since:nil, unit: Nanook.default_unit)
335
+ unless Nanook::UNITS.include?(unit)
336
+ raise ArgumentError.new("Unsupported unit: #{unit}")
337
+ end
338
+
339
+ params = { count: limit }
340
+
341
+ unless modified_since.nil?
342
+ params[:modified_since] = modified_since.to_i
343
+ end
344
+
345
+ response = rpc(:ledger, params)[:accounts]
346
+
347
+ return response if unit == :raw
348
+
349
+ r = response.map do |account_id, l|
350
+ l[:balance] = Nanook::Util.raw_to_NANO(l[:balance])
351
+
352
+ [account_id, l]
353
+ end
354
+
355
+ Hash[r].to_symbolized_hash
299
356
  end
300
357
 
301
- # Returns information about pending blocks (payments) that are
358
+ # Information about pending blocks (payments) that are
302
359
  # waiting to be received by the account.
303
360
  #
304
- # See also the #receive method of this class for how to receive a pending payment.
361
+ # See also the {Nanook::WalletAccount#receive} method for how to
362
+ # receive a pending payment.
305
363
  #
306
364
  # The default response is an Array of block ids.
307
365
  #
308
366
  # With the +detailed:+ argument, the method returns an Array of Hashes,
309
367
  # which contain the source account id, amount pending and block id.
310
368
  #
311
- # ==== Example 1:
369
+ # ==== Examples:
312
370
  #
313
- # account.pending # => ["000D1BAEC8EC208142C99059B393051BAC8380F9B5A2E6B2489A277D81789F3F"]
371
+ # account.pending # => ["000D1BA..."]
314
372
  #
315
- # ==== Example 2:
373
+ # Asking for more detail to be returned:
316
374
  #
317
375
  # account.pending(detailed: true)
318
- # # =>
319
- # # [
320
- # # {
321
- # # :block=>"000D1BAEC8EC208142C99059B393051BAC8380F9B5A2E6B2489A277D81789F3F",
322
- # # :amount=>6,
323
- # # :source=>"xrb_3dcfozsmekr1tr9skf1oa5wbgmxt81qepfdnt7zicq5x3hk65fg4fqj58mbr"
324
- # # },
325
- # # { ... }
326
- # # ]
327
- #
328
- # ==== Example 3:
329
- #
330
- # account.pending(detailed: true, unit: raw).first[:amount] # => 6000000000000000000000000000000
376
+ #
377
+ # Example response:
378
+ #
379
+ # [
380
+ # {
381
+ # block: "000D1BAEC8EC208142C99059B393051BAC8380F9B5A2E6B2489A277D81789F3F",
382
+ # amount: 6,
383
+ # source: "nano_3dcfozsmekr1tr9skf1oa5wbgmxt81qepfdnt7zicq5x3hk65fg4fqj58mbr"
384
+ # },
385
+ # { ... }
386
+ # ]
387
+ #
331
388
  # @param limit [Integer] number of pending blocks to return (default is 1000)
332
389
  # @param detailed [Boolean]return a more complex Hash of pending block information (default is +false+)
333
390
  # @param unit (see #balance)
@@ -358,13 +415,14 @@ class Nanook
358
415
  end
359
416
  end
360
417
 
361
- # Returns the account's weight.
418
+ # The account's weight.
362
419
  #
363
420
  # Weight is determined by the account's balance, and represents
364
421
  # the voting weight that account has on the network. Only accounts
365
422
  # with greater than 256 weight can vote.
366
423
  #
367
424
  # ==== Example:
425
+ #
368
426
  # account.weight # => 0
369
427
  #
370
428
  # @return [Integer] the account's weight