class Web3::Eth::Abi::Type

Attributes

base[RW]

Public Class Methods

new(base, sub, dims) click to toggle source

@param base [String] base name of type, e.g. uint for uint256 @param sub [String] subscript of type, e.g. 256 for uint256 @param dims [Array] dimensions of array type, e.g. [1,2,0]

for uint256[1][2][], [] for non-array type
# File lib/web3/eth/abi/type.rb, line 72
def initialize(base, sub, dims)
  @base = base
  @sub = sub
  @dims = dims
end
parse(type) click to toggle source

Crazy regexp to seperate out base type component (eg. uint), size (eg. 256, 128x128, nil), array component (eg. [], [45], nil)

# File lib/web3/eth/abi/type.rb, line 13
def parse(type)

  return parse('uint256') if type=='trcToken'
  
  if type =~ /^\((.*)\)((\[[0-9]*\])*)/
    return Tuple.parse $1, $2.scan(/\[[0-9]*\]/)
  end

  _, base, sub, dimension = /([a-z]*)([0-9]*x?[0-9]*)((\[[0-9]*\])*)/.match(type).to_a

  dims = dimension.scan(/\[[0-9]*\]/)
  raise ParseError, "Unknown characters found in array declaration" if dims.join != dimension

  case base
    when ''
      return parse 'address'
    when 'bytes', 'string'
      raise ParseError, "Maximum 32 bytes for fixed-length string or bytes" unless sub.empty? || sub.to_i <= 32
    when 'uint', 'int'
      raise ParseError, "Integer type must have numerical suffix" unless sub =~ /\A[0-9]+\z/

      size = sub.to_i
      raise ParseError, "Integer size out of bounds" unless size >= 8 && size <= 256
      raise ParseError, "Integer size must be multiple of 8" unless size % 8 == 0
    when 'fixed', 'ufixed'
      raise ParseError, "Fixed type must have suffix of form <high>x<low>, e.g. 128x128" unless sub =~ /\A[0-9]+x[0-9]+\z/

      high, low = sub.split('x').map(&:to_i)
      total = high + low

      raise ParseError, "Fixed size out of bounds (max 32 bytes)" unless total >= 8 && total <= 256
      raise ParseError, "Fixed high size must be multiple of 8" unless high % 8 == 0
      raise ParseError, "Low sizes must be 0 to 80" unless low>0 && low<=80
    when 'hash'
      raise ParseError, "Hash type must have numerical suffix" unless sub =~ /\A[0-9]+\z/
    when 'address'
      raise ParseError, "Address cannot have suffix" unless sub.empty?
    when 'bool'
      raise ParseError, "Bool cannot have suffix" unless sub.empty?
    else
      raise ParseError, "Unrecognized type base: #{base}"
  end

  new(base, sub, dims.map {|x| x[1...-1].to_i})
end
size_type() click to toggle source
# File lib/web3/eth/abi/type.rb, line 59
def size_type
  @size_type ||= new('uint', 256, [])
end

Public Instance Methods

==(another_type) click to toggle source
# File lib/web3/eth/abi/type.rb, line 78
def ==(another_type)
  base == another_type.base &&
      sub == another_type.sub &&
      dims == another_type.dims
end
dynamic?() click to toggle source
# File lib/web3/eth/abi/type.rb, line 106
def dynamic?
  size.nil?
end
size() click to toggle source

Get the static size of a type, or nil if dynamic.

@return [Integer, NilClass] size of static type, or nil for dynamic

type
# File lib/web3/eth/abi/type.rb, line 90
def size
  @size ||= if dims.empty?
              if %w(string bytes).include?(base) && sub.empty?
                nil
              else
                32
              end
            else
              if dims.last == 0 # 0 for dynamic array []
                nil
              else
                subtype.dynamic? ? nil : dims.last * subtype.size
              end
            end
end
subtype() click to toggle source

Type with one dimension lesser.

@example

Type.parse("uint256[2][]").subtype # => Type.new('uint', 256, [2])

@return [Ethereum::ABI::Type]

# File lib/web3/eth/abi/type.rb, line 118
def subtype
  @subtype ||= self.class.new(base, sub, dims[0...-1])
end