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
  if @script.is_multisig?
    @script.get_multisig_addresses.each do |address|
      return nil if address.nil?
    end
  end
  script_to_address(@script)
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 83
def oa_address
  a = address
  return nil if a.nil?
  if a.is_a?(Array)
    a.map{|btc_address| address_to_oa_address(btc_address)}
  else
    address_to_oa_address(a)
  end
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 94
def script_type
  case @script.type
    when :hash160
      'pubkeyhash'
    when :pubkey
      'pubkey'
    when :multisig
      'multisig'
    when :p2sh
      'scripthash'
    when :op_return
      'nulldata'
    when :witness_v0_keyhash
      'witness_v0_keyhash'
    when :witness_v0_scripthash
      'witness_v0_scripthash'
    when :unknown
      'nonstandard'
    else
      'nonstandard'
  end
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 147
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 122
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 137
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 143
def valid_asset_definition?
  !@asset_definition.nil? && @asset_definition.include_asset_id?(@asset_id)
end