Class: Tapyrus::Wallet::Account
- Inherits:
-
Object
- Object
- Tapyrus::Wallet::Account
- Includes:
- HexConverter
- Defined in:
- lib/tapyrus/wallet/account.rb
Overview
the account in BIP-44
Constant Summary collapse
- PURPOSE_TYPE =
{ legacy: 44, nested_witness: 49, native_segwit: 84 }
Instance Attribute Summary collapse
-
#account_key ⇒ Object
readonly
account xpub key Tapyrus::ExtPubkey.
-
#change_depth ⇒ Object
change address depth(address index).
-
#index ⇒ Object
readonly
BIP-44 index.
-
#lookahead ⇒ Object
Returns the value of attribute lookahead.
-
#name ⇒ Object
readonly
account name.
-
#purpose ⇒ Object
readonly
either 44 or 49 or 84.
-
#receive_depth ⇒ Object
receive address depth(address index).
-
#wallet ⇒ Object
Returns the value of attribute wallet.
Class Method Summary collapse
Instance Method Summary collapse
-
#create_change ⇒ Tapyrus::ExtPubkey
create new change key.
-
#create_receive ⇒ Tapyrus::ExtPubkey
create new receive key.
-
#derived_change_keys ⇒ Array[Tapyrus::ExtPubkey]
get the list of derived keys for change key.
-
#derived_receive_keys ⇒ Array[Tapyrus::ExtPubkey]
get the list of derived keys for receive key.
-
#initialize(account_key, purpose = PURPOSE_TYPE[:native_segwit], index = 0, name = "") ⇒ Account
constructor
A new instance of Account.
-
#path ⇒ Object
account derivation path.
-
#save ⇒ Object
save this account payload to database.
- #save_key(purpose, index, key) ⇒ Object
- #to_h ⇒ Object
- #to_payload ⇒ Object
-
#type ⇒ Object
get account type label.
- #watch_only ⇒ Object
-
#watch_targets ⇒ Array[String]
get data elements tobe monitored with Bloom Filter.
-
#witness? ⇒ Boolean
whether support witness.
Methods included from HexConverter
Constructor Details
#initialize(account_key, purpose = PURPOSE_TYPE[:native_segwit], index = 0, name = "") ⇒ Account
Returns a new instance of Account.
18 19 20 21 22 23 24 25 26 27 |
# File 'lib/tapyrus/wallet/account.rb', line 18 def initialize(account_key, purpose = PURPOSE_TYPE[:native_segwit], index = 0, name = "") validate_params!(account_key, purpose, index) @purpose = purpose @index = index @name = name @receive_depth = 0 @change_depth = 0 @lookahead = 10 @account_key = account_key end |
Instance Attribute Details
#account_key ⇒ Object (readonly)
account xpub key Tapyrus::ExtPubkey
12 13 14 |
# File 'lib/tapyrus/wallet/account.rb', line 12 def account_key @account_key end |
#change_depth ⇒ Object
change address depth(address index)
14 15 16 |
# File 'lib/tapyrus/wallet/account.rb', line 14 def change_depth @change_depth end |
#index ⇒ Object (readonly)
BIP-44 index
10 11 12 |
# File 'lib/tapyrus/wallet/account.rb', line 10 def index @index end |
#lookahead ⇒ Object
Returns the value of attribute lookahead.
15 16 17 |
# File 'lib/tapyrus/wallet/account.rb', line 15 def lookahead @lookahead end |
#name ⇒ Object (readonly)
account name
11 12 13 |
# File 'lib/tapyrus/wallet/account.rb', line 11 def name @name end |
#purpose ⇒ Object (readonly)
either 44 or 49 or 84
9 10 11 |
# File 'lib/tapyrus/wallet/account.rb', line 9 def purpose @purpose end |
#receive_depth ⇒ Object
receive address depth(address index)
13 14 15 |
# File 'lib/tapyrus/wallet/account.rb', line 13 def receive_depth @receive_depth end |
#wallet ⇒ Object
Returns the value of attribute wallet.
16 17 18 |
# File 'lib/tapyrus/wallet/account.rb', line 16 def wallet @wallet end |
Class Method Details
.parse_from_payload(payload) ⇒ Object
29 30 31 32 33 34 35 36 37 38 39 40 41 |
# File 'lib/tapyrus/wallet/account.rb', line 29 def self.parse_from_payload(payload) buf = StringIO.new(payload) account_key = Tapyrus::ExtPubkey.parse_from_payload(buf.read(78)) payload = buf.read name, payload = Tapyrus.unpack_var_string(payload) name = name.force_encoding("utf-8") purpose, index, receive_depth, change_depth, lookahead = payload.unpack("I*") a = Account.new(account_key, purpose, index, name) a.receive_depth = receive_depth a.change_depth = change_depth a.lookahead = lookahead a end |
Instance Method Details
#create_change ⇒ Tapyrus::ExtPubkey
create new change key
65 66 67 68 69 |
# File 'lib/tapyrus/wallet/account.rb', line 65 def create_change @change_depth += 1 save save_key(1, @change_depth, derive_key(1, @change_depth)) end |
#create_receive ⇒ Tapyrus::ExtPubkey
create new receive key
57 58 59 60 61 |
# File 'lib/tapyrus/wallet/account.rb', line 57 def create_receive @receive_depth += 1 save save_key(0, @receive_depth, derive_key(0, @receive_depth)) end |
#derived_change_keys ⇒ Array[Tapyrus::ExtPubkey]
get the list of derived keys for change key.
93 94 95 |
# File 'lib/tapyrus/wallet/account.rb', line 93 def derived_change_keys (change_depth + 1).times.map { |i| derive_key(1, i) } end |
#derived_receive_keys ⇒ Array[Tapyrus::ExtPubkey]
get the list of derived keys for receive key.
87 88 89 |
# File 'lib/tapyrus/wallet/account.rb', line 87 def derived_receive_keys (receive_depth + 1).times.map { |i| derive_key(0, i) } end |
#path ⇒ Object
account derivation path
112 113 114 |
# File 'lib/tapyrus/wallet/account.rb', line 112 def path "m/#{purpose}'/#{Tapyrus.chain_params.bip44_coin_type}'/#{index}'" end |
#save ⇒ Object
save this account payload to database.
72 73 74 75 76 |
# File 'lib/tapyrus/wallet/account.rb', line 72 def save wallet.db.save_account(self) save_key(0, receive_depth, derive_key(0, receive_depth)) if receive_depth.zero? save_key(1, change_depth, derive_key(1, change_depth)) if change_depth.zero? end |
#save_key(purpose, index, key) ⇒ Object
81 82 83 |
# File 'lib/tapyrus/wallet/account.rb', line 81 def save_key(purpose, index, key) wallet.db.save_key(self, purpose, index, key) end |
#to_h ⇒ Object
126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 |
# File 'lib/tapyrus/wallet/account.rb', line 126 def to_h { name: name, type: type, index: index, receive_depth: receive_depth, change_depth: change_depth, look_ahead: lookahead, receive_address: derive_key(0, receive_depth).addr, change_address: derive_key(1, change_depth).addr, account_key: account_key.to_base58, path: path, watch_only: watch_only } end |
#to_payload ⇒ Object
43 44 45 46 47 48 |
# File 'lib/tapyrus/wallet/account.rb', line 43 def to_payload payload = account_key.to_payload payload << Tapyrus.pack_var_string(name.unpack("H*").first.htb) payload << [purpose, index, receive_depth, change_depth, lookahead].pack("I*") payload end |
#type ⇒ Object
get account type label.
98 99 100 101 102 103 104 105 106 107 108 109 |
# File 'lib/tapyrus/wallet/account.rb', line 98 def type case purpose when PURPOSE_TYPE[:legacy] "pubkeyhash" when PURPOSE_TYPE[:nested_witness] "p2wpkh-p2sh" when PURPOSE_TYPE[:native_segwit] "p2wpkh" else "unknown" end end |
#watch_only ⇒ Object
116 117 118 |
# File 'lib/tapyrus/wallet/account.rb', line 116 def watch_only false # TODO implements import watch only address. end |
#watch_targets ⇒ Array[String]
get data elements tobe monitored with Bloom Filter.
122 123 124 |
# File 'lib/tapyrus/wallet/account.rb', line 122 def watch_targets wallet.db.get_keys(self).map { |key| Tapyrus.hash160(key) } end |
#witness? ⇒ Boolean
whether support witness
51 52 53 |
# File 'lib/tapyrus/wallet/account.rb', line 51 def witness? [PURPOSE_TYPE[:nested_witness], PURPOSE_TYPE[:native_segwit]].include?(purpose) end |