Class: Zold::Txn

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

Overview

A single transaction

Constant Summary collapse

RE_DETAILS =

Regular expression for details

'[a-zA-Z0-9 @\!\?\*_\-\.:,\']+'.freeze
RE_PREFIX =

Regular expression for prefix

'[a-zA-Z0-9]+'.freeze

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.



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

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}\" (#{Txn::RE_PREFIX})" unless prefix =~ Regexp.new("^#{Txn::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}\" (#{Txn::RE_DETAILS})" unless details =~ Regexp.new("^#{Txn::RE_DETAILS}$")
  @details = details
end

Instance Attribute Details

#amountObject

Returns the value of attribute amount.



41
42
43
# File 'lib/zold/txn.rb', line 41

def amount
  @amount
end

#bnfObject

Returns the value of attribute bnf.



41
42
43
# File 'lib/zold/txn.rb', line 41

def bnf
  @bnf
end

#dateObject (readonly)

Returns the value of attribute date.



41
42
43
# File 'lib/zold/txn.rb', line 41

def date
  @date
end

#detailsObject (readonly)

Returns the value of attribute details.



41
42
43
# File 'lib/zold/txn.rb', line 41

def details
  @details
end

#idObject (readonly)

Returns the value of attribute id.



41
42
43
# File 'lib/zold/txn.rb', line 41

def id
  @id
end

#prefixObject (readonly)

Returns the value of attribute prefix.



41
42
43
# File 'lib/zold/txn.rb', line 41

def prefix
  @prefix
end

#signObject

Returns the value of attribute sign.



41
42
43
# File 'lib/zold/txn.rb', line 41

def sign
  @sign
end

Class Method Details

.parse(line, idx = 0) ⇒ Object



108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
# File 'lib/zold/txn.rb', line 108

def self.parse(line, idx = 0)
  regex = Regexp.new(
    '^' + [
      '([0-9a-f]{4})',
      '([0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}Z)',
      '([0-9a-f]{16})',
      "(#{Txn::RE_PREFIX})",
      '([0-9a-f]{16})',
      "(#{Txn::RE_DETAILS})",
      '([A-Za-z0-9+/]+={0,3})?'
    ].join(';') + '$'
  )
  clean = line.strip
  raise "Invalid line ##{idx}: #{line.inspect} #{regex}" unless regex.match(clean)
  parts = clean.split(';')
  txn = Txn.new(
    Hexnum.parse(parts[0]).to_i,
    Time.parse(parts[1]),
    Amount.new(coins: Hexnum.parse(parts[2]).to_i),
    parts[3],
    Id.new(parts[4]),
    parts[5]
  )
  txn.sign = parts[6]
  txn
end

Instance Method Details

#==(other) ⇒ Object



70
71
72
73
74
# File 'lib/zold/txn.rb', line 70

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



93
94
95
96
97
98
99
100
# File 'lib/zold/txn.rb', line 93

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



102
103
104
105
106
# File 'lib/zold/txn.rb', line 102

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

#to_sObject



76
77
78
79
80
81
82
83
84
85
86
# File 'lib/zold/txn.rb', line 76

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



88
89
90
91
# File 'lib/zold/txn.rb', line 88

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