nanook 0.7.0 → 1.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/.gitignore +2 -1
- data/CHANGELOG.md +26 -0
- data/Gemfile.lock +2 -2
- data/README.md +18 -7
- data/Rakefile +18 -0
- data/docs/0.7.0/apple-touch-icon.png +0 -0
- data/docs/0.7.0/classes/Nanook.html +572 -0
- data/docs/0.7.0/classes/Nanook/Account.html +909 -0
- data/docs/0.7.0/classes/Nanook/Block.html +717 -0
- data/docs/0.7.0/classes/Nanook/Error.html +84 -0
- data/docs/0.7.0/classes/Nanook/Key.html +253 -0
- data/docs/0.7.0/classes/Nanook/Node.html +657 -0
- data/docs/0.7.0/classes/Nanook/Rpc.html +247 -0
- data/docs/0.7.0/classes/Nanook/Util.html +197 -0
- data/docs/0.7.0/classes/Nanook/Wallet.html +986 -0
- data/docs/0.7.0/classes/Nanook/WalletAccount.html +446 -0
- data/docs/0.7.0/classes/Nanook/WorkPeer.html +294 -0
- data/docs/0.7.0/created.rid +14 -0
- data/docs/0.7.0/css/github.css +123 -0
- data/docs/0.7.0/css/main.css +374 -0
- data/docs/0.7.0/css/panel.css +360 -0
- data/docs/0.7.0/css/reset.css +48 -0
- data/docs/0.7.0/favicon.ico +0 -0
- data/docs/0.7.0/files/README_md.html +418 -0
- data/docs/0.7.0/files/lib/nanook/account_rb.html +89 -0
- data/docs/0.7.0/files/lib/nanook/block_rb.html +89 -0
- data/docs/0.7.0/files/lib/nanook/error_rb.html +89 -0
- data/docs/0.7.0/files/lib/nanook/key_rb.html +89 -0
- data/docs/0.7.0/files/lib/nanook/node_rb.html +89 -0
- data/docs/0.7.0/files/lib/nanook/rpc_rb.html +99 -0
- data/docs/0.7.0/files/lib/nanook/util_rb.html +89 -0
- data/docs/0.7.0/files/lib/nanook/version_rb.html +84 -0
- data/docs/0.7.0/files/lib/nanook/wallet_account_rb.html +89 -0
- data/docs/0.7.0/files/lib/nanook/wallet_rb.html +89 -0
- data/docs/0.7.0/files/lib/nanook/work_peer_rb.html +89 -0
- data/docs/0.7.0/files/lib/nanook_rb.html +94 -0
- data/docs/0.7.0/i/arrow-down.svg +8 -0
- data/docs/0.7.0/i/arrow-right.svg +8 -0
- data/docs/0.7.0/i/search.svg +12 -0
- data/docs/0.7.0/i/tree_bg.svg +8 -0
- data/docs/0.7.0/index.html +11 -0
- data/docs/0.7.0/js/highlight.pack.js +1 -0
- data/docs/0.7.0/js/jquery-1.3.2.min.js +19 -0
- data/docs/0.7.0/js/main.js +25 -0
- data/docs/0.7.0/js/navigation.js +142 -0
- data/docs/0.7.0/js/search_index.js +1 -0
- data/docs/0.7.0/js/searchdoc.js +465 -0
- data/docs/0.7.0/js/searcher.js +229 -0
- data/docs/0.7.0/panel/index.html +47 -0
- data/docs/0.7.0/panel/links.html +32 -0
- data/docs/0.7.0/panel/tree.js +1 -0
- data/docs/0.8.0/apple-touch-icon.png +0 -0
- data/docs/0.8.0/classes/Nanook.html +621 -0
- data/docs/0.8.0/classes/Nanook/Account.html +971 -0
- data/docs/0.8.0/classes/Nanook/Block.html +759 -0
- data/docs/0.8.0/classes/Nanook/Error.html +84 -0
- data/docs/0.8.0/classes/Nanook/Key.html +295 -0
- data/docs/0.8.0/classes/Nanook/Node.html +657 -0
- data/docs/0.8.0/classes/Nanook/Rpc.html +247 -0
- data/docs/0.8.0/classes/Nanook/Util.html +264 -0
- data/docs/0.8.0/classes/Nanook/Wallet.html +1056 -0
- data/docs/0.8.0/classes/Nanook/WalletAccount.html +582 -0
- data/docs/0.8.0/classes/Nanook/WorkPeer.html +294 -0
- data/docs/0.8.0/created.rid +14 -0
- data/docs/0.8.0/css/github.css +123 -0
- data/docs/0.8.0/css/main.css +374 -0
- data/docs/0.8.0/css/panel.css +360 -0
- data/docs/0.8.0/css/reset.css +48 -0
- data/docs/0.8.0/favicon.ico +0 -0
- data/docs/0.8.0/files/README_md.html +423 -0
- data/docs/0.8.0/files/lib/nanook/account_rb.html +89 -0
- data/docs/0.8.0/files/lib/nanook/block_rb.html +89 -0
- data/docs/0.8.0/files/lib/nanook/error_rb.html +89 -0
- data/docs/0.8.0/files/lib/nanook/key_rb.html +89 -0
- data/docs/0.8.0/files/lib/nanook/node_rb.html +89 -0
- data/docs/0.8.0/files/lib/nanook/rpc_rb.html +99 -0
- data/docs/0.8.0/files/lib/nanook/util_rb.html +97 -0
- data/docs/0.8.0/files/lib/nanook/version_rb.html +84 -0
- data/docs/0.8.0/files/lib/nanook/wallet_account_rb.html +89 -0
- data/docs/0.8.0/files/lib/nanook/wallet_rb.html +89 -0
- data/docs/0.8.0/files/lib/nanook/work_peer_rb.html +89 -0
- data/docs/0.8.0/files/lib/nanook_rb.html +94 -0
- data/docs/0.8.0/i/arrow-down.svg +8 -0
- data/docs/0.8.0/i/arrow-right.svg +8 -0
- data/docs/0.8.0/i/search.svg +12 -0
- data/docs/0.8.0/i/tree_bg.svg +8 -0
- data/docs/0.8.0/index.html +11 -0
- data/docs/0.8.0/js/highlight.pack.js +1 -0
- data/docs/0.8.0/js/jquery-1.3.2.min.js +19 -0
- data/docs/0.8.0/js/main.js +25 -0
- data/docs/0.8.0/js/navigation.js +142 -0
- data/docs/0.8.0/js/search_index.js +1 -0
- data/docs/0.8.0/js/searchdoc.js +465 -0
- data/docs/0.8.0/js/searcher.js +229 -0
- data/docs/0.8.0/panel/index.html +47 -0
- data/docs/0.8.0/panel/links.html +32 -0
- data/docs/0.8.0/panel/tree.js +1 -0
- data/docs/1.0.0/apple-touch-icon.png +0 -0
- data/docs/1.0.0/classes/Nanook.html +621 -0
- data/docs/1.0.0/classes/Nanook/Account.html +971 -0
- data/docs/1.0.0/classes/Nanook/Block.html +759 -0
- data/docs/1.0.0/classes/Nanook/Error.html +84 -0
- data/docs/1.0.0/classes/Nanook/Key.html +295 -0
- data/docs/1.0.0/classes/Nanook/Node.html +657 -0
- data/docs/1.0.0/classes/Nanook/Rpc.html +247 -0
- data/docs/1.0.0/classes/Nanook/Util.html +264 -0
- data/docs/1.0.0/classes/Nanook/Wallet.html +1056 -0
- data/docs/1.0.0/classes/Nanook/WalletAccount.html +582 -0
- data/docs/1.0.0/classes/Nanook/WorkPeer.html +294 -0
- data/docs/1.0.0/created.rid +14 -0
- data/docs/1.0.0/css/github.css +123 -0
- data/docs/1.0.0/css/main.css +374 -0
- data/docs/1.0.0/css/panel.css +360 -0
- data/docs/1.0.0/css/reset.css +48 -0
- data/docs/1.0.0/favicon.ico +0 -0
- data/docs/1.0.0/files/README_md.html +423 -0
- data/docs/1.0.0/files/lib/nanook/account_rb.html +89 -0
- data/docs/1.0.0/files/lib/nanook/block_rb.html +89 -0
- data/docs/1.0.0/files/lib/nanook/error_rb.html +89 -0
- data/docs/1.0.0/files/lib/nanook/key_rb.html +89 -0
- data/docs/1.0.0/files/lib/nanook/node_rb.html +89 -0
- data/docs/1.0.0/files/lib/nanook/rpc_rb.html +99 -0
- data/docs/1.0.0/files/lib/nanook/util_rb.html +97 -0
- data/docs/1.0.0/files/lib/nanook/version_rb.html +84 -0
- data/docs/1.0.0/files/lib/nanook/wallet_account_rb.html +89 -0
- data/docs/1.0.0/files/lib/nanook/wallet_rb.html +89 -0
- data/docs/1.0.0/files/lib/nanook/work_peer_rb.html +89 -0
- data/docs/1.0.0/files/lib/nanook_rb.html +94 -0
- data/docs/1.0.0/i/arrow-down.svg +8 -0
- data/docs/1.0.0/i/arrow-right.svg +8 -0
- data/docs/1.0.0/i/search.svg +12 -0
- data/docs/1.0.0/i/tree_bg.svg +8 -0
- data/docs/1.0.0/index.html +11 -0
- data/docs/1.0.0/js/highlight.pack.js +1 -0
- data/docs/1.0.0/js/jquery-1.3.2.min.js +19 -0
- data/docs/1.0.0/js/main.js +25 -0
- data/docs/1.0.0/js/navigation.js +142 -0
- data/docs/1.0.0/js/search_index.js +1 -0
- data/docs/1.0.0/js/searchdoc.js +465 -0
- data/docs/1.0.0/js/searcher.js +229 -0
- data/docs/1.0.0/panel/index.html +47 -0
- data/docs/1.0.0/panel/links.html +32 -0
- data/docs/1.0.0/panel/tree.js +1 -0
- data/docs/apple-touch-icon.png +0 -0
- data/docs/classes/Nanook.html +572 -0
- data/docs/classes/Nanook/Account.html +907 -0
- data/docs/classes/Nanook/Block.html +717 -0
- data/docs/classes/Nanook/Error.html +84 -0
- data/docs/classes/Nanook/Key.html +253 -0
- data/docs/classes/Nanook/Node.html +657 -0
- data/docs/classes/Nanook/Rpc.html +247 -0
- data/docs/classes/Nanook/Util.html +197 -0
- data/docs/classes/Nanook/Wallet.html +778 -0
- data/docs/classes/Nanook/WalletAccount.html +447 -0
- data/docs/classes/Nanook/WorkPeer.html +294 -0
- data/docs/created.rid +14 -0
- data/docs/css/github.css +123 -0
- data/docs/css/main.css +374 -0
- data/docs/css/panel.css +360 -0
- data/docs/css/reset.css +48 -0
- data/docs/favicon.ico +0 -0
- data/docs/files/README_md.html +408 -0
- data/docs/files/lib/nanook/account_rb.html +89 -0
- data/docs/files/lib/nanook/block_rb.html +89 -0
- data/docs/files/lib/nanook/error_rb.html +89 -0
- data/docs/files/lib/nanook/key_rb.html +89 -0
- data/docs/files/lib/nanook/node_rb.html +89 -0
- data/docs/files/lib/nanook/rpc_rb.html +99 -0
- data/docs/files/lib/nanook/util_rb.html +89 -0
- data/docs/files/lib/nanook/version_rb.html +84 -0
- data/docs/files/lib/nanook/wallet_account_rb.html +89 -0
- data/docs/files/lib/nanook/wallet_rb.html +89 -0
- data/docs/files/lib/nanook/work_peer_rb.html +89 -0
- data/docs/files/lib/nanook_rb.html +94 -0
- data/docs/i/arrow-down.svg +8 -0
- data/docs/i/arrow-right.svg +8 -0
- data/docs/i/search.svg +12 -0
- data/docs/i/tree_bg.svg +8 -0
- data/docs/index.html +11 -0
- data/docs/js/highlight.pack.js +1 -0
- data/docs/js/jquery-1.3.2.min.js +19 -0
- data/docs/js/main.js +25 -0
- data/docs/js/navigation.js +142 -0
- data/docs/js/search_index.js +1 -0
- data/docs/js/searchdoc.js +465 -0
- data/docs/js/searcher.js +229 -0
- data/docs/panel/index.html +47 -0
- data/docs/panel/links.html +32 -0
- data/docs/panel/tree.js +1 -0
- data/lib/nanook.rb +40 -4
- data/lib/nanook/account.rb +250 -8
- data/lib/nanook/block.rb +25 -2
- data/lib/nanook/key.rb +10 -2
- data/lib/nanook/node.rb +4 -0
- data/lib/nanook/rpc.rb +5 -1
- data/lib/nanook/util.rb +9 -1
- data/lib/nanook/version.rb +1 -1
- data/lib/nanook/wallet.rb +275 -14
- data/lib/nanook/wallet_account.rb +63 -11
- data/lib/nanook/work_peer.rb +4 -0
- metadata +188 -3
data/lib/nanook/block.rb
CHANGED
|
@@ -1,9 +1,24 @@
|
|
|
1
1
|
class Nanook
|
|
2
|
+
|
|
3
|
+
# The <tt>Nanook::Block</tt> class contains methods to discover
|
|
4
|
+
# publicly-available information about blocks on the nano network.
|
|
5
|
+
#
|
|
6
|
+
# A block is represented by a unique hash
|
|
7
|
+
#
|
|
8
|
+
# Initialize this class through the convenient Nanook#block method:
|
|
9
|
+
#
|
|
10
|
+
# nanook = Nanook.new
|
|
11
|
+
# account = nanook.block("991CF19...")
|
|
12
|
+
#
|
|
13
|
+
# Or compose the longhand way like this:
|
|
14
|
+
#
|
|
15
|
+
# rpc_conn = Nanook::Rpc.new
|
|
16
|
+
# block = Nanook::Block.new(rpc_conn, "991CF19...")
|
|
2
17
|
class Block
|
|
3
18
|
|
|
4
|
-
def initialize(
|
|
5
|
-
@block = block
|
|
19
|
+
def initialize(rpc, block)
|
|
6
20
|
@rpc = rpc
|
|
21
|
+
@block = block
|
|
7
22
|
block_required! # All methods expect a block
|
|
8
23
|
end
|
|
9
24
|
|
|
@@ -28,6 +43,10 @@ class Nanook
|
|
|
28
43
|
rpc(:history, :hash, count: limit)[:history]
|
|
29
44
|
end
|
|
30
45
|
|
|
46
|
+
def id
|
|
47
|
+
@block
|
|
48
|
+
end
|
|
49
|
+
|
|
31
50
|
def info(allow_unchecked: false)
|
|
32
51
|
if allow_unchecked
|
|
33
52
|
# TODO not actually sure what this response looks like when it's not an unchecked block, assuming its blank
|
|
@@ -75,6 +94,10 @@ class Nanook
|
|
|
75
94
|
Nanook::Util.coerce_empty_string_to_type(response, Array)
|
|
76
95
|
end
|
|
77
96
|
|
|
97
|
+
def inspect # :nodoc:
|
|
98
|
+
"#{self.class.name}(id: \"#{id}\", object_id: \"#{"0x00%x" % (object_id << 1)}\")"
|
|
99
|
+
end
|
|
100
|
+
|
|
78
101
|
private
|
|
79
102
|
|
|
80
103
|
# Some RPC calls expect the param that represents the block to be named
|
data/lib/nanook/key.rb
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
class Nanook
|
|
2
2
|
class Key
|
|
3
3
|
|
|
4
|
-
def initialize(key=nil
|
|
5
|
-
@key = key
|
|
4
|
+
def initialize(rpc, key=nil)
|
|
6
5
|
@rpc = rpc
|
|
6
|
+
@key = key
|
|
7
7
|
end
|
|
8
8
|
|
|
9
9
|
def generate(seed: nil, index: nil)
|
|
@@ -16,11 +16,19 @@ class Nanook
|
|
|
16
16
|
end
|
|
17
17
|
end
|
|
18
18
|
|
|
19
|
+
def id
|
|
20
|
+
@key
|
|
21
|
+
end
|
|
22
|
+
|
|
19
23
|
def info
|
|
20
24
|
key_required!
|
|
21
25
|
rpc(:key_expand)
|
|
22
26
|
end
|
|
23
27
|
|
|
28
|
+
def inspect # :nodoc:
|
|
29
|
+
"#{self.class.name}(id: \"#{id}\", object_id: \"#{"0x00%x" % (object_id << 1)}\")"
|
|
30
|
+
end
|
|
31
|
+
|
|
24
32
|
private
|
|
25
33
|
|
|
26
34
|
def rpc(action, params={})
|
data/lib/nanook/node.rb
CHANGED
data/lib/nanook/rpc.rb
CHANGED
|
@@ -36,6 +36,10 @@ class Nanook
|
|
|
36
36
|
end
|
|
37
37
|
end
|
|
38
38
|
|
|
39
|
+
def inspect # :nodoc:
|
|
40
|
+
"#{self.class.name}(host: #{@http.address}, timeout: #{@http.read_timeout} object_id: \"#{"0x00%x" % (object_id << 1)}\")"
|
|
41
|
+
end
|
|
42
|
+
|
|
39
43
|
private
|
|
40
44
|
|
|
41
45
|
# Convert Strings of primitives to primitives
|
|
@@ -56,7 +60,7 @@ class Nanook
|
|
|
56
60
|
[k, v]
|
|
57
61
|
end
|
|
58
62
|
|
|
59
|
-
Hash[new_hash].to_symbolized_hash
|
|
63
|
+
Hash[new_hash.sort].to_symbolized_hash
|
|
60
64
|
end
|
|
61
65
|
|
|
62
66
|
def parse_value(v)
|
data/lib/nanook/util.rb
CHANGED
|
@@ -1,8 +1,16 @@
|
|
|
1
|
+
require 'bigdecimal'
|
|
2
|
+
|
|
1
3
|
class Nanook
|
|
2
4
|
class Util
|
|
3
5
|
|
|
6
|
+
STEP = BigDecimal.new("10")**BigDecimal.new("30")
|
|
7
|
+
|
|
4
8
|
def self.NANO_to_raw(nano)
|
|
5
|
-
nano *
|
|
9
|
+
(BigDecimal.new(nano.to_s) * STEP).to_i
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def self.raw_to_NANO(raw)
|
|
13
|
+
raw.to_f / STEP
|
|
6
14
|
end
|
|
7
15
|
|
|
8
16
|
def self.coerce_empty_string_to_type(response, type)
|
data/lib/nanook/version.rb
CHANGED
data/lib/nanook/wallet.rb
CHANGED
|
@@ -1,82 +1,332 @@
|
|
|
1
1
|
class Nanook
|
|
2
|
+
|
|
3
|
+
# The <tt>Nanook::Wallet</tt> class lets you manage your nano wallets,
|
|
4
|
+
# as well as some account-specific things like making and receiving payments.
|
|
5
|
+
#
|
|
6
|
+
# Your wallets each have a seed, which is a 32-byte uppercase hex
|
|
7
|
+
# string that looks like this:
|
|
8
|
+
#
|
|
9
|
+
# 000D1BAEC8EC208142C99059B393051BAC8380F9B5A2E6B2489A277D81789F3F
|
|
10
|
+
#
|
|
11
|
+
# You can think of this string as your API key to the nano network.
|
|
12
|
+
# The person who knows it can do all read and write actions against
|
|
13
|
+
# the wallet and all accounts inside the wallet from anywhere on the
|
|
14
|
+
# nano network, not just on the node you created the wallet on.
|
|
15
|
+
# <b>Make sure this key is always secret and safe</b>. Do not commit
|
|
16
|
+
# your seed into source control.
|
|
17
|
+
#
|
|
18
|
+
# === Initializing
|
|
19
|
+
#
|
|
20
|
+
# Initialize this class through the convenient Nanook#wallet method:
|
|
21
|
+
#
|
|
22
|
+
# nanook = Nanook.new
|
|
23
|
+
# wallet = nanook.wallet(wallet_seed)
|
|
24
|
+
#
|
|
25
|
+
# Or compose the longhand way like this:
|
|
26
|
+
#
|
|
27
|
+
# rpc_conn = Nanook::Rpc.new
|
|
28
|
+
# wallet = Nanook::Wallet.new(rpc_conn, wallet_seed)
|
|
2
29
|
class Wallet
|
|
3
30
|
|
|
4
|
-
def initialize(
|
|
5
|
-
@wallet = wallet
|
|
31
|
+
def initialize(rpc, wallet)
|
|
6
32
|
@rpc = rpc
|
|
33
|
+
@wallet = wallet
|
|
7
34
|
end
|
|
8
35
|
|
|
36
|
+
# A convenient method that returns an account in your wallet, allowing
|
|
37
|
+
# you to perform all the actions in Nanook::WalletAccount on it.
|
|
38
|
+
#
|
|
39
|
+
# wallet.account("xrb_...") #=> Nanook::WalletAccount instance
|
|
40
|
+
#
|
|
41
|
+
# See Nanook::WalletAccount.
|
|
42
|
+
#
|
|
43
|
+
# Will throw an ArgumentError if the wallet does not contain the account.
|
|
44
|
+
#
|
|
45
|
+
# ==== Arguments
|
|
46
|
+
# [+account+] Optional String of an account (starting with
|
|
47
|
+
# <tt>"xrb..."</tt>) to start working with. Must be an
|
|
48
|
+
# account within the wallet. When
|
|
49
|
+
# no account is given, the instance returned only allows you to call
|
|
50
|
+
# +create+ on it, to create a new account. Otherwise, you
|
|
51
|
+
# must pass an account string for all other methods.
|
|
52
|
+
#
|
|
53
|
+
# ==== Examples
|
|
54
|
+
#
|
|
55
|
+
# wallet.account.create # Creates an account in the wallet and returns a Nanook::WalletAccount
|
|
56
|
+
# wallet.account(account_id) # Returns a Nanook::WalletAccount for the account
|
|
9
57
|
def account(account=nil)
|
|
10
|
-
Nanook::WalletAccount.new(@wallet, account
|
|
58
|
+
Nanook::WalletAccount.new(@rpc, @wallet, account)
|
|
11
59
|
end
|
|
12
60
|
|
|
61
|
+
# Returns an Array with Strings of all account ids in the wallet.
|
|
62
|
+
#
|
|
63
|
+
# ==== Example response
|
|
64
|
+
#
|
|
65
|
+
# [
|
|
66
|
+
# "xrb_3e3j5tkog48pnny9dmfzj1r16pg8t1e76dz5tmac6iq689wyjfpi00000000",
|
|
67
|
+
# "xrb_1e5aqegc1jb7qe964u4adzmcezyo6o146zb8hm6dft8tkp79za3sxwjym5rx"
|
|
68
|
+
# ]
|
|
13
69
|
def accounts
|
|
14
70
|
wallet_required!
|
|
15
71
|
response = rpc(:account_list)[:accounts]
|
|
16
72
|
Nanook::Util.coerce_empty_string_to_type(response, Array)
|
|
17
73
|
end
|
|
18
74
|
|
|
19
|
-
|
|
75
|
+
# Returns a Hash containing the balance of all accounts in the
|
|
76
|
+
# wallet, optionally breaking the balances down by account.
|
|
77
|
+
#
|
|
78
|
+
# ==== Arguments
|
|
79
|
+
#
|
|
80
|
+
# [+account_break_down:+] Boolean (default is +false+). When +true+
|
|
81
|
+
# the response will contain balances per
|
|
82
|
+
# account.
|
|
83
|
+
# [+unit:+] Symbol (default is +:nano+) Represents the unit that
|
|
84
|
+
# the balances will be returned in.
|
|
85
|
+
# Must be either +:nano+ or +:raw+. (Note: this method
|
|
86
|
+
# interprets +:nano+ as NANO, which is technically Mnano
|
|
87
|
+
# See {What are Nano's Units}[https://nano.org/en/faq#what-are-nano-units-])
|
|
88
|
+
#
|
|
89
|
+
# ==== Examples
|
|
90
|
+
# wallet.balance
|
|
91
|
+
#
|
|
92
|
+
# Example response:
|
|
93
|
+
#
|
|
94
|
+
# {
|
|
95
|
+
# "balance"=>5,
|
|
96
|
+
# "pending"=>0.001
|
|
97
|
+
# }
|
|
98
|
+
#
|
|
99
|
+
# Asking for the balances to be returned in raw instead of NANO.
|
|
100
|
+
#
|
|
101
|
+
# wallet.balance(unit: :raw)
|
|
102
|
+
#
|
|
103
|
+
# Example response:
|
|
104
|
+
#
|
|
105
|
+
# {
|
|
106
|
+
# "balance"=>5000000000000000000000000000000,
|
|
107
|
+
# "pending"=>1000000000000000000000000000
|
|
108
|
+
# }
|
|
109
|
+
#
|
|
110
|
+
# Asking for totals to be broken down by account:
|
|
111
|
+
#
|
|
112
|
+
# wallet.balance(account_break_down: true)
|
|
113
|
+
#
|
|
114
|
+
# Example response:
|
|
115
|
+
#
|
|
116
|
+
{
|
|
117
|
+
"xrb_3e3j5tkog48pnny9dmfzj1r16pg8t1e76dz5tmac6iq689wyjfpi00000000"=>{
|
|
118
|
+
"balance"=>2500000000000000,
|
|
119
|
+
"pending"=>10000000000000
|
|
120
|
+
},
|
|
121
|
+
"xrb_1e5aqegc1jb7qe964u4adzmcezyo6o146zb8hm6dft8tkp79za3sxwjym5rx"=>{
|
|
122
|
+
"balance"=>2500000000000000,
|
|
123
|
+
"pending"=>0
|
|
124
|
+
},
|
|
125
|
+
}
|
|
126
|
+
def balance(account_break_down: false, unit: Nanook::WalletAccount::DEFAULT_UNIT)
|
|
20
127
|
wallet_required!
|
|
128
|
+
|
|
129
|
+
unless Nanook::WalletAccount::UNITS.include?(unit)
|
|
130
|
+
raise ArgumentError.new("Unsupported unit: #{unit}")
|
|
131
|
+
end
|
|
132
|
+
|
|
21
133
|
if account_break_down
|
|
22
|
-
rpc(:wallet_balances)[:balances]
|
|
23
|
-
|
|
24
|
-
|
|
134
|
+
return Nanook::Util.coerce_empty_string_to_type(rpc(:wallet_balances)[:balances], Hash).tap do |r|
|
|
135
|
+
if unit == :nano
|
|
136
|
+
r.each do |account, balances|
|
|
137
|
+
r[account][:balance] = Nanook::Util.raw_to_NANO(r[account][:balance])
|
|
138
|
+
r[account][:pending] = Nanook::Util.raw_to_NANO(r[account][:balapendingnce])
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
rpc(:wallet_balance_total).tap do |r|
|
|
145
|
+
if unit == :nano
|
|
146
|
+
r[:balance] = Nanook::Util.raw_to_NANO(r[:balance])
|
|
147
|
+
r[:pending] = Nanook::Util.raw_to_NANO(r[:pending])
|
|
148
|
+
end
|
|
25
149
|
end
|
|
26
150
|
end
|
|
27
151
|
|
|
152
|
+
# Creates a new wallet.
|
|
153
|
+
#
|
|
154
|
+
# Nanook.new.wallet.create
|
|
155
|
+
#
|
|
156
|
+
# ==== Very important
|
|
157
|
+
#
|
|
158
|
+
# <b>Please read this.</b> The response of this method is a wallet seed. A seed is
|
|
159
|
+
# a 32-byte uppercase hex string. You can think of this string as your
|
|
160
|
+
# API key to the nano network. The person who knows it can do all read and write
|
|
161
|
+
# actions against the wallet and all accounts inside the wallet from
|
|
162
|
+
# anywhere on the nano network, not just on the node you created the
|
|
163
|
+
# wallet on.
|
|
164
|
+
#
|
|
165
|
+
# If you intend for your wallet to contain funds, then make sure that
|
|
166
|
+
# you consider the seed that is returned as the key to your funds
|
|
167
|
+
# and store it somewhere secret and safe. Only transmit
|
|
168
|
+
# the seed over secure (SSH or SSL) networks and do not store it where
|
|
169
|
+
# it is able to be easily comprised by a hacker, which includes your
|
|
170
|
+
# personal computer.
|
|
171
|
+
#
|
|
172
|
+
# ==== Example response:
|
|
173
|
+
#
|
|
174
|
+
# "CC2C9846A44DB6F0363F647D12B957794AD937F59498D4E35C172C81E2888650"
|
|
28
175
|
def create
|
|
29
176
|
rpc(:wallet_create)[:wallet]
|
|
30
177
|
end
|
|
31
178
|
|
|
179
|
+
# Destroy the wallet. Returns a boolean indicating whether the action
|
|
180
|
+
# was successful or not.
|
|
181
|
+
#
|
|
182
|
+
# ==== Example Response
|
|
183
|
+
# true
|
|
32
184
|
def destroy
|
|
33
185
|
wallet_required!
|
|
34
186
|
rpc(:wallet_destroy)
|
|
35
187
|
true
|
|
36
188
|
end
|
|
37
189
|
|
|
190
|
+
# Generates a String containing a JSON representation of your wallet.
|
|
191
|
+
#
|
|
192
|
+
# ==== Example response
|
|
193
|
+
#
|
|
194
|
+
# "{\n \"0000000000000000000000000000000000000000000000000000000000000000\": \"0000000000000000000000000000000000000000000000000000000000000003\",\n \"0000000000000000000000000000000000000000000000000000000000000001\": \"C3A176FC3B90113277BFC91F55128FC9A1F1B6166A73E7446927CFFCA4C2C9D9\",\n \"0000000000000000000000000000000000000000000000000000000000000002\": \"3E58EC805B99C52B4715598BD332C234A1FBF1780577137E18F53B9B7F85F04B\",\n \"0000000000000000000000000000000000000000000000000000000000000003\": \"5FF8021122F3DEE0E4EC4241D35A3F41DEF63CCF6ADA66AF235DE857718498CD\",\n \"0000000000000000000000000000000000000000000000000000000000000004\": \"A30E0A32ED41C8607AA9212843392E853FCBCB4E7CB194E35C94F07F91DE59EF\",\n \"0000000000000000000000000000000000000000000000000000000000000005\": \"E707002E84143AA5F030A6DB8DD0C0480F2FFA75AB1FFD657EC22B5AA8E395D5\",\n \"0000000000000000000000000000000000000000000000000000000000000006\": \"0000000000000000000000000000000000000000000000000000000000000001\",\n \"8646C0423160DEAEAA64034F9C6858F7A5C8A329E73E825A5B16814F6CCAFFE3\": \"0000000000000000000000000000000000000000000000000000000100000000\"\n}\n"
|
|
38
195
|
def export
|
|
39
196
|
wallet_required!
|
|
40
197
|
rpc(:wallet_export)[:json]
|
|
41
198
|
end
|
|
42
199
|
|
|
200
|
+
# Returns boolean indicating if the wallet contains an account.
|
|
201
|
+
#
|
|
202
|
+
# ==== Arguments
|
|
203
|
+
#
|
|
204
|
+
# [+account+] String account id (will start with <tt>"xrb_..."</tt>)
|
|
205
|
+
#
|
|
206
|
+
# ==== Example response
|
|
207
|
+
# true
|
|
43
208
|
def contains?(account)
|
|
44
209
|
wallet_required!
|
|
45
210
|
response = rpc(:wallet_contains, account: account)
|
|
46
211
|
!response.empty? && response[:exists] == 1
|
|
47
212
|
end
|
|
48
213
|
|
|
49
|
-
def
|
|
214
|
+
def id
|
|
215
|
+
@wallet
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
def inspect # :nodoc:
|
|
219
|
+
"#{self.class.name}(id: \"#{id}\", object_id: \"#{"0x00%x" % (object_id << 1)}\")"
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
# Make a payment from an account in your wallet to another account
|
|
223
|
+
# on the nano network. Returns a <i>send</i> block hash if successful,
|
|
224
|
+
# or an error String if unsuccessful.
|
|
225
|
+
#
|
|
226
|
+
# ==== Arguments
|
|
227
|
+
#
|
|
228
|
+
# [+from:+] String account id of an account in your wallet
|
|
229
|
+
# [+to:+] String account id of the recipient of your payment
|
|
230
|
+
# [+amount:+] Can be either an Integer or Float.
|
|
231
|
+
# [+unit:+] Symbol (default is +:nano+). Represents the unit that +amount+ is in.
|
|
232
|
+
# Must be either +:nano+ or +:raw+. (Note: this method
|
|
233
|
+
# interprets +:nano+ as NANO, which is technically Mnano
|
|
234
|
+
# See {What are Nano's Units}[https://nano.org/en/faq#what-are-nano-units-])
|
|
235
|
+
# [+id:+] String. Must be unique per payment. It serves an important
|
|
236
|
+
# purpose; it allows you to make the same call multiple
|
|
237
|
+
# times with the same +id+ and be reassured that you will
|
|
238
|
+
# only ever send that nano payment once.
|
|
239
|
+
#
|
|
240
|
+
# 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]:
|
|
241
|
+
#
|
|
242
|
+
# <i>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.</i>
|
|
243
|
+
#
|
|
244
|
+
# ==== Examples
|
|
245
|
+
#
|
|
246
|
+
# wallet.pay(from: "xrb_...", to: "xrb_...", amount: 1.1, id: "myUniqueId123")
|
|
247
|
+
# wallet.pay(from: "xrb_...", to: "xrb_...", amount: 54000000000000, unit: :raw, id: "myUniqueId123")
|
|
248
|
+
#
|
|
249
|
+
# ==== Example responses
|
|
250
|
+
# "718CC2121C3E641059BC1C2CFC45666C99E8AE922F7A807B7D07B62C995D79E2"
|
|
251
|
+
#
|
|
252
|
+
# Or:
|
|
253
|
+
#
|
|
254
|
+
# "Account not found"
|
|
255
|
+
def pay(from:, to:, amount:, unit: Nanook::WalletAccount::DEFAULT_UNIT, id:)
|
|
50
256
|
wallet_required!
|
|
51
|
-
|
|
257
|
+
validate_wallet_contains_account!(from)
|
|
258
|
+
account(from).pay(to: to, amount: amount, unit: unit, id: id)
|
|
52
259
|
end
|
|
53
260
|
|
|
261
|
+
# Receives a pending payment into an account in the wallet.
|
|
262
|
+
#
|
|
263
|
+
# When called with no +block+ argument, the latest pending payment
|
|
264
|
+
# for the account will be received.
|
|
265
|
+
#
|
|
266
|
+
# Returns a <i>receive</i> block hash if a receive was successful,
|
|
267
|
+
# or +false+ if there were no pending payments to receive.
|
|
268
|
+
#
|
|
269
|
+
# You can also receive a specific pending block if you know it by
|
|
270
|
+
# passing the block has in as an argument.
|
|
271
|
+
#
|
|
272
|
+
# ==== Arguments
|
|
273
|
+
#
|
|
274
|
+
# [+block+] Optional block hash of pending payment. If not provided,
|
|
275
|
+
# the latest pending payment will be received
|
|
276
|
+
# [+into:+] String account id of account in your wallet to receive the
|
|
277
|
+
# payment into
|
|
278
|
+
#
|
|
279
|
+
# ==== Examples
|
|
280
|
+
#
|
|
281
|
+
# wallet.receive(into: "xrb...")
|
|
282
|
+
# wallet.receive("718CC21...", into: "xrb...")
|
|
283
|
+
#
|
|
284
|
+
# ==== Example responses
|
|
285
|
+
#
|
|
286
|
+
# "718CC2121C3E641059BC1C2CFC45666C99E8AE922F7A807B7D07B62C995D79E2"
|
|
287
|
+
#
|
|
288
|
+
# Or:
|
|
289
|
+
#
|
|
290
|
+
# false
|
|
54
291
|
def receive(block=nil, into:)
|
|
55
292
|
wallet_required!
|
|
293
|
+
validate_wallet_contains_account!(into)
|
|
56
294
|
account(into).receive(block)
|
|
57
295
|
end
|
|
58
296
|
|
|
297
|
+
# Returns a boolean to indicate if the wallet is locked.
|
|
298
|
+
#
|
|
299
|
+
# ==== Example response
|
|
300
|
+
#
|
|
301
|
+
# true
|
|
59
302
|
def locked?
|
|
60
303
|
wallet_required!
|
|
61
304
|
response = rpc(:wallet_locked)
|
|
62
305
|
!response.empty? && response[:locked] != 0
|
|
63
306
|
end
|
|
64
307
|
|
|
308
|
+
# Unlocks a previously locked wallet. Returns a boolean to indicate
|
|
309
|
+
# if the action was successful.
|
|
310
|
+
#
|
|
311
|
+
# ==== Example response
|
|
312
|
+
#
|
|
313
|
+
# true
|
|
65
314
|
def unlock(password)
|
|
66
315
|
wallet_required!
|
|
67
316
|
rpc(:password_enter, password: password)[:valid] == 1
|
|
68
317
|
end
|
|
69
318
|
|
|
319
|
+
# Changes the password for a wallet. Returns a boolean to indicate
|
|
320
|
+
# if the action was successful.
|
|
321
|
+
#
|
|
322
|
+
# ==== Example response
|
|
323
|
+
#
|
|
324
|
+
# true
|
|
70
325
|
def change_password(password)
|
|
71
326
|
wallet_required!
|
|
72
327
|
rpc(:password_change, password: password)[:changed] == 1
|
|
73
328
|
end
|
|
74
329
|
|
|
75
|
-
def all
|
|
76
|
-
wallet_required!
|
|
77
|
-
rpc(:account_list)[:accounts]
|
|
78
|
-
end
|
|
79
|
-
|
|
80
330
|
private
|
|
81
331
|
|
|
82
332
|
def rpc(action, params={})
|
|
@@ -90,5 +340,16 @@ class Nanook
|
|
|
90
340
|
end
|
|
91
341
|
end
|
|
92
342
|
|
|
343
|
+
def validate_wallet_contains_account!(account)
|
|
344
|
+
@known_valid_accounts ||= []
|
|
345
|
+
return if @known_valid_accounts.include?(account)
|
|
346
|
+
|
|
347
|
+
if contains?(account)
|
|
348
|
+
@known_valid_accounts << account
|
|
349
|
+
else
|
|
350
|
+
raise ArgumentError.new("Account does not exist in wallet. Account: #{account}, wallet: #{@wallet}")
|
|
351
|
+
end
|
|
352
|
+
end
|
|
353
|
+
|
|
93
354
|
end
|
|
94
355
|
end
|