nanook 2.1.0 → 2.5.1

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
- 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