class Zold::Txn

A single transaction

Constants

ISO8601
PTN

Pattern to match the transaction from text

REGEX_DETAILS

To validate details

REGEX_PREFIX

To validate the prefix

RE_DETAILS

Regular expression for details

RE_PREFIX

Regular expression for prefix

Attributes

amount[RW]
bnf[RW]
date[R]
details[R]
id[R]
prefix[R]
sign[RW]

Public Class Methods

new(id, date, amount, prefix, bnf, details) click to toggle source

Make a new object of this class (you must read the White Paper in order to understand this class).

id

is the ID of the transaction, an integer

date

is the date/time of the transaction

amount

is the amount, an instance of class Amount

prefix

is the prefix from the Invoice (read the WP)

bnf

is the wallet ID of the paying or receiving wallet

details

is the details, in plain text

# File lib/zold/txn.rb, line 68
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.utc.iso8601}" 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.inspect}" if prefix.length < 8
  raise "Prefix is too long: #{prefix.inspect}" if prefix.length > 32
  raise "Prefix is wrong: #{prefix.inspect} (#{RE_PREFIX})" unless REGEX_PREFIX.match?(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.inspect}" if details.length > 512
  raise "Wrong details #{details.inspect} (#{RE_DETAILS})" unless REGEX_DETAILS.match?(details)
  @details = details
end
parse(line, idx = 0) click to toggle source
# File lib/zold/txn.rb, line 167
def self.parse(line, idx = 0)
  clean = line.strip
  parts = PTN.match(clean)
  raise CantParse, "Invalid line ##{idx}: #{line.inspect} (doesn't match #{PTN})" unless parts
  txn = Txn.new(
    Hexnum.parse(parts[:id]).to_i,
    parse_time(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
parse_time(iso) click to toggle source
# File lib/zold/txn.rb, line 198
def self.parse_time(iso)
  parts = ISO8601.match(iso)
  raise CantParseTime, "Invalid ISO 8601 date \"#{iso}\"" if parts.nil?
  Time.gm(
    parts[:year].to_i, parts[:month].to_i, parts[:day].to_i,
    parts[:hours].to_i, parts[:minutes].to_i, parts[:seconds].to_i
  )
end

Public Instance Methods

<=>(other) click to toggle source
# File lib/zold/txn.rb, line 101
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) click to toggle source
# File lib/zold/txn.rb, line 95
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) click to toggle source
# File lib/zold/txn.rb, line 135
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) click to toggle source

Sign the transaction and add RSA signature to it

pvt

The private RSA key of the paying wallet

id

Paying wallet ID

# File lib/zold/txn.rb, line 147
def signed(pvt, id)
  t = clone
  t.sign = Signature.new.sign(pvt, id, self)
  t
end
to_json() click to toggle source
# File lib/zold/txn.rb, line 118
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_s() click to toggle source
# File lib/zold/txn.rb, line 106
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_text() click to toggle source
# File lib/zold/txn.rb, line 130
def to_text
  start = @amount.negative? ? "##{@id}" : "(#{@id})"
  "#{start} #{@date.utc.iso8601} #{@amount} #{@bnf} #{@details}"
end