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/web3ethereum/abi/type.rb, line 66 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/web3ethereum/abi/type.rb, line 13 def parse(type) _, 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 'string' raise ParseError, "String type must have no suffix or numerical suffix" unless sub.empty? when 'bytes' 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/low sizes must be multiples of 8" unless high % 8 == 0 && low % 8 == 0 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/web3ethereum/abi/type.rb, line 53 def size_type @size_type ||= new('uint', 256, []) end
Public Instance Methods
==(another_type)
click to toggle source
# File lib/web3ethereum/abi/type.rb, line 72 def ==(another_type) base == another_type.base && sub == another_type.sub && dims == another_type.dims end
dynamic?()
click to toggle source
# File lib/web3ethereum/abi/type.rb, line 100 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/web3ethereum/abi/type.rb, line 84 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/web3ethereum/abi/type.rb, line 112 def subtype @subtype ||= self.class.new(base, sub, dims[0...-1]) end