Class: Zold::Wallet
- Inherits:
-
Object
- Object
- Zold::Wallet
- Defined in:
- lib/zold/wallet.rb
Overview
A single wallet
Constant Summary collapse
- MAIN_NETWORK =
The name of the main production network. All other networks must have different names.
'zold'.freeze
Instance Method Summary collapse
- #==(other) ⇒ Object
- #add(txn) ⇒ Object
-
#age ⇒ Object
Age of wallet in hours.
- #balance ⇒ Object
- #exists? ⇒ Boolean
- #has?(id, bnf) ⇒ Boolean
- #id ⇒ Object
- #income ⇒ Object
- #init(id, pubkey, overwrite: false, network: 'test') ⇒ Object
-
#initialize(file) ⇒ Wallet
constructor
A new instance of Wallet.
- #key ⇒ Object
- #network ⇒ Object
- #path ⇒ Object
- #root? ⇒ Boolean
- #sub(amount, invoice, pvt, details = '-') ⇒ Object
- #to_s ⇒ Object
- #txns ⇒ Object
- #version ⇒ Object
Constructor Details
#initialize(file) ⇒ Wallet
Returns a new instance of Wallet.
46 47 48 |
# File 'lib/zold/wallet.rb', line 46 def initialize(file) @file = file end |
Instance Method Details
#==(other) ⇒ Object
50 51 52 |
# File 'lib/zold/wallet.rb', line 50 def ==(other) to_s == other.to_s end |
#add(txn) ⇒ Object
117 118 119 120 121 122 123 |
# File 'lib/zold/wallet.rb', line 117 def add(txn) raise 'The txn has to be of type Txn' unless txn.is_a?(Txn) dup = txns.find { |t| t.bnf == txn.bnf && t.id == txn.id } raise "The transaction with the same ID and BNF already exists: #{dup}" unless dup.nil? raise "The tax payment already exists: #{txn}" if Tax.new(self).exists?(txn) File.open(@file, 'a') { |f| f.print "#{txn}\n" } end |
#age ⇒ Object
Age of wallet in hours
142 143 144 145 |
# File 'lib/zold/wallet.rb', line 142 def age list = txns list.empty? ? 0 : (Time.now - list.min_by(&:date).date) / 60 end |
#balance ⇒ Object
92 93 94 |
# File 'lib/zold/wallet.rb', line 92 def balance txns.inject(Amount::ZERO) { |sum, t| sum + t.amount } end |
#exists? ⇒ Boolean
70 71 72 |
# File 'lib/zold/wallet.rb', line 70 def exists? File.exist?(@file) end |
#has?(id, bnf) ⇒ Boolean
125 126 127 128 129 |
# File 'lib/zold/wallet.rb', line 125 def has?(id, bnf) raise 'The txn ID has to be of type Integer' unless id.is_a?(Integer) raise 'The bnf has to be of type Id' unless bnf.is_a?(Id) !txns.find { |t| t.id == id && t.bnf == bnf }.nil? end |
#income ⇒ Object
135 136 137 138 139 |
# File 'lib/zold/wallet.rb', line 135 def income txns.each do |t| yield t unless t.amount.negative? end end |
#init(id, pubkey, overwrite: false, network: 'test') ⇒ Object
78 79 80 81 82 |
# File 'lib/zold/wallet.rb', line 78 def init(id, pubkey, overwrite: false, network: 'test') raise "File '#{@file}' already exists" if File.exist?(@file) && !overwrite raise "Invalid network name '#{network}'" unless network =~ /^[a-z]{4,16}$/ File.write(@file, "#{network}\n#{VERSION}\n#{id}\n#{pubkey.to_pub}\n\n") end |
#key ⇒ Object
131 132 133 |
# File 'lib/zold/wallet.rb', line 131 def key Key.new(text: lines[3].strip) end |
#network ⇒ Object
58 59 60 61 62 |
# File 'lib/zold/wallet.rb', line 58 def network n = lines[0].strip raise "Invalid network name '#{n}'" unless n =~ /^[a-z]{4,16}$/ n end |
#path ⇒ Object
74 75 76 |
# File 'lib/zold/wallet.rb', line 74 def path @file end |
#sub(amount, invoice, pvt, details = '-') ⇒ Object
96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 |
# File 'lib/zold/wallet.rb', line 96 def sub(amount, invoice, pvt, details = '-') raise 'The amount has to be of type Amount' unless amount.is_a?(Amount) raise "The amount can't be negative: #{amount}" if amount.negative? raise 'The pvt has to be of type Key' unless pvt.is_a?(Key) prefix, target = invoice.split('@') tid = max + 1 raise 'Too many transactions already, can\'t add more' if max > 0xffff txn = Txn.new( tid, Time.now, amount * -1, prefix, Id.new(target), details ) txn = txn.signed(pvt, id) raise 'This is not the private right key for this wallet' unless Signature.new.valid?(key, id, txn) add(txn) txn end |
#to_s ⇒ Object
54 55 56 |
# File 'lib/zold/wallet.rb', line 54 def to_s id.to_s end |
#txns ⇒ Object
147 148 149 150 151 152 |
# File 'lib/zold/wallet.rb', line 147 def txns lines.drop(5) .each_with_index .map { |line, i| Txn.parse(line, i + 6) } .sort_by(&:date) end |
#version ⇒ Object
64 65 66 67 68 |
# File 'lib/zold/wallet.rb', line 64 def version v = lines[1].strip raise "Invalid version name '#{v}'" unless v =~ /^[0-9]+(\.[0-9]+){1,2}$/ v end |