class OpenAssets::Protocol::TransactionOutput

Represents a transaction output and its asset ID and asset quantity.

Attributes

account[RW]
asset_definition[RW]
asset_definition_url[RW]
asset_id[RW]
asset_quantity[RW]
metadata[RW]
output_type[RW]
script[RW]
value[RW]

Public Class Methods

new(value, script, asset_id = nil, asset_quantity = 0, output_type = OutputType::UNCOLORED, metadata = '') click to toggle source

@param [Integer] value The satoshi value of the output. @param [Bitcoin::Script] script The script controlling redemption of the output. @param [String] asset_id The asset ID of the output. @param [Integer] asset_quantity The asset quantity of the output. @param [OpenAssets::Transaction::OutPutType] output_type The type of the output.

# File lib/openassets/protocol/transaction_output.rb, line 26
def initialize(value, script, asset_id = nil, asset_quantity = 0, output_type = OutputType::UNCOLORED, metadata = '')
  raise ArgumentError, "invalid output_type : #{output_type}" unless OutputType.all.include?(output_type)
  raise ArgumentError, "invalid asset_quantity. asset_quantity should be unsignd integer. " unless asset_quantity.between?(0, MarkerOutput::MAX_ASSET_QUANTITY)
  @value = value
  @script = script
  @asset_id = asset_id
  @asset_quantity = asset_quantity
  @output_type = output_type
  @metadata = metadata
  load_asset_definition_url
end

Public Instance Methods

address() click to toggle source
# File lib/openassets/protocol/transaction_output.rb, line 74
def address
  return @script.addresses.first if @script.p2pkh? || @script.p2sh? || @script.p2wpkh? || @script.p2wsh?
  nil # TODO Bitcoin::Script#to_addr after it enable
end
asset_amount() click to toggle source

calculate asset amount. asset amount is the value obtained by converting the asset quantity to the unit of divisibility that are defined in the Asset definition file.

# File lib/openassets/protocol/transaction_output.rb, line 40
def asset_amount
  d = divisibility
  d > 0 ? (@asset_quantity.to_f / (10 ** d)).to_f : @asset_quantity
end
divisibility() click to toggle source

get divisibility defined by asset definition file.

# File lib/openassets/protocol/transaction_output.rb, line 46
def divisibility
  return 0 if !valid_asset_definition? || @asset_definition.divisibility.nil?
  @asset_definition.divisibility
end
oa_address() click to toggle source
# File lib/openassets/protocol/transaction_output.rb, line 79
def oa_address
  a = address
  return nil if a.nil?
  address_to_oa_address(a)
end
proof_of_authenticity() click to toggle source

Verify proof of authenticity.

# File lib/openassets/protocol/transaction_output.rb, line 52
def proof_of_authenticity
  valid_asset_definition? ? @asset_definition.proof_of_authenticity : false
end
script_type() click to toggle source

get pubkey script type

# File lib/openassets/protocol/transaction_output.rb, line 86
def script_type
  return 'pubkeyhash' if script.p2pkh?
  return 'scripthash' if script.p2sh?
  return 'nulldata' if script.standard_op_return?
  return 'multisig' if script.multisig?
  return 'witness_v0_keyhash' if script.p2wpkh?
  return 'witness_v0_scripthash' if script.p2wsh?
  'nonstandard'
end
to_hash() click to toggle source

convert to hash object.

# File lib/openassets/protocol/transaction_output.rb, line 57
def to_hash
  {
      'address' =>  address,
      'oa_address' => oa_address,
      'script' => @script.to_payload.bth,
      'script_type' => script_type,
      'amount' => satoshi_to_coin(@value),
      'asset_id' => @asset_id,
      'asset_quantity' => @asset_quantity.to_s,
      'asset_amount' => asset_amount.to_s,
      'account' => @account,
      'asset_definition_url' => @asset_definition_url,
      'proof_of_authenticity' => proof_of_authenticity,
      'output_type' => OpenAssets::Protocol::OutputType.output_type_label(@output_type)
  }
end

Private Instance Methods

load_asset_definition(url) click to toggle source
# File lib/openassets/protocol/transaction_output.rb, line 126
def load_asset_definition(url)
  unless @@definition_cache.has_key?(url)
    loader = AssetDefinitionLoader.new(metadata_url)
    @@definition_cache[url] = loader.load_definition
  end
  @@definition_cache[url]
end
load_asset_definition_url() click to toggle source

get Asset definition url that is included metadata.

# File lib/openassets/protocol/transaction_output.rb, line 101
def load_asset_definition_url
  @asset_definition_url = ''
  return if @metadata.nil? || @metadata.length == 0
  if @metadata.start_with?('u=')
    @asset_definition = load_asset_definition(metadata_url)
    if valid_asset_definition?
      @asset_definition_url = metadata_url
    else
      @asset_definition_url = "The asset definition is invalid. #{metadata_url}"
    end
  else
    @asset_definition_url = 'Invalid metadata format.'
  end
end
metadata_url() click to toggle source
# File lib/openassets/protocol/transaction_output.rb, line 116
def metadata_url
  unless @metadata.nil?
     @metadata.slice(2..-1)
  end
end
valid_asset_definition?() click to toggle source
# File lib/openassets/protocol/transaction_output.rb, line 122
def valid_asset_definition?
  !@asset_definition.nil? && @asset_definition.include_asset_id?(@asset_id)
end