Class: Zold::Txn

Inherits:
Object
  • Object
show all
Defined in:
lib/zold/txn.rb

Overview

A single transaction

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(id, date, amount, prefix, bnf, details) ⇒ Txn

Returns a new instance of Txn.



47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/zold/txn.rb', line 47

def initialize(id, date, amount, prefix, bnf, details)
  raise 'The ID can\'t be NIL' if id.nil?
  raise "ID of transaction can't be negative: #{id}" if id < 1
  @id = id
  raise 'The time can\'t be NIL' if date.nil?
  raise 'Time have to be of type Time' unless date.is_a?(Time)
  raise "Time can't be in the future: #{date}" if date > Time.now
  @date = date
  raise 'The amount can\'t be NIL' if amount.nil?
  raise 'The amount has to be of type Amount' unless amount.is_a?(Amount)
  raise 'The amount can\'t be zero' if amount.zero?
  @amount = amount
  raise 'The bnf can\'t be NIL' if bnf.nil?
  raise 'The bnf has to be of type Id' unless bnf.is_a?(Id)
  @bnf = bnf
  raise 'Prefix can\'t be NIL' if prefix.nil?
  raise "Prefix is too short: \"#{prefix}\"" if prefix.length < 8
  raise "Prefix is too long: \"#{prefix}\"" if prefix.length > 32
  raise "Prefix is wrong: \"#{prefix}\" (#{RE_PREFIX})" unless prefix =~ Regexp.new("^#{RE_PREFIX}$")
  @prefix = prefix
  raise 'Details can\'t be NIL' if details.nil?
  raise 'Details can\'t be empty' if details.empty?
  raise "Details are too long: \"#{details}\"" if details.length > 512
  raise "Wrong details \"#{details}\" (#{RE_DETAILS})" unless details =~ Regexp.new("^#{RE_DETAILS}$")
  @details = details
end

Instance Attribute Details

#amountObject

Returns the value of attribute amount.



45
46
47
# File 'lib/zold/txn.rb', line 45

def amount
  @amount
end

#bnfObject

Returns the value of attribute bnf.



45
46
47
# File 'lib/zold/txn.rb', line 45

def bnf
  @bnf
end

#dateObject (readonly)

Returns the value of attribute date.



45
46
47
# File 'lib/zold/txn.rb', line 45

def date
  @date
end

#detailsObject (readonly)

Returns the value of attribute details.



45
46
47
# File 'lib/zold/txn.rb', line 45

def details
  @details
end

#idObject (readonly)

Returns the value of attribute id.



45
46
47
# File 'lib/zold/txn.rb', line 45

def id
  @id
end

#prefixObject (readonly)

Returns the value of attribute prefix.



45
46
47
# File 'lib/zold/txn.rb', line 45

def prefix
  @prefix
end

#signObject

Returns the value of attribute sign.



45
46
47
# File 'lib/zold/txn.rb', line 45

def sign
  @sign
end

Class Method Details

.parse(line, idx = 0) ⇒ Object



146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
# File 'lib/zold/txn.rb', line 146

def self.parse(line, idx = 0)
  clean = line.strip
  parts = PTN.match(clean)
  raise "Invalid line ##{idx}: #{line.inspect} #{regex}" unless parts
  txn = Txn.new(
    Hexnum.parse(parts[:id]).to_i,
    Time.parse(parts[:date]),
    Amount.new(zents: Hexnum.parse(parts[:amount]).to_i),
    parts[:prefix],
    Id.new(parts[:bnf]),
    parts[:details]
  )
  txn.sign = parts[:sign]
  txn
end

Instance Method Details

#<=>(other) ⇒ Object



80
81
82
83
# File 'lib/zold/txn.rb', line 80

def <=>(other)
  raise 'Can only compare with Txn' unless other.is_a?(Txn)
  [date, amount * -1, id, bnf] <=> [other.date, other.amount * -1, other.id, other.bnf]
end

#==(other) ⇒ Object



74
75
76
77
78
# File 'lib/zold/txn.rb', line 74

def ==(other)
  id == other.id && date == other.date && amount == other.amount &&
    prefix == other.prefix && bnf == other.bnf &&
    details == other.details && sign == other.sign
end

#inverse(bnf) ⇒ Object



114
115
116
117
118
119
120
121
# File 'lib/zold/txn.rb', line 114

def inverse(bnf)
  raise 'You can\'t reverse a positive transaction' unless amount.negative?
  t = clone
  t.amount = amount * -1
  t.bnf = bnf
  t.sign = ''
  t
end

#signed(pvt, id) ⇒ Object

Sign the transaction and add RSA signature to it

pvt

The private RSA key of the paying wallet

id

Paying wallet ID



126
127
128
129
130
# File 'lib/zold/txn.rb', line 126

def signed(pvt, id)
  t = clone
  t.sign = Signature.new.sign(pvt, id, self)
  t
end

#to_jsonObject



97
98
99
100
101
102
103
104
105
106
107
# File 'lib/zold/txn.rb', line 97

def to_json
  {
    id: @id,
    date: @date.utc.iso8601,
    amount: @amount.to_i,
    prefix: @prefix,
    bnf: @bnf.to_s,
    details: @details,
    sign: @sign
  }
end

#to_sObject



85
86
87
88
89
90
91
92
93
94
95
# File 'lib/zold/txn.rb', line 85

def to_s
  [
    Hexnum.new(@id, 4).to_s,
    @date.utc.iso8601,
    Hexnum.new(@amount.to_i, 16),
    @prefix,
    @bnf,
    @details,
    @sign
  ].join(';')
end

#to_textObject



109
110
111
112
# File 'lib/zold/txn.rb', line 109

def to_text
  start = @amount.negative? ? "##{@id}" : '-'
  "#{start} #{@date.utc.iso8601} #{@amount} #{@bnf} #{@details}"
end