def process_type(typ): # Crazy reg expression to separate out base type component (eg. uint), # size (eg. 256, 128x128, none), array component (eg. [], [45], none) regexp = '([a-z]*)([0-9]*x?[0-9]*)((\[[0-9]*\])*)' base, sub, arr, _ = re.match(regexp, utils.to_string_for_regexp(typ)).groups() arrlist = re.findall('\[[0-9]*\]', arr) assert len(''.join(arrlist)) == len(arr), \ "Unknown characters found in array declaration" # Check validity of string type if base == 'string' or base == 'bytes': assert re.match('^[0-9]*$', sub), \ "String type must have no suffix or numerical suffix" # Check validity of integer type elif base == 'uint' or base == 'int': assert re.match('^[0-9]+$', sub), \ "Integer type must have numerical suffix" assert 8 <= int(sub) <= 256, \ "Integer size out of bounds" assert int(sub) % 8 == 0, \ "Integer size must be multiple of 8" # Check validity of string type if base == 'string' or base == 'bytes': assert re.match('^[0-9]*$', sub), \ "String type must have no suffix or numerical suffix" assert not sub or int(sub) <= 32, \ "Maximum 32 bytes for fixed-length str or bytes" # Check validity of real type elif base == 'ureal' or base == 'real': assert re.match('^[0-9]+x[0-9]+$', sub), \ "Real type must have suffix of form <high>x<low>, eg. 128x128" high, low = [int(x) for x in sub.split('x')] assert 8 <= (high + low) <= 256, \ "Real size out of bounds (max 32 bytes)" assert high % 8 == 0 and low % 8 == 0, \ "Real high/low sizes must be multiples of 8" # Check validity of hash type elif base == 'hash': assert re.match('^[0-9]+$', sub), \ "Hash type must have numerical suffix" # Check validity of address type elif base == 'address': assert sub == '', "Address cannot have suffix" return base, sub, [ast.literal_eval(x) for x in arrlist]