Class: ItsyBtc::Wallet

Inherits:
Object
  • Object
show all
Defined in:
lib/itsy-btc/wallet.rb

Defined Under Namespace

Classes: DuplicateAddressError, WalletError, WalletReadError

Constant Summary collapse

ALGORITHM =
"aes-256-cbc"
PBKDF2_ITERATIONS =
4096
SALT_LEN =
8

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(path) ⇒ Wallet

Returns a new instance of Wallet.



15
16
17
18
# File 'lib/itsy-btc/wallet.rb', line 15

def initialize(path)
  @path = path
  @passphrase = nil
end

Instance Attribute Details

#pathObject (readonly)

Returns the value of attribute path.



13
14
15
# File 'lib/itsy-btc/wallet.rb', line 13

def path
  @path
end

Instance Method Details

#add(base58, comment = "") ⇒ Object



25
26
27
28
29
30
31
32
33
34
# File 'lib/itsy-btc/wallet.rb', line 25

def add(base58, comment = "")
  key = Bitcoin::Key.from_base58(base58)
  data = read
  raise DuplicateAddressError if data[:entries].any? { |e| e[:address] == key.addr }
  data[:entries] << { address: key.addr, comment: comment }
  keys = decrypt_keys(data[:keys])
  keys << key.to_base58
  data[:keys] = encrypt_keys(keys)
  write(data)
end

#addresses_starting_with(beginning) ⇒ Object



74
75
76
# File 'lib/itsy-btc/wallet.rb', line 74

def addresses_starting_with(beginning)
  entries.select { |e| e.address.start_with? beginning }
end

#change_passphrase(new_passphrase) ⇒ Object



59
60
61
62
63
64
65
# File 'lib/itsy-btc/wallet.rb', line 59

def change_passphrase(new_passphrase)
  data = read
  keys = decrypt_keys(data[:keys])
  @passphrase = new_passphrase
  data[:keys] = encrypt_keys(keys)
  write(data)
end

#create(passphrase) ⇒ Object



20
21
22
23
# File 'lib/itsy-btc/wallet.rb', line 20

def create(passphrase)
  @passphrase = passphrase
  write({entries: [], keys: encrypt_keys([])})
end

#entriesObject



84
85
86
87
88
89
90
91
# File 'lib/itsy-btc/wallet.rb', line 84

def entries
  read[:entries].inject([]) do |list, entry|
    e = WalletEntry.new
    e.address = entry[:address]
    e.comment = entry[:comment]
    list << e
  end
end

#entries_with_keysObject



93
94
95
96
97
98
99
100
101
102
103
# File 'lib/itsy-btc/wallet.rb', line 93

def entries_with_keys
  data = read
  keys = decrypt_keys(data[:keys])
  data[:entries].inject([]) do |list, entry|
    e = WalletEntry.new
    e.address = entry[:address]
    e.comment = entry[:comment]
    e.key = keys.shift
    list << e
  end
end

#key_for_address(address) ⇒ Object



78
79
80
81
82
# File 'lib/itsy-btc/wallet.rb', line 78

def key_for_address(address)
  if entry = entries_with_keys.find { |e| e.address == address }
    entry.key
  end
end

#remove(address) ⇒ Object



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/itsy-btc/wallet.rb', line 36

def remove(address)
  data = read
  keys = decrypt_keys(data[:keys])

  entry_index = data[:entries].index { |e| e[:address] == address }
  if entry_index
    data[:entries].delete_at(entry_index)
    keys.delete_at(entry_index)

    data[:keys] = encrypt_keys(keys)
    write(data)
    true
  else
    false
  end
end

#update_comment(address, comment) ⇒ Object



67
68
69
70
71
72
# File 'lib/itsy-btc/wallet.rb', line 67

def update_comment(address, comment)
  data = read
  entry_index = data[:entries].index { |e| e[:address] == address }
  data[:entries][entry_index][:comment] = comment
  write(data)
end

#verify_passphrase(passphrase) ⇒ Object



53
54
55
56
57
# File 'lib/itsy-btc/wallet.rb', line 53

def verify_passphrase(passphrase)
  @passphrase = passphrase
  decrypt_keys(read[:keys])
  nil
end