コード例 #1
0
    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)
コード例 #2
0
ファイル: slitherSolc.py プロジェクト: montyly/slither
    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
コード例 #3
0
ファイル: slitherSolc.py プロジェクト: wangke0809/slither
    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)