class EvmClient::Encoder

Public Instance Methods

do_encode_fixed(value, n) click to toggle source
# File lib/evm_client/encoder.rb, line 48
def do_encode_fixed(value, n)
  encode_uint((value * 2**n).to_i)
end
encode(type, value) click to toggle source
# File lib/evm_client/encoder.rb, line 5
def encode(type, value)
  is_array, arity, array_subtype = Abi::parse_array_type(type)
  if is_array && arity
    encode_static_array(arity, array_subtype, value)
  elsif is_array
    encode_dynamic_array(array_subtype, value)
  else
    core, subtype = Abi::parse_type(type)
    method_name = "encode_#{core}".to_sym
    self.send(method_name, value, subtype)
  end
end
encode_address(value, _) click to toggle source
# File lib/evm_client/encoder.rb, line 78
def encode_address(value, _)
  value = "0" * 24 + value.gsub(/^0x/,'')
  raise ArgumentError if value.size != 64
  value
end
encode_arguments(inputs, args) click to toggle source
# File lib/evm_client/encoder.rb, line 88
def encode_arguments(inputs, args)
  raise "Wrong number of arguments" if inputs.length != args.length
  @head = ""
  @tail = ""
  @inputs = inputs
  inputs.each.with_index do |input, index|
    encoded = encode(input.type, args[index])
    if encoded.is_a? Array
      @head << encoded[0]
      @tail << encoded[1]
    else
      @head << encoded
    end
  end
  @head + @tail
end
encode_bool(value, _) click to toggle source
# File lib/evm_client/encoder.rb, line 39
def encode_bool(value, _)
  (value ? "1" : "0").rjust(64, '0')
end
encode_bytes(value, subtype) click to toggle source
# File lib/evm_client/encoder.rb, line 56
def encode_bytes(value, subtype)
  subtype.nil? ? encode_dynamic_bytes(value) : encode_static_bytes(value)
end
encode_dynamic_array(array_subtype, array) click to toggle source
# File lib/evm_client/encoder.rb, line 23
def encode_dynamic_array(array_subtype, array)
  location = encode_uint(@inputs ? size_of_inputs(@inputs) + @tail.size/2 : 32)
  size = encode_uint(array.size)
  data = array.inject("") { |a, e| a << encode(array_subtype, e) }
  [location, size + data]
end
encode_dynamic_bytes(value) click to toggle source
# File lib/evm_client/encoder.rb, line 64
def encode_dynamic_bytes(value)
  location = encode_uint(@inputs ? size_of_inputs(@inputs) + @tail.size/2 : 32)
  size = encode_uint(value.size)
  content = encode_static_bytes(value)
  [location, size + content]
end
encode_fixed(value, subtype) click to toggle source
# File lib/evm_client/encoder.rb, line 43
def encode_fixed(value, subtype)
  n = subtype.nil? ? 128 : /(\d+)x(\d+)/.match(subtype)[2].to_i
  do_encode_fixed(value, n)
end
encode_int(value, _ = nil) click to toggle source
# File lib/evm_client/encoder.rb, line 30
def encode_int(value, _ = nil)
  to_twos_complement(value).to_s(16).rjust(64, '0')
end
encode_static_array(arity, array_subtype, array) click to toggle source
# File lib/evm_client/encoder.rb, line 18
def encode_static_array(arity, array_subtype, array)
  raise "Wrong number of arguments" if arity != array.size
  array.inject("") { |a, e| a << encode(array_subtype, e) }
end
encode_static_bytes(value) click to toggle source
# File lib/evm_client/encoder.rb, line 60
def encode_static_bytes(value)
  value.bytes.map {|x| x.to_s(16).rjust(2, '0')}.join("").ljust(64, '0')
end
encode_string(value, _) click to toggle source
# File lib/evm_client/encoder.rb, line 71
def encode_string(value, _)
  location = encode_uint(@inputs ? size_of_inputs(@inputs) + @tail.size/2 : 32)
  size = encode_uint(value.bytes.size)
  content = value.bytes.map {|x| x.to_s(16).rjust(2, '0')}.join("").ljust(64, '0')
  [location, size + content]
end
encode_ufixed(_value, _) click to toggle source
# File lib/evm_client/encoder.rb, line 52
def encode_ufixed(_value, _)
  raise NotImplementedError
end
encode_uint(value, _ = nil) click to toggle source
# File lib/evm_client/encoder.rb, line 34
def encode_uint(value, _ = nil)
  raise ArgumentError if value < 0
  encode_int(value)
end
ensure_prefix(value) click to toggle source
# File lib/evm_client/encoder.rb, line 84
def ensure_prefix(value)
  value.start_with?("0x") ? value : ("0x" + value)
end

Private Instance Methods

size_of_inputs(inputs) click to toggle source
# File lib/evm_client/encoder.rb, line 110
def size_of_inputs(inputs)
  inputs.map do |input|
    _, arity, _ = Abi::parse_array_type(input.type)
    arity.nil? ? 32 : arity * 32
  end.inject(:+)
end
to_twos_complement(number) click to toggle source
# File lib/evm_client/encoder.rb, line 106
def to_twos_complement(number)
  (number & ((1 << 256) - 1))
end