def _parse_contracts_from_loaded_json(self, data_loaded, filename): if 'nodeType' in data_loaded: self._is_compact_ast = True if 'sourcePaths' in data_loaded: for sourcePath in data_loaded['sourcePaths']: if os.path.isfile(sourcePath): with open(sourcePath, encoding='utf8') as f: source_code = f.read() self.source_code[sourcePath] = source_code if data_loaded[self.get_key()] == 'root': self._solc_version = '0.3' logger.error('solc <0.4 is not supported') return elif data_loaded[self.get_key()] == 'SourceUnit': self._solc_version = '0.4' self._parse_source_unit(data_loaded, filename) else: logger.error('solc version is not supported') return for contract_data in data_loaded[self.get_children()]: # if self.solc_version == '0.3': # assert contract_data[self.get_key()] == 'Contract' # contract = ContractSolc03(self, contract_data) if self.solc_version == '0.4': assert contract_data[self.get_key()] in [ 'ContractDefinition', 'PragmaDirective', 'ImportDirective' ] if contract_data[self.get_key()] == 'ContractDefinition': contract = ContractSolc04(self, contract_data) if 'src' in contract_data: contract.set_offset(contract_data['src'], self) self._contractsNotParsed.append(contract) elif contract_data[self.get_key()] == 'PragmaDirective': if self._is_compact_ast: pragma = Pragma(contract_data['literals']) else: pragma = Pragma( contract_data['attributes']["literals"]) pragma.set_offset(contract_data['src'], self) self._pragma_directives.append(pragma) elif contract_data[self.get_key()] == 'ImportDirective': if self.is_compact_ast: import_directive = Import( contract_data["absolutePath"]) else: import_directive = Import( contract_data['attributes']["absolutePath"]) import_directive.set_offset(contract_data['src'], self) self._import_directives.append(import_directive)
def _parse_contracts_from_json(self, json_data): first = json_data.find('{') if first != -1: last = json_data.rfind('}') + 1 filename = json_data[0:first] json_data = json_data[first:last] data_loaded = json.loads(json_data) if data_loaded['name'] == 'root': self._solc_version = '0.3' logger.error('solc <0.4 is not supported') exit(-1) elif data_loaded['name'] == 'SourceUnit': self._solc_version = '0.4' self._parse_source_unit(data_loaded, filename) else: logger.error('solc version is not supported') exit(-1) for contract_data in data_loaded['children']: # if self.solc_version == '0.3': # assert contract_data['name'] == 'Contract' # contract = ContractSolc03(self, contract_data) if self.solc_version == '0.4': assert contract_data['name'] in [ 'ContractDefinition', 'PragmaDirective', 'ImportDirective' ] if contract_data['name'] == 'ContractDefinition': contract = ContractSolc04(self, contract_data) if 'src' in contract_data: contract.set_offset(contract_data['src'], self) self._contractsNotParsed.append(contract) elif contract_data['name'] == 'PragmaDirective': pragma = Pragma( contract_data['attributes']["literals"]) pragma.set_offset(contract_data['src'], self) self._pragma_directives.append(pragma) elif contract_data['name'] == 'ImportDirective': import_directive = Import( contract_data['attributes']["absolutePath"]) import_directive.set_offset(contract_data['src'], self) self._import_directives.append(import_directive) return True return False
def _parse_contracts_from_loaded_json(self, data_loaded, filename): if 'nodeType' in data_loaded: self._is_compact_ast = True if 'sourcePaths' in data_loaded: for sourcePath in data_loaded['sourcePaths']: if os.path.isfile(sourcePath): self._add_source_code(sourcePath) if data_loaded[self.get_key()] == 'root': self._solc_version = '0.3' logger.error('solc <0.4 is not supported') return elif data_loaded[self.get_key()] == 'SourceUnit': self._solc_version = '0.4' self._parse_source_unit(data_loaded, filename) else: logger.error('solc version is not supported') return for contract_data in data_loaded[self.get_children()]: assert contract_data[self.get_key()] in [ 'ContractDefinition', 'PragmaDirective', 'ImportDirective', 'StructDefinition', 'EnumDefinition' ] if contract_data[self.get_key()] == 'ContractDefinition': contract = ContractSolc04(self, contract_data) if 'src' in contract_data: contract.set_offset(contract_data['src'], self) self._contractsNotParsed.append(contract) elif contract_data[self.get_key()] == 'PragmaDirective': if self._is_compact_ast: pragma = Pragma(contract_data['literals']) else: pragma = Pragma(contract_data['attributes']["literals"]) pragma.set_offset(contract_data['src'], self) self._pragma_directives.append(pragma) elif contract_data[self.get_key()] == 'ImportDirective': if self.is_compact_ast: import_directive = Import(contract_data["absolutePath"]) else: import_directive = Import( contract_data['attributes']["absolutePath"]) import_directive.set_offset(contract_data['src'], self) self._import_directives.append(import_directive) elif contract_data[self.get_key()] in [ 'StructDefinition', 'EnumDefinition' ]: # This can only happen for top-level structure and enum # They were introduced with 0.6.5 assert self._is_compact_ast # Do not support top level definition for legacy AST fake_contract_data = { 'name': f'SlitherInternalTopLevelContract{self._top_level_contracts_counter}', 'id': -1000, # TODO: determine if collission possible 'linearizedBaseContracts': [], 'fullyImplemented': True, 'contractKind': 'SLitherInternal' } self._top_level_contracts_counter += 1 top_level_contract = ContractSolc04(self, fake_contract_data) top_level_contract.is_top_level = True top_level_contract.set_offset(contract_data['src'], self) if contract_data[self.get_key()] == 'StructDefinition': top_level_contract._structuresNotParsed.append( contract_data) # Todo add proper setters else: top_level_contract._enumsNotParsed.append( contract_data) # Todo add proper setters self._contractsNotParsed.append(top_level_contract)