nanook 1.0.2 → 2.0.0
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 +4 -4
- data/CHANGELOG.md +37 -3
- data/README.md +40 -10
- data/lib/nanook.rb +70 -16
- data/lib/nanook/account.rb +183 -129
- data/lib/nanook/block.rb +61 -50
- data/lib/nanook/key.rb +1 -1
- data/lib/nanook/node.rb +14 -5
- data/lib/nanook/rpc.rb +6 -6
- data/lib/nanook/util.rb +2 -2
- data/lib/nanook/version.rb +1 -1
- data/lib/nanook/wallet.rb +147 -41
- data/lib/nanook/wallet_account.rb +74 -52
- data/lib/nanook/work_peer.rb +1 -1
- metadata +14 -21
- data/.circleci/config.yml +0 -56
- data/.gitignore +0 -9
- data/.rspec +0 -1
- data/Gemfile +0 -6
- data/Gemfile.lock +0 -65
- data/Rakefile +0 -20
- data/img/qr.png +0 -0
- data/nanook.gemspec +0 -34
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f71938ce617e3ee52fe2fb04cf9eebe97191f5d5
|
4
|
+
data.tar.gz: 210a3c2b1ce7ad7b767c0139eaf5ae153c9e8fda
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 68baffb5984f1509bf4b1e6889b8c378906db8a41c070afc22902fb3369be03ee8b6db36dabb70befd79562f938380b74193a2007b033f6d2d25273871fbaa96
|
7
|
+
data.tar.gz: a6610e8c5d616b48940d4c2837bd0cc6974d84d3b6c20418eb22543719740f353bd4c5c59ef86990dd8fe75b5c0b6c9e1386beb64b505a3784298a4fd77fa24c
|
data/CHANGELOG.md
CHANGED
@@ -4,6 +4,43 @@ 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.0.0
|
8
|
+
|
9
|
+
### Added
|
10
|
+
|
11
|
+
- User can define `Nanook::UNIT = :raw` to set the default unit to `:raw` instead of `:nano`.
|
12
|
+
- `Nanook::Wallet#restore` to create a wallet, change its seed and create x number of accounts.
|
13
|
+
- `Nanook::WalletAccount#create` takes an optional argument to signal
|
14
|
+
how many accounts to create.
|
15
|
+
- New `Nanook::WalletAccount#change_representative` method to change an
|
16
|
+
account's representative.
|
17
|
+
- New `Nanook::Node#account_count` method to return number of known accounts in ledger.
|
18
|
+
- New `Nanook::Node#synchronizing_blocks` method to return information about "unchecked" synchronizing blocks.
|
19
|
+
- New `Nanook::Account#last_modified_at` method.
|
20
|
+
- Added ruby version requirement >= 2.0 to gemspec.
|
21
|
+
|
22
|
+
### Changed
|
23
|
+
- `Nanook::Rpc#inspect` displays full hostname with scheme and port.
|
24
|
+
- `Nanook::Account#new` `account` param is now required.
|
25
|
+
- `Nanook::Account#info` now also returns the `id` of the account.
|
26
|
+
- `Nanook::Account#history` now returns `amount` in NANO by default, takes `unit: :raw` argument to return in raw.
|
27
|
+
- `Nanook::Account#info` now returns `balance` and `pending` in NANO by default, takes `unit: :raw` argument to return in raw.
|
28
|
+
- `Nanook::Account#exists?` now checks for open block.
|
29
|
+
- `Nanook::Account#pending` now takes additional arguments `detailed:` and `unit:`.
|
30
|
+
- `Nanook::Block#account` now returns a `Nanook::Account` instance.
|
31
|
+
- `Nanook::Block#info` now also returns the `id` of the block.
|
32
|
+
- `Nanook::Wallet#accounts` now returns `Nanook::WalletAccount` instances.
|
33
|
+
- `Nanook::Wallet#create` now returns a `Nanook::Wallet` instance.
|
34
|
+
- `Nanook::Wallet#pending` now takes additional arguments `detailed:` and `unit:`.
|
35
|
+
- `Nanook::Wallet#seed` alias method of `#id`.
|
36
|
+
- `Nanook::WalletAccount#create` now returns `Nanook::WalletAccount` instances.
|
37
|
+
- Changed documentation generating tool from rdoc to yard.
|
38
|
+
|
39
|
+
### Fixed
|
40
|
+
- Missing `Nanook#rpc` accessor.
|
41
|
+
- `Nanook::Block#publish` can return false when publish fails.
|
42
|
+
- `Nanook::Block#info` correctly handles `allow_unchecked: true` errors.
|
43
|
+
|
7
44
|
## 1.0.1
|
8
45
|
|
9
46
|
### Fixed
|
@@ -31,6 +68,3 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
|
|
31
68
|
- All pay methods continue to take NANO as the default unit, but can now
|
32
69
|
also take an argument `unit:` which can be set to `:raw` to have the
|
33
70
|
`amount` argument be treated as being in raw instead of NANO.
|
34
|
-
|
35
|
-
|
36
|
-
### Removed
|
data/README.md
CHANGED
@@ -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', "~>
|
14
|
+
gem 'nanook', "~> 2.0"
|
15
15
|
```
|
16
16
|
|
17
17
|
And then execute:
|
@@ -120,17 +120,26 @@ 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/
|
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: expand 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/
|
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.
|
128
128
|
|
129
129
|
#### Create wallet:
|
130
130
|
|
131
131
|
```ruby
|
132
132
|
Nanook.new.wallet.create
|
133
133
|
```
|
134
|
+
#### Restoring a wallet from a seed
|
135
|
+
|
136
|
+
```ruby
|
137
|
+
Nanook.new.wallet.restore(seed)
|
138
|
+
```
|
139
|
+
Optionally also restore the wallet's accounts:
|
140
|
+
```ruby
|
141
|
+
Nanook.new.wallet.restore(seed, accounts: 2)
|
142
|
+
```
|
134
143
|
|
135
144
|
#### Working with a single wallet:
|
136
145
|
|
@@ -142,6 +151,10 @@ wallet.balance(account_break_down: true)
|
|
142
151
|
wallet.balance(unit: :raw)
|
143
152
|
wallet.pay(from: your_account_id, to: recipient_account_id, amount: 2, id: unique_id)
|
144
153
|
wallet.pay(from: your_account_id, to: recipient_account_id, amount: 2, unit: :raw, id: unique_id)
|
154
|
+
wallet.pending
|
155
|
+
wallet.pending(limit: 1)
|
156
|
+
wallet.pending(detailed: true)
|
157
|
+
wallet.pending(unit: :raw)
|
145
158
|
wallet.receive(into: account_id)
|
146
159
|
wallet.receive(pending_block_id, into: account_id)
|
147
160
|
|
@@ -164,6 +177,12 @@ wallet.destroy
|
|
164
177
|
Nanook.new.wallet(wallet_id).account.create
|
165
178
|
```
|
166
179
|
|
180
|
+
#### Create multiple accounts:
|
181
|
+
|
182
|
+
```ruby
|
183
|
+
Nanook.new.wallet(wallet_id).account.create(5)
|
184
|
+
```
|
185
|
+
|
167
186
|
#### Working with a single account:
|
168
187
|
|
169
188
|
```ruby
|
@@ -175,19 +194,25 @@ account.pay(to: recipient_account_id, amount: 2, id: unique_id)
|
|
175
194
|
account.pay(to: recipient_account_id, amount: 2, unit: :raw, id: unique_id)
|
176
195
|
account.pending
|
177
196
|
account.pending(limit: 1)
|
197
|
+
account.pending(detailed: true)
|
198
|
+
account.pending(unit: :raw)
|
178
199
|
account.receive
|
179
200
|
account.receive(pending_block_id)
|
180
201
|
|
181
202
|
account.exists?
|
182
203
|
account.info
|
183
204
|
account.info(detailed: true)
|
205
|
+
account.info(unit: :raw)
|
206
|
+
account.last_modified_at
|
184
207
|
account.ledger
|
185
208
|
account.ledger(limit: 10)
|
186
209
|
account.history
|
187
210
|
account.history(limit: 1)
|
211
|
+
account.history(unit: :raw)
|
188
212
|
account.public_key
|
189
213
|
account.delegators
|
190
214
|
account.representative
|
215
|
+
account.change_representative(new_representative)
|
191
216
|
account.weight
|
192
217
|
|
193
218
|
account.destroy
|
@@ -195,7 +220,7 @@ account.destroy
|
|
195
220
|
|
196
221
|
#### Working with any account (not necessarily in your wallet):
|
197
222
|
|
198
|
-
See the [full documentation for Nanook::Account](https://lukes.github.io/nanook/
|
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.
|
199
224
|
|
200
225
|
```ruby
|
201
226
|
account = Nanook.new.account(account_id)
|
@@ -204,14 +229,19 @@ account.balance
|
|
204
229
|
account.balance(unit: :raw)
|
205
230
|
account.pending
|
206
231
|
account.pending(limit: 1)
|
232
|
+
account.pending(detailed: true)
|
233
|
+
account.pending(unit: :raw)
|
207
234
|
|
208
235
|
account.exists?
|
209
236
|
account.info
|
210
237
|
account.info(detailed: true)
|
238
|
+
account.info(unit: :raw)
|
239
|
+
account.last_modified_at
|
211
240
|
account.ledger
|
212
241
|
account.ledger(limit: 10)
|
213
242
|
account.history
|
214
243
|
account.history(limit: 1)
|
244
|
+
account.history(unit: :raw)
|
215
245
|
account.public_key
|
216
246
|
account.delegators
|
217
247
|
account.representative
|
@@ -220,7 +250,7 @@ account.weight
|
|
220
250
|
|
221
251
|
### Blocks
|
222
252
|
|
223
|
-
See the [full documentation for Nanook::Block](https://lukes.github.io/nanook/
|
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.
|
224
254
|
|
225
255
|
```ruby
|
226
256
|
block = Nanook.new.block(block_id)
|
@@ -250,14 +280,15 @@ block.is_valid_work?(work_id)
|
|
250
280
|
```ruby
|
251
281
|
node = Nanook.new.node
|
252
282
|
|
283
|
+
node.account_count
|
253
284
|
node.block_count
|
254
285
|
node.block_count_type
|
255
286
|
node.bootstrap_any
|
256
287
|
node.bootstrap(address: "::ffff:138.201.94.249", port: 7075)
|
257
|
-
node.frontier_count
|
258
288
|
node.peers
|
259
289
|
node.representatives
|
260
|
-
node.
|
290
|
+
node.synchronizing_blocks
|
291
|
+
node.synchronizing_blocks(limit: 1)
|
261
292
|
node.sync_progress
|
262
293
|
node.synced?
|
263
294
|
node.version
|
@@ -310,15 +341,14 @@ To run the test suite:
|
|
310
341
|
|
311
342
|
bundle exec rspec spec
|
312
343
|
|
313
|
-
To update
|
344
|
+
To update the yard documentation:
|
314
345
|
|
315
|
-
bundle exec rake
|
346
|
+
bundle exec rake yard
|
316
347
|
|
317
348
|
## License
|
318
349
|
|
319
350
|
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
320
351
|
|
321
|
-
|
322
352
|
## Buy me a nano coffee
|
323
353
|
|
324
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!
|
data/lib/nanook.rb
CHANGED
@@ -19,52 +19,106 @@ Dir[File.dirname(__FILE__) + '/nanook/*.rb'].each {|file| require file }
|
|
19
19
|
# Nanook.new("http://ip6-localhost.com:7076", timeout: 600)
|
20
20
|
class Nanook
|
21
21
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
#
|
26
|
-
|
27
|
-
|
28
|
-
#
|
29
|
-
#
|
22
|
+
UNITS = [:raw, :nano]
|
23
|
+
DEFAULT_UNIT = :nano
|
24
|
+
|
25
|
+
# @return [Nanook::Rpc]
|
26
|
+
attr_reader :rpc
|
27
|
+
|
28
|
+
# @return [Symbol] the default unit for amounts to be in.
|
29
|
+
# will return {DEFAULT_UNIT} unless you define a new constant Nanook::UNIT
|
30
|
+
# (which must be one of {UNITS})
|
31
|
+
def self.default_unit
|
32
|
+
return DEFAULT_UNIT unless defined?(UNIT)
|
33
|
+
|
34
|
+
unless UNITS.include?(UNIT.to_sym)
|
35
|
+
raise Nanook::Error.new("UNIT #{UNIT} must be one of #{UNITS}")
|
36
|
+
end
|
37
|
+
|
38
|
+
UNIT.to_sym
|
39
|
+
end
|
40
|
+
|
41
|
+
# Returns a new instance of {Nanook}.
|
30
42
|
#
|
43
|
+
# ==== Examples:
|
44
|
+
# Connecting to http://localhost:7076 with the default timeout of 600s:
|
45
|
+
# Nanook.new
|
46
|
+
# Setting a custom timeout:
|
31
47
|
# Nanook.new(timeout: 600)
|
48
|
+
# Connecting to a custom RPC host and setting a timeout:
|
32
49
|
# Nanook.new("http://ip6-localhost.com:7076", timeout: 600)
|
50
|
+
#
|
51
|
+
# @param uri [String] default is {Nanook::Rpc::DEFAULT_URI}. The RPC host to connect to
|
52
|
+
# @param timeout [Integer] default is {Nanook::Rpc::DEFAULT_TIMEOUT}. Connection timeout in number of seconds
|
33
53
|
def initialize(uri=Nanook::Rpc::DEFAULT_URI, timeout:Nanook::Rpc::DEFAULT_TIMEOUT)
|
34
54
|
@rpc = Nanook::Rpc.new(uri, timeout: timeout)
|
35
55
|
end
|
36
56
|
|
37
|
-
|
38
|
-
# Returns a Nanook::Account instance.
|
57
|
+
# Returns a new instance of {Nanook::Account}.
|
39
58
|
#
|
40
|
-
#
|
59
|
+
# ==== Example:
|
60
|
+
# account = Nanook.new.account("xrb_3e3j5tkog48pnny9dmfzj1r16pg8t1e76dz5tmac6iq689wyjfpi00000000")
|
41
61
|
#
|
42
|
-
#
|
43
|
-
#
|
44
|
-
def account(account
|
62
|
+
# @param account [String] the id of the account you want to work with
|
63
|
+
# @return [Nanook::Account]
|
64
|
+
def account(account)
|
45
65
|
Nanook::Account.new(@rpc, account)
|
46
66
|
end
|
47
67
|
|
48
|
-
|
68
|
+
# Returns a new instance of {Nanook::Block}.
|
69
|
+
#
|
70
|
+
# ==== Example:
|
71
|
+
# block = Nanook.new.block("FBF8B0E6623A31AB528EBD839EEAA91CAFD25C12294C46754E45FD017F7939EB")
|
72
|
+
#
|
73
|
+
# @param block [String] the id/hash of the block you want to work with
|
74
|
+
# @return [Nanook::Block]
|
75
|
+
def block(block)
|
49
76
|
Nanook::Block.new(@rpc, block)
|
50
77
|
end
|
51
78
|
|
52
|
-
|
79
|
+
# @return [String]
|
80
|
+
def inspect
|
53
81
|
"#{self.class.name}(rpc: #{@rpc.inspect}, object_id: \"#{"0x00%x" % (object_id << 1)}\")"
|
54
82
|
end
|
55
83
|
|
84
|
+
# Returns a new instance of {Nanook::Key}.
|
85
|
+
#
|
86
|
+
# ==== Example:
|
87
|
+
# key = Nanook.new.key("3068BB1CA04525BB0E416C485FE6A67FD52540227D267CC8B6E8DA958A7FA039")
|
88
|
+
#
|
89
|
+
# @param key [String] a private key
|
90
|
+
# @return [Nanook::Key]
|
56
91
|
def key(key=nil)
|
57
92
|
Nanook::Key.new(@rpc, key)
|
58
93
|
end
|
59
94
|
|
95
|
+
# Returns a new instance of {Nanook::Node}.
|
96
|
+
#
|
97
|
+
# ==== Example:
|
98
|
+
# node = Nanook.new.node
|
99
|
+
#
|
100
|
+
# @return [Nanook::Node]
|
60
101
|
def node
|
61
102
|
Nanook::Node.new(@rpc)
|
62
103
|
end
|
63
104
|
|
105
|
+
# Returns a new instance of {Nanook::Wallet}.
|
106
|
+
#
|
107
|
+
# ==== Example:
|
108
|
+
# wallet = Nanook.new.wallet("000D1BAEC8EC208142C99059B393051BAC8380F9B5A2E6B2489A277D81789F3F")
|
109
|
+
#
|
110
|
+
# @param wallet [String] the id of the wallet you want to work with
|
111
|
+
# @return [Nanook::Wallet]
|
64
112
|
def wallet(wallet=nil)
|
65
113
|
Nanook::Wallet.new(@rpc, wallet)
|
66
114
|
end
|
67
115
|
|
116
|
+
# Returns a new instance of {Nanook::WorkPeer}.
|
117
|
+
#
|
118
|
+
# ==== Example:
|
119
|
+
# work_peers = Nanook.new.work_peers
|
120
|
+
#
|
121
|
+
# @return [Nanook::WorkPeer]
|
68
122
|
def work_peers
|
69
123
|
Nanook::WorkPeer.new(@rpc)
|
70
124
|
end
|
data/lib/nanook/account.rb
CHANGED
@@ -5,7 +5,7 @@ class Nanook
|
|
5
5
|
#
|
6
6
|
# === Initializing
|
7
7
|
#
|
8
|
-
# Initialize this class through the convenient Nanook#account method:
|
8
|
+
# Initialize this class through the convenient {Nanook#account} method:
|
9
9
|
#
|
10
10
|
# nanook = Nanook.new
|
11
11
|
# account = nanook.account("xrb_...")
|
@@ -21,107 +21,143 @@ class Nanook
|
|
21
21
|
@account = account
|
22
22
|
end
|
23
23
|
|
24
|
-
#
|
24
|
+
# Returns information about this account's delegators.
|
25
|
+
# === Example response:
|
25
26
|
# {
|
26
|
-
#
|
27
|
-
#
|
27
|
+
# :xrb_13bqhi1cdqq8yb9szneoc38qk899d58i5rcrgdk5mkdm86hekpoez3zxw5sd=>500000000000000000000000000000000000,
|
28
|
+
# :xrb_17k6ug685154an8gri9whhe5kb5z1mf5w6y39gokc1657sh95fegm8ht1zpn=>961647970820730000000000000000000000
|
28
29
|
# }
|
30
|
+
#
|
31
|
+
# @return [Hash{Symbol=>String}] Delegators
|
29
32
|
def delegators
|
30
|
-
account_required!
|
31
33
|
rpc(:delegators)[:delegators]
|
32
34
|
end
|
33
35
|
|
34
|
-
# Returns a boolean indicating if account
|
35
|
-
#
|
36
|
+
# Returns a boolean indicating if the account exists.
|
37
|
+
#
|
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.
|
41
|
+
#
|
42
|
+
# The reliability of this check depends on the node host having
|
36
43
|
# synchronized itself with most of the blocks on the nano network,
|
37
|
-
# otherwise you may get
|
38
|
-
# synchronization is particular low
|
44
|
+
# otherwise you may get +false+ when the account does exist.
|
45
|
+
# You can check if a node's synchronization is particular low
|
46
|
+
# using {Nanook::Node#sync_progress}.
|
39
47
|
#
|
40
|
-
#
|
41
|
-
# true
|
48
|
+
# @return [Boolean] Indicates if this account exists in the nano network
|
42
49
|
def exists?
|
43
|
-
|
44
|
-
response
|
45
|
-
!response.empty? && response[:valid] == 1
|
50
|
+
response = rpc(:account_info)
|
51
|
+
!response.empty? && !response[:open_block].nil?
|
46
52
|
end
|
47
53
|
|
48
54
|
# Returns an account's history of send and receive payments.
|
49
|
-
# Amounts are in {raw}[https://nano.org/en/faq#what-are-nano-units-].
|
50
|
-
#
|
51
|
-
# ==== Arguments
|
52
55
|
#
|
53
|
-
#
|
54
|
-
# items to return (default is 1000)
|
55
|
-
#
|
56
|
-
# ==== Example
|
56
|
+
# ==== Example:
|
57
57
|
#
|
58
58
|
# account.history
|
59
59
|
# account.history(limit: 1)
|
60
60
|
#
|
61
|
-
# ==== Example response
|
61
|
+
# ==== Example response:
|
62
62
|
# [
|
63
63
|
# {
|
64
64
|
# :type=>"send",
|
65
65
|
# :account=>"xrb_1kdc5u48j3hr5r7eof9iao47szqh81ndqgq5e5hrsn1g9a3sa4hkkcotn3uq",
|
66
|
-
# :amount=>
|
66
|
+
# :amount=>2,
|
67
67
|
# :hash=>"2C3C570EA8898443C0FD04A1C385A3E3A8C985AD792635FCDCEBB30ADF6A0570"
|
68
|
-
# }
|
68
|
+
# }
|
69
|
+
# ]
|
70
|
+
# ==== Example:
|
71
|
+
#
|
72
|
+
# account.history
|
73
|
+
# account.history(unit: :raw)
|
74
|
+
#
|
75
|
+
# ==== Example response:
|
76
|
+
# [
|
69
77
|
# {
|
70
|
-
# :type=>"
|
71
|
-
# :account=>"
|
72
|
-
# :amount=>
|
73
|
-
# :hash=>"
|
78
|
+
# :type=>"send",
|
79
|
+
# :account=>"xrb_1kdc5u48j3hr5r7eof9iao47szqh81ndqgq5e5hrsn1g9a3sa4hkkcotn3uq",
|
80
|
+
# :amount=>2000000000000000000000000000000,
|
81
|
+
# :hash=>"2C3C570EA8898443C0FD04A1C385A3E3A8C985AD792635FCDCEBB30ADF6A0570"
|
74
82
|
# }
|
75
83
|
# ]
|
76
|
-
|
77
|
-
|
78
|
-
|
84
|
+
#
|
85
|
+
# @param limit [Integer] maximum number of history items to return
|
86
|
+
# @param unit (see #balance)
|
87
|
+
# @return [Array<Hash{Symbol=>String}>] the history of send and receive payments for this account
|
88
|
+
def history(limit: 1000, unit: Nanook.default_unit)
|
89
|
+
unless Nanook::UNITS.include?(unit)
|
90
|
+
raise ArgumentError.new("Unsupported unit: #{unit}")
|
91
|
+
end
|
92
|
+
|
93
|
+
response = rpc(:account_history, count: limit)[:history]
|
94
|
+
|
95
|
+
if unit == :raw
|
96
|
+
return response
|
97
|
+
end
|
98
|
+
|
99
|
+
response.map! do |history|
|
100
|
+
history[:amount] = Nanook::Util.raw_to_NANO(history[:amount])
|
101
|
+
history
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
# @return [Time] last modified time of the account in UTC time zone.
|
106
|
+
def last_modified_at
|
107
|
+
response = rpc(:account_info)
|
108
|
+
Time.at(response[:modified_timestamp])
|
79
109
|
end
|
80
110
|
|
81
111
|
# Returns the public key belonging to an account.
|
82
112
|
#
|
83
|
-
# ==== Example response
|
113
|
+
# ==== Example response:
|
84
114
|
# "3068BB1CA04525BB0E416C485FE6A67FD52540227D267CC8B6E8DA958A7FA039"
|
115
|
+
#
|
116
|
+
# @return [String] public key of this account
|
85
117
|
def public_key
|
86
|
-
account_required!
|
87
118
|
rpc(:account_key)[:key]
|
88
119
|
end
|
89
120
|
|
90
|
-
# Returns
|
121
|
+
# Returns the representative account for the account.
|
91
122
|
# Representatives are accounts which cast votes in the case of a
|
92
123
|
# fork in the network.
|
93
124
|
#
|
94
125
|
# ==== Example response
|
95
126
|
#
|
96
127
|
# "xrb_3pczxuorp48td8645bs3m6c3xotxd3idskrenmi65rbrga5zmkemzhwkaznh"
|
128
|
+
#
|
129
|
+
# @return [String] Representative account of this account
|
97
130
|
def representative
|
98
|
-
account_required!
|
99
131
|
rpc(:account_representative)[:representative]
|
100
132
|
end
|
101
133
|
|
102
|
-
# Returns a Hash containing the account's balance.
|
103
|
-
# {raw}[https://nano.org/en/faq#what-are-nano-units-].
|
134
|
+
# Returns a Hash containing the account's balance.
|
104
135
|
#
|
105
|
-
#
|
106
|
-
#
|
136
|
+
# ==== Example response:
|
137
|
+
# {
|
138
|
+
# balance=>2, # Account balance
|
139
|
+
# pending=>1.1 # Amount pending and not yet received by the account
|
140
|
+
# }
|
107
141
|
#
|
108
|
-
# ====
|
142
|
+
# ==== Example balance returned in raw:
|
109
143
|
#
|
110
|
-
#
|
111
|
-
# the balances will be returned in.
|
112
|
-
# Must be either +:nano+ or +:raw+. (Note: this method
|
113
|
-
# interprets +:nano+ as NANO, which is technically Mnano
|
114
|
-
# See {What are Nano's Units}[https://nano.org/en/faq#what-are-nano-units-])
|
144
|
+
# account.balance(unit: :raw)
|
115
145
|
#
|
116
|
-
# ===== Example response
|
117
146
|
# {
|
118
|
-
#
|
119
|
-
#
|
147
|
+
# balance: 2000000000000000000000000000000,
|
148
|
+
# pending: 1100000000000000000000000000000
|
120
149
|
# }
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
150
|
+
#
|
151
|
+
# @param unit [Symbol] default is {Nanook.default_unit}.
|
152
|
+
# Must be one of {Nanook::UNITS}.
|
153
|
+
# Represents the unit that the balances will be returned in.
|
154
|
+
# Note: this method interprets
|
155
|
+
# +:nano+ as NANO, which is technically Mnano
|
156
|
+
# See {https://nano.org/en/faq#what-are-nano-units- What are Nano's Units}
|
157
|
+
#
|
158
|
+
# @raise ArgumentError if an invalid +unit+ was given.
|
159
|
+
def balance(unit: Nanook.default_unit)
|
160
|
+
unless Nanook::UNITS.include?(unit)
|
125
161
|
raise ArgumentError.new("Unsupported unit: #{unit}")
|
126
162
|
end
|
127
163
|
|
@@ -133,35 +169,13 @@ class Nanook
|
|
133
169
|
end
|
134
170
|
end
|
135
171
|
|
136
|
-
# Returns the id of the account
|
172
|
+
# Returns the id of the account.
|
173
|
+
# @return [String] the id of the account
|
137
174
|
def id
|
138
|
-
@
|
175
|
+
@account
|
139
176
|
end
|
140
177
|
|
141
|
-
# Returns a Hash containing
|
142
|
-
# account:
|
143
|
-
#
|
144
|
-
# [+:frontier+] The latest block hash
|
145
|
-
# [+:open_block+] The first block in every account's blockchain. When this block was published the account was officially open
|
146
|
-
# [+:representative_block+] The block that named the representative for the account
|
147
|
-
# [+:balance+] Amount in {NANO}[https://nano.org/en/faq#what-are-nano-units-]
|
148
|
-
# [+:last_modified+] Unix timestamp
|
149
|
-
# [+:block_count+] Number of blocks in the account's blockchain
|
150
|
-
#
|
151
|
-
# When <tt>detailed: true</tt> is passed as an argument, this method
|
152
|
-
# makes four additional calls to the RPC to return more information
|
153
|
-
# about an account:
|
154
|
-
#
|
155
|
-
# [+:weight+] See #weight
|
156
|
-
# [+:pending+] See #balance
|
157
|
-
# [+:representative+] See #representative
|
158
|
-
# [+:public_key+] See #public_key
|
159
|
-
#
|
160
|
-
# ==== Arguments
|
161
|
-
#
|
162
|
-
# [+detailed:+] Boolean (default is false). When +true+, four
|
163
|
-
# additional calls are made to the RPC to return more
|
164
|
-
# information
|
178
|
+
# Returns a Hash containing information about the account.
|
165
179
|
#
|
166
180
|
# ==== Example 1
|
167
181
|
#
|
@@ -169,6 +183,7 @@ class Nanook
|
|
169
183
|
#
|
170
184
|
# ==== Example 1 response
|
171
185
|
# {
|
186
|
+
# :id=>"xrb_16u1uufyoig8777y6r8iqjtrw8sg8maqrm36zzcm95jmbd9i9aj5i8abr8u5"
|
172
187
|
# :balance=>11.439597000000001,
|
173
188
|
# :block_count=>4
|
174
189
|
# :frontier=>"2C3C570EA8898443C0FD04A1C385A3E3A8C985AD792635FCDCEBB30ADF6A0570",
|
@@ -183,6 +198,7 @@ class Nanook
|
|
183
198
|
#
|
184
199
|
# ==== Example 2 response
|
185
200
|
# {
|
201
|
+
# :id=>"xrb_16u1uufyoig8777y6r8iqjtrw8sg8maqrm36zzcm95jmbd9i9aj5i8abr8u5"
|
186
202
|
# :balance=>11.439597000000001,
|
187
203
|
# :block_count=>4,
|
188
204
|
# :frontier=>"2C3C570EA8898443C0FD04A1C385A3E3A8C985AD792635FCDCEBB30ADF6A0570",
|
@@ -194,18 +210,46 @@ class Nanook
|
|
194
210
|
# :representative_block=>"C82376314C387080A753871A32AD70F4168080C317C5E67356F0A62EB5F34FF9",
|
195
211
|
# :weight=>0
|
196
212
|
# }
|
197
|
-
|
198
|
-
|
213
|
+
#
|
214
|
+
# @param detailed [Boolean] (default is false). When +true+, four
|
215
|
+
# additional calls are made to the RPC to return more information
|
216
|
+
# @param unit (see #balance)
|
217
|
+
# @return [Hash] information about the account containing:
|
218
|
+
# [+id] The account id
|
219
|
+
# [+frontier+] The latest block hash
|
220
|
+
# [+open_block+] The first block in every account's blockchain. When this block was published the account was officially open
|
221
|
+
# [+representative_block+] The block that named the representative for the account
|
222
|
+
# [+balance+] Amount in {NANO}[https://nano.org/en/faq#what-are-nano-units-]
|
223
|
+
# [+last_modified+] Unix timestamp
|
224
|
+
# [+block_count+] Number of blocks in the account's blockchain
|
225
|
+
#
|
226
|
+
# When <tt>detailed: true</tt> is passed as an argument, this method
|
227
|
+
# makes four additional calls to the RPC to return more information
|
228
|
+
# about an account:
|
229
|
+
#
|
230
|
+
# [+weight+] See {#weight}
|
231
|
+
# [+pending+] See {#balance}
|
232
|
+
# [+representative+] See {#representative}
|
233
|
+
# [+public_key+] See {#public_key}
|
234
|
+
def info(detailed: false, unit: Nanook.default_unit)
|
235
|
+
unless Nanook::UNITS.include?(unit)
|
236
|
+
raise ArgumentError.new("Unsupported unit: #{unit}")
|
237
|
+
end
|
199
238
|
|
200
239
|
response = rpc(:account_info)
|
240
|
+
response.merge!(id: @account)
|
241
|
+
|
242
|
+
if unit == :nano
|
243
|
+
response[:balance] = Nanook::Util.raw_to_NANO(response[:balance])
|
244
|
+
end
|
201
245
|
|
202
246
|
# Return the response if we don't need any more info
|
203
247
|
return response unless detailed
|
204
248
|
|
205
249
|
# Otherwise make additional calls
|
206
|
-
response
|
250
|
+
response.merge!({
|
207
251
|
weight: weight,
|
208
|
-
pending: balance[:pending],
|
252
|
+
pending: balance(unit: unit)[:pending],
|
209
253
|
representative: representative,
|
210
254
|
public_key: public_key
|
211
255
|
})
|
@@ -214,7 +258,7 @@ class Nanook
|
|
214
258
|
Hash[response.sort].to_symbolized_hash
|
215
259
|
end
|
216
260
|
|
217
|
-
def inspect
|
261
|
+
def inspect
|
218
262
|
"#{self.class.name}(id: \"#{id}\", object_id: \"#{"0x00%x" % (object_id << 1)}\")"
|
219
263
|
end
|
220
264
|
|
@@ -231,7 +275,7 @@ class Nanook
|
|
231
275
|
#
|
232
276
|
# ==== Example
|
233
277
|
#
|
234
|
-
# ledger(limit: 2)
|
278
|
+
# account.ledger(limit: 2)
|
235
279
|
#
|
236
280
|
# ==== Example response
|
237
281
|
# {
|
@@ -246,64 +290,80 @@ class Nanook
|
|
246
290
|
# :xrb_3c3ettq59kijuuad5fnaq35itc9schtr4r7r6rjhmwjbairowzq3wi5ap7h8=>{ ... }
|
247
291
|
# }
|
248
292
|
def ledger(limit: 1)
|
249
|
-
account_required!
|
250
293
|
rpc(:ledger, count: limit)[:accounts]
|
251
294
|
end
|
252
295
|
|
253
|
-
|
254
|
-
#
|
255
|
-
# be received by the account.
|
296
|
+
# Returns information about pending blocks (payments) that are
|
297
|
+
# waiting to be received by the account.
|
256
298
|
#
|
257
|
-
#
|
258
|
-
# With the +detailed:+ argument, the method can return a more
|
259
|
-
# complex Hash containing the amount in
|
260
|
-
# {raw}[https://nano.org/en/faq#what-are-nano-units-] of the pending
|
261
|
-
# block and the source account that sent it.
|
299
|
+
# See also the #receive method of this class for how to receive a pending payment.
|
262
300
|
#
|
263
|
-
#
|
301
|
+
# The default response is an Array of block ids.
|
264
302
|
#
|
265
|
-
#
|
266
|
-
#
|
267
|
-
# Hash of pending block information (default is +false+)
|
303
|
+
# With the +detailed:+ argument, the method returns an Array of Hashes,
|
304
|
+
# which contain the source account id, amount pending and block id.
|
268
305
|
#
|
269
|
-
# ==== Example 1
|
306
|
+
# ==== Example 1:
|
270
307
|
#
|
271
|
-
# pending
|
308
|
+
# account.pending # => ["000D1BAEC8EC208142C99059B393051BAC8380F9B5A2E6B2489A277D81789F3F"]
|
272
309
|
#
|
273
|
-
# ==== Example
|
274
|
-
#
|
275
|
-
# ["000D1BAEC8EC208142C99059B393051BAC8380F9B5A2E6B2489A277D81789F3F"]
|
310
|
+
# ==== Example 2:
|
276
311
|
#
|
277
|
-
#
|
312
|
+
# account.pending(detailed: true)
|
313
|
+
# # =>
|
314
|
+
# # [
|
315
|
+
# # {
|
316
|
+
# # :block=>"000D1BAEC8EC208142C99059B393051BAC8380F9B5A2E6B2489A277D81789F3F",
|
317
|
+
# # :amount=>6,
|
318
|
+
# # :source=>"xrb_3dcfozsmekr1tr9skf1oa5wbgmxt81qepfdnt7zicq5x3hk65fg4fqj58mbr"
|
319
|
+
# # },
|
320
|
+
# # { ... }
|
321
|
+
# # ]
|
278
322
|
#
|
279
|
-
#
|
323
|
+
# ==== Example 3:
|
280
324
|
#
|
281
|
-
#
|
325
|
+
# account.pending(detailed: true, unit: raw).first[:amount] # => 6000000000000000000000000000000
|
326
|
+
# @param limit [Integer] number of pending blocks to return (default is 1000)
|
327
|
+
# @param detailed [Boolean]return a more complex Hash of pending block information (default is +false+)
|
328
|
+
# @param unit (see #balance)
|
282
329
|
#
|
283
|
-
#
|
284
|
-
#
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
def pending(limit: 1000, detailed: false)
|
290
|
-
account_required!
|
330
|
+
# @return [Array<String>]
|
331
|
+
# @return [Array<Hash{Symbol=>String|Integer}>]
|
332
|
+
def pending(limit: 1000, detailed: false, unit: Nanook.default_unit)
|
333
|
+
unless Nanook::UNITS.include?(unit)
|
334
|
+
raise ArgumentError.new("Unsupported unit: #{unit}")
|
335
|
+
end
|
291
336
|
|
292
|
-
|
293
|
-
|
337
|
+
params = { count: limit }
|
338
|
+
params[:source] = true if detailed
|
294
339
|
|
295
|
-
response = rpc(:pending,
|
296
|
-
Nanook::Util.coerce_empty_string_to_type(response, (detailed ? Hash : Array))
|
340
|
+
response = rpc(:pending, params)[:blocks]
|
341
|
+
response = Nanook::Util.coerce_empty_string_to_type(response, (detailed ? Hash : Array))
|
342
|
+
|
343
|
+
return response unless detailed
|
344
|
+
|
345
|
+
response.map do |key, val|
|
346
|
+
p = val.merge(block: key.to_s)
|
347
|
+
|
348
|
+
if unit == :nano
|
349
|
+
p[:amount] = Nanook::Util.raw_to_NANO(p[:amount])
|
350
|
+
end
|
351
|
+
|
352
|
+
p
|
353
|
+
end
|
297
354
|
end
|
298
355
|
|
299
|
-
# Returns the account's weight.
|
300
|
-
# account's balance, and represents the voting weight that account
|
301
|
-
# has on the network if it is a representative.
|
356
|
+
# Returns the account's weight.
|
302
357
|
#
|
303
|
-
#
|
304
|
-
#
|
358
|
+
# Weight is determined by the account's balance, and represents
|
359
|
+
# the voting weight that account has on the network. Only accounts
|
360
|
+
# with greater than 256 weight can vote.
|
361
|
+
#
|
362
|
+
# ==== Example:
|
363
|
+
# account.weight # => 0
|
364
|
+
#
|
365
|
+
# @return [Integer] the account's weight
|
305
366
|
def weight
|
306
|
-
account_required!
|
307
367
|
rpc(:account_weight)[:weight]
|
308
368
|
end
|
309
369
|
|
@@ -314,11 +374,5 @@ class Nanook
|
|
314
374
|
@rpc.call(action, p.merge(params))
|
315
375
|
end
|
316
376
|
|
317
|
-
def account_required!
|
318
|
-
if @account.nil?
|
319
|
-
raise ArgumentError.new("Account must be present")
|
320
|
-
end
|
321
|
-
end
|
322
|
-
|
323
377
|
end
|
324
378
|
end
|