Class: Ethereum::ABI::Type
- Inherits:
-
Object
- Object
- Ethereum::ABI::Type
- Defined in:
- lib/ethereum/abi/type.rb
Defined Under Namespace
Classes: ParseError
Instance Attribute Summary collapse
-
#base ⇒ Object
readonly
Returns the value of attribute base.
-
#dims ⇒ Object
readonly
Returns the value of attribute dims.
-
#sub ⇒ Object
readonly
Returns the value of attribute sub.
Class Method Summary collapse
-
.parse(type) ⇒ Object
Crazy regexp to seperate out base type component (eg. uint), size (eg. 256, 128x128, nil), array component (eg. [], [45], nil).
- .size_type ⇒ Object
Instance Method Summary collapse
- #==(another_type) ⇒ Object
- #dynamic? ⇒ Boolean
-
#initialize(base, sub, dims) ⇒ Type
constructor
A new instance of Type.
-
#size ⇒ Integer, NilClass
Get the static size of a type, or nil if dynamic.
-
#subtype ⇒ Ethereum::ABI::Type
Type with one dimension lesser.
Constructor Details
#initialize(base, sub, dims) ⇒ Type
Returns a new instance of Type.
65 66 67 68 69 |
# File 'lib/ethereum/abi/type.rb', line 65 def initialize(base, sub, dims) @base = base @sub = sub @dims = dims end |
Instance Attribute Details
#base ⇒ Object (readonly)
Returns the value of attribute base.
57 58 59 |
# File 'lib/ethereum/abi/type.rb', line 57 def base @base end |
#dims ⇒ Object (readonly)
Returns the value of attribute dims.
57 58 59 |
# File 'lib/ethereum/abi/type.rb', line 57 def dims @dims end |
#sub ⇒ Object (readonly)
Returns the value of attribute sub.
57 58 59 |
# File 'lib/ethereum/abi/type.rb', line 57 def sub @sub end |
Class Method Details
.parse(type) ⇒ Object
Crazy regexp to seperate out base type component (eg. uint), size (eg. 256, 128x128, nil), array component (eg. [], [45], nil)
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
# File 'lib/ethereum/abi/type.rb', line 14 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 '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 'ureal', 'real', 'fixed', 'ufixed' raise ParseError, "Real 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, "Real size out of bounds (max 32 bytes)" unless total >= 8 && total <= 256 raise ParseError, "Real 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 ⇒ Object
52 53 54 |
# File 'lib/ethereum/abi/type.rb', line 52 def size_type @size_type ||= new('uint', 256, []) end |
Instance Method Details
#==(another_type) ⇒ Object
71 72 73 74 75 |
# File 'lib/ethereum/abi/type.rb', line 71 def ==(another_type) base == another_type.base && sub == another_type.sub && dims == another_type.dims end |
#dynamic? ⇒ Boolean
99 100 101 |
# File 'lib/ethereum/abi/type.rb', line 99 def dynamic? size.nil? end |
#size ⇒ Integer, NilClass
Get the static size of a type, or nil if dynamic.
83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 |
# File 'lib/ethereum/abi/type.rb', line 83 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 ⇒ Ethereum::ABI::Type
Type with one dimension lesser.
111 112 113 |
# File 'lib/ethereum/abi/type.rb', line 111 def subtype @subtype ||= self.class.new(base, sub, dims[0...-1]) end |