nanook 3.1.0 → 4.0.0

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
2
  SHA256:
3
- metadata.gz: fd2278329714fcd1e6778b5cbc85791f67e4fc835a7e6210abedc698f677645f
4
- data.tar.gz: 074e3d14d1692038016973492c6d7475815e2b67f670ddba8d0e118e6fcbedfa
3
+ metadata.gz: c6a8de62127c895a74b956a2b24a7619e526ef0050c34639edd4eeec20bac187
4
+ data.tar.gz: a2ac4e3e26838a04e33156d38a892623fa2ba893ca1ec02707caf07c72a1b955
5
5
  SHA512:
6
- metadata.gz: 2fb9465657aa458639093281da94821ce9b07731c4b44309fa3372416ec2fa928a77e3d1c8260f4013a21cd51335c92d1cf58aa48cdbb0f5629796b46977c814
7
- data.tar.gz: 3d518590b7433bdce1696ccc5d23fa2fc93d60101649ccb954de813493e51f2535f6d85bc91d841bdb7f54539c6f7f20444daaea877562b240191354bd37d3d9
6
+ metadata.gz: f6bc6c116aac59f7f3a124ef8e4c6db3377fb8d4c944be240576260ff985503c0b05d131b2f644abbc655ba2c741e057c9344654993dad9ed20f03622a604485
7
+ data.tar.gz: a2bb0a64d566613fa5c7e29ff454afd95491ccaac3233b1647f90c0d89afeac83d921748327ea417747e8675afd1f4978ca1ce9f1cb39603b50f3870a6dabaa0
data/CHANGELOG.md CHANGED
@@ -1,10 +1,25 @@
1
1
  # Changelog
2
+
2
3
  All notable changes to this project will be documented in this file.
3
4
 
4
5
  The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
5
6
  and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
6
7
 
7
- ## 3.1.0
8
+ ## 4.0.0 (v22 compatible)
9
+
10
+ ### Changed
11
+
12
+ - `Node#bootstrap_lazy` now returns the v22 node response of a `Hash` of keys `started` and `key_inserted` with boolean values.
13
+ - `Node#bootstrap_any` now optionally takes `account` argument.
14
+ - `Account#pending` and `WalletAccount#pending`:
15
+ - now optionally takes `sorted` argument.
16
+ - now optionally takes `allow_unconfirmed` argument.
17
+ - `Account#balance` and `WalletAccount#balance` now optionally takes `allow_unconfirmed` argument.
18
+ - `Account#info` and `WalletAccount#info` now optionally takes `allow_unconfirmed` argument.
19
+ - `Block#pending?` now optionally takes `allow_unconfirmed` argument.
20
+ - `Wallet#pending` now optionally takes `allow_unconfirmed` argument.
21
+
22
+ ## 3.1.0 (v21 compatible)
8
23
 
9
24
  ### Added
10
25
 
@@ -15,13 +30,13 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
15
30
 
16
31
  - `Block.chain` and `Block.successors` no longer return the Block itself in the response.
17
32
 
18
- ## 3.0.1
33
+ ## 3.0.1 (v21 compatible)
19
34
 
20
35
  ### Fixed
21
36
 
22
37
  - Fix `Block#type` being `nil` when RPC doesn't return a `subtype`.
23
38
 
24
- ## 3.0.0
39
+ ## 3.0.0 (v21 compatible)
25
40
 
26
41
  ### Removed
27
42
 
