class EthereumContractABI::Encoders::FunctionEncoder

Public Class Methods

new(function_inputs) click to toggle source
# File lib/ethereum-contract-abi/encoders/function_encoder.rb, line 7
def initialize(function_inputs)
  @function_inputs = function_inputs
end

Public Instance Methods

encode_dynamic_input(input_values) click to toggle source
# File lib/ethereum-contract-abi/encoders/function_encoder.rb, line 11
def encode_dynamic_input(input_values)
  tail = encode_tail(input_values)
  tail_offsets = get_tail_offsets(input_values)
  head = @function_inputs.zip(input_values).map do |input, arg|
    if !input.type.is_dynamic
      input.encode_value(arg)
    else
      EthereumContractABI::Encoders::IntEncoder.encode(tail_offsets.shift)
    end
  end
  head.join('') + tail.join('')
end
encode_static_input(input_values) click to toggle source
# File lib/ethereum-contract-abi/encoders/function_encoder.rb, line 24
def encode_static_input(input_values)
  @function_inputs.zip(input_values).map do |input, arg|
    input.encode_value(arg)
  end.join('')
end

Private Instance Methods

encode_tail(input_values) click to toggle source
# File lib/ethereum-contract-abi/encoders/function_encoder.rb, line 45
def encode_tail(input_values)
  @function_inputs.zip(input_values).map do |input, arg|
    return unless input.type.is_dynamic
    input.encode_value(arg)
  end
end
get_tail_offsets(input_values) click to toggle source
# File lib/ethereum-contract-abi/encoders/function_encoder.rb, line 36
def get_tail_offsets(input_values)
  offset = head_length_in_bytes
  encode_tail(input_values).map do |item|
    item_offset = offset
    offset += item.bytesize
    item_offset
  end
end
head_length_in_bytes() click to toggle source
# File lib/ethereum-contract-abi/encoders/function_encoder.rb, line 32
def head_length_in_bytes
  @function_inputs.size * 32
end