class OpenAssets::Payload

the open assets payload

Attributes

metadata[RW]
quantities[RW]

Public Class Methods

new(quantities = [], metadata = '') click to toggle source
# File lib/openassets/payload.rb, line 12
def initialize(quantities = [], metadata = '')
  @quantities = quantities
  @metadata = metadata
end
parse_from_payload(payload) click to toggle source

parse open assets payload @return [Payload] a open assets payload object, if payload is invalid, return nil.

# File lib/openassets/payload.rb, line 19
def self.parse_from_payload(payload)
  buf = StringIO.new(payload)
  marker = buf.read(2)
  version = buf.read(2)
  return nil if marker != MARKER || version != VERSION
  count = Tapyrus.unpack_var_int_from_io(buf)
  return nil unless count
  quantities = []
  count.times { quantities << LEB128.decode_unsigned(buf, buf.pos) }
  metadata_length = Tapyrus.unpack_var_int_from_io(buf)
  return nil if metadata_length.nil? || buf.length < metadata_length + buf.pos
  metadata = buf.read(metadata_length).each_byte.map(&:chr).join
  new(quantities, metadata)
rescue StandardError
  # LEB128#decode_unsigned raise 'undefined method `unpack' for nil:NilClass'
  # for invalid format such as "018f8f" (the most significant bit of the last byte should be 0)
  nil
end

Public Instance Methods

to_payload() click to toggle source

generate binary payload

# File lib/openassets/payload.rb, line 39
def to_payload
  payload = String.new
  payload << MARKER
  payload << VERSION
  payload << Tapyrus.pack_var_int(quantities.size) << quantities.map { |q| LEB128.encode_unsigned(q).read }.join
  payload << Tapyrus.pack_var_int(metadata.length) << metadata.bytes.map { |b| sprintf('%02x', b) }.join.htb
  payload
end