data/README.md CHANGED
@@ -124,11 +124,11 @@ Read the [Using Nanook](https://github.com/lukes/nanook/wiki/Using-nanook) page
124
124
 
125
125
  ## All commands
126
126
 
127
- Below is a quick reference list of commands. See the [full Nanook documentation](https://lukes.github.io/nanook/3.1.0/) for a searchable detailed description of every class and method, what the arguments mean, and example responses.
127
+ Below is a quick reference list of commands. See the [full Nanook documentation](https://lukes.github.io/nanook/4.0.0/) for a searchable detailed description of every class and method, what the arguments mean, and example responses.
128
128
 
129
129
  ### Wallets
130
130
 
131
- See the [full documentation for Nanook::Wallet](https://lukes.github.io/nanook/3.1.0/Nanook/Wallet.html) for a detailed description of each method and example responses.
131
+ See the [full documentation for Nanook::Wallet](https://lukes.github.io/nanook/4.0.0/Nanook/Wallet.html) for a detailed description of each method and example responses.
132
132
 
133
133
  #### Create wallet:
134
134
 
@@ -158,6 +158,7 @@ wallet.pay(from: your_account_id, to: recipient_account_id, amount: 2, id: uniqu
158
158
  wallet.pending
159
159
  wallet.pending(limit: 1)
160
160
  wallet.pending(detailed: true)
161
+ wallet.pending(allow_unconfirmed: true)
161
162
  wallet.pending(unit: :raw)
162
163
  wallet.receive(into: account_id)
163
164
  wallet.receive(pending_block_id, into: account_id)
@@ -212,14 +213,17 @@ Any account on the Nano network that is known by your node can be initialized th
212
213
  account = nanook.account(account_id)
213
214
  ```
214
215
 
215
- See the [full documentation for Nanook::Account](https://lukes.github.io/nanook/3.1.0/Nanook/Account.html) for a detailed description of each method and example responses.
216
+ See the [full documentation for Nanook::Account](https://lukes.github.io/nanook/4.0.0/Nanook/Account.html) for a detailed description of each method and example responses.
216
217
 
217
218
  ```ruby
218
219
  account.balance
220
+ account.balance(allow_unconfirmed: true)
219
221
  account.balance(unit: :raw)
220
222
  account.pending
221
223
  account.pending(limit: 1)
224
+ account.pending(allow_unconfirmed: true)
222
225
  account.pending(detailed: true)
226
+ account.pending(sorted: true)
223
227
  account.pending(unit: :raw)
224
228
 
225
229
  account.blocks
@@ -234,6 +238,7 @@ account.history(limit: 1)
234
238
  account.history(unit: :raw)
235
239
  account.history(sort: :desc)
236
240
  account.info
241
+ account.info(allow_unconfirmed: true)
237
242
  account.info(unit: :raw)
238
243
  account.last_modified_at
239
244
  account.ledger
@@ -260,7 +265,7 @@ account = wallet.account(account_id)
260
265
 
261
266
  As well as the following methods, all methods of [regular accounts](#working-with-any-account) can also be called.
262
267
 
263
- See the [full documentation for Nanook::WalletAccount](https://lukes.github.io/nanook/3.1.0/Nanook/WalletAccount.html) for a detailed description of each method and example responses.
268
+ See the [full documentation for Nanook::WalletAccount](https://lukes.github.io/nanook/4.0.0/Nanook/WalletAccount.html) for a detailed description of each method and example responses.
264
269
 
265
270
  ```ruby
266
271
  account.pay(to: recipient_account_id, amount: 2, id: unique_id)
@@ -275,7 +280,7 @@ account.destroy
275
280
 
276
281
  ### Blocks
277
282
 
278
- See the [full documentation for Nanook::Block](https://lukes.github.io/nanook/3.1.0/Nanook/Block.html) for a detailed description of each method and example responses.
283
+ See the [full documentation for Nanook::Block](https://lukes.github.io/nanook/4.0.0/Nanook/Block.html) for a detailed description of each method and example responses.
279
284
 
280
285
  ```ruby
281
286
  block = nanook.block(block_id)
@@ -303,6 +308,7 @@ block.info(unit: :raw)
303
308
  block.next
304
309
  block.open?
305
310
  block.pending?
311
+ block.pending?(allow_unconfirmed: true)
306
312
  block.previous
307
313
  block.receive?
308
314
  block.representative
@@ -324,7 +330,7 @@ block.valid_work?(work)
324
330
 
325
331
  ### Managing your nano node
326
332
 
327
- See the [full documentation for Nanook::Node](https://lukes.github.io/nanook/3.1.0/Nanook/Node.html) for a detailed description of each method and example responses.
333
+ See the [full documentation for Nanook::Node](https://lukes.github.io/nanook/4.0.0/Nanook/Node.html) for a detailed description of each method and example responses.
328
334
 
329
335
  ```ruby
330
336
  node = nanook.node
@@ -333,6 +339,7 @@ node.account_count
333
339
  node.block_count
334
340
  node.bootstrap(address: "::ffff:138.201.94.249", port: 7075)
335
341
  node.bootstrap_any
342
+ node.bootstrap_any(account: account_id)
336
343
  node.bootstrap_lazy(block_id)
337
344
  node.bootstrap_lazy(block_id, force: true)
338
345
  node.confirmation_quorum
data/lib/nanook.rb CHANGED
@@ -97,7 +97,7 @@ class Nanook
97
97
  # @param key [String] a private key
98
98
  # @return [Nanook::PrivateKey]
99
99
  def private_key(key = nil)
100
- as_private_key(key)
100
+ as_private_key(key, allow_blank: true)
101
101
  end
102
102
 
103
103
  # Returns a new instance of {Nanook::PublicKey}.
@@ -170,8 +170,8 @@ class Nanook
170
170
  # @return [Nanook::WorkPeer]
171
171
  def network_telemetry
172
172
  response = call_rpc(:telemetry, _coerce: Hash)
173
- response[:genesis_block] = as_block(response[:genesis_block]) if response[:genesis_block]
174
- response[:timestamp] = as_time(response[:timestamp]) if response[:timestamp]
173
+ response[:genesis_block] = as_block(response[:genesis_block])
174
+ response[:timestamp] = as_time(response[:timestamp])
175
175
  response
176
176
  end
177
177
 
@@ -209,7 +209,7 @@ class Nanook
209
209
  # @return [Nanook::Account] Representative of the account. Can be nil.
210
210
  def representative
211
211
  representative = rpc(:account_representative, _access: :representative)
212
- as_account(representative) if representative
212
+ as_account(representative)
213
213
  end
214
214
 
215
215
  # The account's balance, including pending (unreceived payments).
@@ -241,7 +241,10 @@ class Nanook
241
241
  # balance: 2000000000000000000000000000000,
242
242
  # pending: 1100000000000000000000000000000
243
243
  # }
244
- #
244
+ # @param allow_unconfirmed [Boolean] +false+ by default. When +false+, +balance+
245
+ # will only include blocks on this account that have already been confirmed
246
+ # and +pending+ will only include incoming send blocks that have already been
247
+ # confirmed on the sending account.
245
248
  # @param unit [Symbol] default is {Nanook.default_unit}.
246
249
  # Must be one of {Nanook::UNITS}.
247
250
  # Represents the unit that the balances will be returned in.
@@ -250,10 +253,14 @@ class Nanook
250
253
  # See {https://docs.nano.org/protocol-design/distribution-and-units/#unit-dividers What are Nano's Units}
251
254
  # @raise [Nanook::NanoUnitError] if `unit` is invalid
252
255
  # @return [Hash{Symbol=>Integer|Float}]
253
- def balance(unit: Nanook.default_unit)
256
+ def balance(allow_unconfirmed: false, unit: Nanook.default_unit)
254
257
  validate_unit!(unit)
255
258
 
256
- rpc(:account_balance).tap do |r|
259
+ params = {
260
+ include_only_confirmed: !allow_unconfirmed
261
+ }
262
+
263
+ rpc(:account_balance, params).tap do |r|
257
264
  if unit == :nano
258
265
  r[:balance] = raw_to_NANO(r[:balance])
259
266
  r[:pending] = raw_to_NANO(r[:pending])
@@ -304,6 +311,8 @@ class Nanook
304
311
  # }
305
312
  #
306
313
  # @param unit (see #balance)
314
+ # @param allow_unconfirmed [Boolean] +false+ by default. When +false+ only confirmed +balance+
315
+ # +pending+, and +representative+ values are returned.
307
316
  # @return [Hash{Symbol=>String|Integer|Float|Nanook::Account|Nanook::Block|Time}] information about the account containing:
308
317
  # [+id+] The account id
309
318
  # [+frontier+] The latest {Nanook::Block}
@@ -319,19 +328,36 @@ class Nanook
319
328
  # [+weight+] See {#weight}
320
329
  #
321
330
  # @raise [Nanook::NanoUnitError] if `unit` is invalid
322
- def info(unit: Nanook.default_unit)
331
+ def info(allow_unconfirmed: false, unit: Nanook.default_unit)
323
332
  validate_unit!(unit)
324
333
 
325
- response = rpc(:account_info, representative: true, weight: true, pending: true)
334
+ params = {
335
+ representative: true,
336
+ weight: true,
337
+ pending: true,
338
+ include_confirmed: !allow_unconfirmed
339
+ }
340
+
341
+ response = rpc(:account_info, params)
326
342
  response.merge!(id: @account)
327
- response[:frontier] = as_block(response[:frontier]) if response[:frontier]
328
- response[:open_block] = as_block(response[:open_block]) if response[:open_block]
329
- response[:representative_block] = as_block(response[:representative_block]) if response[:representative_block]
330
- response[:representative] = as_account(response[:representative]) if response[:representative]
331
- if response[:confirmation_height_frontier]
332
- response[:confirmation_height_frontier] = as_block(response[:confirmation_height_frontier])
343
+
344
+ # The RPC returned confirmed data when the `include_confirmed: true`
345
+ # has been passed. Normalize this data to the same keys as when
346
+ # unconfirmed data can be returned.
347
+ unless allow_unconfirmed
348
+ response[:balance] = response.delete(:confirmed_balance)
349
+ response[:pending] = response.delete(:confirmed_pending)
350
+ response[:representative] = response.delete(:confirmed_representative)
351
+ response[:frontier] = response.delete(:confirmed_frontier)
352
+ response[:confirmation_height] = response.delete(:confirmed_height)
333
353
  end
354
+
355
+ response[:frontier] = as_block(response[:frontier])
356
+ response[:open_block] = as_block(response[:open_block])
357
+ response[:representative_block] = as_block(response[:representative_block])
358
+ response[:representative] = as_account(response[:representative])
334
359
  response[:last_modified_at] = as_time(response.delete(:modified_timestamp))
360
+ response[:confirmation_height_frontier] = as_block(response[:confirmation_height_frontier])
335
361
 
336
362
  if unit == :nano
337
363
  response.merge!(
@@ -341,7 +367,7 @@ class Nanook
341
367
  )
342
368
  end
343
369
 
344
- response
370
+ response.compact
345
371
  end
346
372
 
347
373
  # @return [String]
@@ -402,10 +428,10 @@ class Nanook
402
428
  end
403
429
 
404
430
  ledger[:last_modified_at] = as_time(ledger.delete(:modified_timestamp))
405
- ledger[:representative] = as_account(ledger[:representative]) if ledger[:representative]
406
- ledger[:representative_block] = as_block(ledger[:representative_block]) if ledger[:representative_block]
407
- ledger[:open_block] = as_block(ledger[:open_block]) if ledger[:open_block]
408
- ledger[:frontier] = as_block(ledger[:frontier]) if ledger[:frontier]
431
+ ledger[:representative] = as_account(ledger[:representative])
432
+ ledger[:representative_block] = as_block(ledger[:representative_block])
433
+ ledger[:open_block] = as_block(ledger[:open_block])
434
+ ledger[:frontier] = as_block(ledger[:frontier])
409
435
 
410
436
  [as_account(account_id), ledger]
411
437
  end
@@ -444,17 +470,22 @@ class Nanook
444
470
  # ]
445
471
  #
446
472
  # @param limit [Integer] number of pending blocks to return (default is 1000)
447
- # @param detailed [Boolean]return a more complex Hash of pending block information (default is +false+)
473
+ # @param detailed [Boolean] return a more complex Hash of pending block information (default is +false+)
474
+ # @param allow_unconfirmed [Boolean] +false+ by default. When +false+ only returns block which have their confirmation
475
+ # height set or are undergoing confirmation height processing.
448
476
  # @param unit (see #balance)
477
+ # @param sorted [Boolean] false by default. Additionally sorts the blocks by their amounts in descending order.
449
478
  #
450
479
  # @return [Array<Nanook::Block>]
451
480
  # @return [Array<Hash{Symbol=>Nanook::Block|Nanook::Account|Integer}>]
452
481
  # @raise [Nanook::NanoUnitError] if `unit` is invalid
453
- def pending(limit: 1000, detailed: false, unit: Nanook.default_unit)
482
+ def pending(limit: 1000, detailed: false, allow_unconfirmed: false, unit: Nanook.default_unit, sorted: false)
454
483
  validate_unit!(unit)
455
484
 
456
485
  params = {
457
486
  count: limit,
487
+ sorting: sorted,
488
+ include_only_confirmed: !allow_unconfirmed,
458
489
  _access: :blocks,
459
490
  _coerce: (detailed ? Hash : Array)
460
491
  }
data/lib/nanook/block.rb CHANGED
@@ -82,7 +82,7 @@ class Nanook
82
82
  #
83
83
  # @param limit [Integer] maximum number of block hashes to return (default is 1000)
84
84
  # @param offset [Integer] return the account chain block hashes offset by the specified number of blocks (default is 0)
85
- def chain(limit: 1000, offset: 0)
85
+ def ancestors(limit: 1000, offset: 0)
86
86
  # The RPC includes this block in its response, and Nanook will remove it from the results.
87
87
  # Increment the limit by 1 to account for this (a limit of -1 is valid and means no limit).
88
88
  limit += 1 if limit > 0
@@ -96,7 +96,7 @@ class Nanook
96
96
  response = rpc(:chain, :block, params)[1..].to_a
97
97
  response.map { |block| as_block(block) }
98
98
  end
99
- alias ancestors chain
99
+ alias chain ancestors # `chain` is the RPC command name
100
100
 
101
101
  # Request confirmation for a block from online representative nodes.
102
102
  # Will return immediately with a boolean to indicate if the request for
@@ -222,9 +222,17 @@ class Nanook
222
222
  #
223
223
  # block.pending? #=> false
224
224
  #
225
+ # @param allow_unconfirmed [Boolean] +false+ by default. When +false+,
226
+ # will only include blocks which have their confirmation height set
227
+ # or are undergoing confirmation height processing.
225
228
  # @return [Boolean] signalling if the block is a pending block.
226
- def pending?
227
- rpc(:pending_exists, :hash, _access: :exists) == 1
229
+ def pending?(allow_unconfirmed: false)
230
+ params = {
231
+ include_only_confirmed: !allow_unconfirmed,
232
+ _access: :exists
233
+ }
234
+
235
+ rpc(:pending_exists, :hash, params) == 1
228
236
  end
229
237
 
230
238
  # Returns an Array of block hashes in the account chain from (but not including) this block up to +count+
@@ -242,7 +250,7 @@ class Nanook
242
250
  # @param offset [Integer] return the account chain block hashes offset
243
251
  # by the specified number of blocks (default is 0)
244
252
  # @return [Array<Nanook::Block>] blocks in the account chain ending at this block
245
- def successors(limit: 1000, offset: 0)
253
+ def descendants(limit: 1000, offset: 0)
246
254
  # The RPC includes this block in its response, and Nanook will remove it from the results.
247
255
  # Increment the limit by 1 to account for this (a limit of -1 is valid and means no limit).
248
256
  limit += 1 if limit > 0
@@ -257,7 +265,7 @@ class Nanook
257
265
  response = rpc(:successors, :block, params)[1..].to_a
258
266
  response.map { |block| as_block(block) }
259
267
  end
260
- alias descendants successors
268
+ alias successors descendants # `successors` is the RPC command name
261
269
 
262
270
  # Returns the {Nanook::Account} of the block representative.
263
271
  #
@@ -513,11 +521,11 @@ class Nanook
513
521
  response[:type] = subtype
514
522
  end
515
523
 
516
- response[:account] = as_account(response[:account]) if response[:account]
517
- response[:representative] = as_account(response[:representative]) if response[:representative]
518
- response[:previous] = as_block(response[:previous]) if response[:previous]
519
- response[:link] = as_block(response[:link]) if response[:link]
520
- response[:link_as_account] = as_account(response[:link_as_account]) if response[:link_as_account]
524
+ response[:account] = as_account(response[:account])
525
+ response[:representative] = as_account(response[:representative])
526
+ response[:previous] = as_block(response[:previous])
527
+ response[:link] = as_block(response[:link])
528
+ response[:link_as_account] = as_account(response[:link_as_account])
521
529
  response[:local_timestamp] = as_time(response[:local_timestamp])
522
530
  response[:last_modified_at] = as_time(response[:last_modified_at])
523
531
 
data/lib/nanook/node.rb CHANGED
@@ -79,19 +79,41 @@ class Nanook
79
79
 
80
80
  # Initialize multi-connection bootstrap to random peers
81
81
  #
82
+ # @param account [Nanook::Account] False by default. Manually force closing
83
+ # of all current bootstraps
82
84
  # @return [Boolean] indicating if the action was successful
83
- def bootstrap_any
84
- rpc(:bootstrap_any).key?(:success)
85
+ def bootstrap_any(account: nil)
86
+ params = {
87
+ account: account
88
+ }.compact
89
+
90
+ rpc(:bootstrap_any, params).key?(:success)
85
91
  end
86
92
 
87
- # Initialize lazy bootstrap with given block hash
93
+ # Initialize lazy bootstrap with given block hash.
94
+ # Response includes whether new election was started and whether a
95
+ # new lazy key_inserted was successful.
96
+ #
97
+ # ==== Example:
98
+ #
99
+ # node.bootstrap_lazy
100
+ #
101
+ # Example response:
102
+ #
103
+ # {
104
+ # "started": true,
105
+ # "key_inserted": false
106
+ # }
88
107
  #
89
108
  # @param hash [String]
90
109
  # @param force [Boolean] False by default. Manually force closing
91
110
  # of all current bootstraps
92
- # @return [Boolean] indicating if the action was successful
111
+ # @return [Hash{Symbol=>Boolean}] indicating if the action was successful
93
112
  def bootstrap_lazy(hash, force: false)
94
- rpc(:bootstrap_lazy, hash: hash, force: force, _access: :started) == 1
113
+ response = rpc(:bootstrap_lazy, hash: hash, force: force)
114
+ values = response.map { |k, v| [k, v == 1] }
115
+
116
+ Hash[values]
95
117
  end
96
118
 
97
119
  # Returns information about node elections settings and observed network state:
@@ -110,12 +132,12 @@ class Nanook
110
132
  # Example response:
111
133
  #
112
134
  # {
113
- # "quorum_delta": 43216377.43025059,
114
- # "online_weight_quorum_percent": 50,
115
- # "online_weight_minimum": 60000000.0",
116
- # "online_stake_total": 86432754.86050119,
117
- # "peers_stake_total": 84672338.52479072,
118
- # "peers_stake_required": 60000000.0"
135
+ # quorum_delta: 43216377.43025059,
136
+ # online_weight_quorum_percent: 50,
137
+ # online_weight_minimum: 60000000.0,
138
+ # online_stake_total: 86432754.86050119,
139
+ # peers_stake_total: 84672338.52479072,
140
+ # peers_stake_required: 60000000.0
119
141
  # }
120
142
  #
121
143
  # @return [Hash{Symbol=>String|Integer}]
@@ -136,6 +158,9 @@ class Nanook
136
158
  response.compact
137
159
  end
138
160
 
161
+ # Note: This RPC call is deprecated as of v22 of the node software.
162
+ # https://docs.nano.org/releases/release-v22-0/
163
+ #
139
164
  # Returns the difficulty values (16 hexadecimal digits string, 64 bit)
140
165
  # for the minimum required on the network (network_minimum) as well
141
166
  # as the current active difficulty seen on the network (network_current,
@@ -276,12 +301,12 @@ class Nanook
276
301
  }
277
302
 
278
303
  response = rpc(:unchecked, params).map do |block, info|
279
- info[:account] = as_account(info[:account]) if info[:account]
280
- info[:link_as_account] = as_account(info[:link_as_account]) if info[:link_as_account]
281
- info[:representative] = as_account(info[:representative]) if info[:representative]
282
- info[:previous] = as_block(info[:previous]) if info[:previous]
283
- info[:link] = as_block(info[:link]) if info[:link]
284
- info[:balance] = raw_to_NANO(info[:balance]) if unit == :nano && info[:balance]
304
+ info[:account] = as_account(info[:account])
305
+ info[:link_as_account] = as_account(info[:link_as_account])
306
+ info[:representative] = as_account(info[:representative])
307
+ info[:previous] = as_block(info[:previous])
308
+ info[:link] = as_block(info[:link])
309
+ info[:balance] = raw_to_NANO(info[:balance]) if unit == :nano
285
310
 
286
311
  [as_block(block), info]
287
312
  end
data/lib/nanook/util.rb CHANGED
@@ -67,23 +67,27 @@ class Nanook
67
67
  end
68
68
 
69
69
  def as_account(account_id)
70
- Nanook::Account.new(@rpc, account_id)
70
+ Nanook::Account.new(@rpc, account_id) if account_id
71
71
  end
72
72
 
73
- def as_wallet_account(account_id)
73
+ def as_wallet_account(account_id, allow_blank: false)
74
+ return unless account_id || allow_blank
75
+
74
76
  Nanook::WalletAccount.new(@rpc, @wallet, account_id)
75
77
  end
76
78
 
77
79
  def as_block(block_id)
78
- Nanook::Block.new(@rpc, block_id)
80
+ Nanook::Block.new(@rpc, block_id) if block_id
79
81
  end
80
82
 
81
- def as_private_key(key)
83
+ def as_private_key(key, allow_blank: false)
84
+ return unless key || allow_blank
85
+
82
86
  Nanook::PrivateKey.new(@rpc, key)
83
87
  end
84
88
 
85
89
  def as_public_key(key)
86
- Nanook::PublicKey.new(@rpc, key)
90
+ Nanook::PublicKey.new(@rpc, key) if key
87
91
  end
88
92
 
89
93
  def as_time(time)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class Nanook
4
- VERSION = '3.1.0'
4
+ VERSION = '4.0.0'
5
5
  end
data/lib/nanook/wallet.rb CHANGED
@@ -102,7 +102,9 @@ class Nanook
102
102
  # @return [Nanook::WalletAccount]
103
103
  def account(account = nil)
104
104
  check_wallet_required!
105
- as_wallet_account(account)
105
+
106
+ # We `allow_blank` in order to support `WalletAccount#create`.
107
+ as_wallet_account(account, allow_blank: true)
106
108
  end
107
109
 
108
110
  # Array of {Nanook::WalletAccount} instances of accounts in the wallet.
@@ -338,6 +340,8 @@ class Nanook
338
340
  # See also the {#receive} method of this class for how to receive a pending payment.
339
341
  #
340
342
  # @param limit [Integer] number of accounts with pending payments to return (default is 1000)
343
+ # @param allow_unconfirmed [Boolean] +false+ by default. When +false+ only returns block which
344
+ # have their confirmation height set or are undergoing confirmation height processing.
341
345
  # @param detailed [Boolean]return a more complex Hash of pending block information (default is +false+)
342
346
  # @param unit (see Nanook::Account#balance)
343
347
  #
@@ -386,11 +390,12 @@ class Nanook
386
390
  # }
387
391
  #
388
392
  # @raise [Nanook::NanoUnitError] if `unit` is invalid
389
- def pending(limit: 1000, detailed: false, unit: Nanook.default_unit)
393
+ def pending(limit: 1000, detailed: false, allow_unconfirmed: false, unit: Nanook.default_unit)
390
394
  validate_unit!(unit)
391
395
 
392
396
  params = {
393
397
  count: limit,
398
+ include_only_confirmed: !allow_unconfirmed,
394
399
  _access: :blocks,
395
400
  _coerce: Hash
396
401
  }
@@ -482,7 +487,7 @@ class Nanook
482
487
  # @return [Nanook::Account] Representative account. Can be nil.
483
488
  def default_representative
484
489
  representative = rpc(:wallet_representative, _access: :representative)
485
- as_account(representative) if representative
490
+ as_account(representative)
486
491
  end
487
492
  alias representative default_representative
488
493
 
@@ -570,10 +575,10 @@ class Nanook
570
575
  response = rpc(:wallet_ledger, _access: :accounts, _coerce: Hash)
571
576
 
572
577
  accounts = response.map do |account_id, data|
573
- data[:frontier] = as_block(data[:frontier]) if data[:frontier]
574
- data[:open_block] = as_block(data[:open_block]) if data[:open_block]
575
- data[:representative_block] = as_block(data[:representative_block]) if data[:representative_block]
576
- data[:balance] = raw_to_NANO(data[:balance]) if unit == :nano && data[:balance]
578
+ data[:frontier] = as_block(data[:frontier])
579
+ data[:open_block] = as_block(data[:open_block])
580
+ data[:representative_block] = as_block(data[:representative_block])
581
+ data[:balance] = raw_to_NANO(data[:balance]) if unit == :nano
577
582
  data[:last_modified_at] = as_time(data.delete(:modified_timestamp))
578
583
 
579
584
  [as_account(account_id), data]
@@ -21,7 +21,7 @@ class Nanook
21
21
  extend Forwardable
22
22
  # @!method ==
23
23
  # (see Nanook::Account#==)
24
- # @!method balance(unit: Nanook.default_unit)
24
+ # @!method balance(allow_unconfirmed: false, unit: Nanook.default_unit)
25
25
  # (see Nanook::Account#balance)
26
26
  # @!method block_count
27
27
  # (see Nanook::Account#block_count)
@@ -41,7 +41,7 @@ class Nanook
41
41
  # (see Nanook::Account#history)
42
42
  # @!method id
43
43
  # (see Nanook::Account#id)
44
- # @!method info((detailed: false, unit: Nanook.default_unit)
44
+ # @!method info(allow_unconfirmed: false, detailed: false, unit: Nanook.default_unit)
45
45
  # (see Nanook::Account#info)
46
46
  # @!method last_modified_at
47
47
  # (see Nanook::Account#last_modified_at)
@@ -49,7 +49,7 @@ class Nanook
49
49
  # (see Nanook::Account#ledger)
50
50
  # @!method open_block
51
51
  # (see Nanook::Account#open_block)
52
- # @!method pending(limit: 1000, detailed: false, unit: Nanook.default_unit)
52
+ # @!method pending(limit: 1000, detailed: false, allow_unconfirmed: false, unit: Nanook.default_unit, sorted: false)
53
53
  # (see Nanook::Account#pending)
54
54
  # @!method public_key
55
55
  # (see Nanook::Account#public_key)
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nanook
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.1.0
4
+ version: 4.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Luke Duncalfe
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-05-02 00:00:00.000000000 Z
11
+ date: 2021-05-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '2.2'
19
+ version: 2.2.10
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '2.2'
26
+ version: 2.2.10
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: pry
29
29
  requirement: !ruby/object:Gem::Requirement