Commit 403355d8 authored by isstuev's avatar isstuev

process unexpected response from solidityscan

parent cec56f19
...@@ -104,29 +104,32 @@ export interface SmartContractVerificationError { ...@@ -104,29 +104,32 @@ export interface SmartContractVerificationError {
name?: Array<string>; name?: Array<string>;
} }
// it's an external API proxy, we can't guarantee the responce types
export type SolidityscanReport = { export type SolidityscanReport = {
scan_report: { scan_report?: {
contractname: string; contractname?: string;
scan_status: string; scan_status?: string;
scan_summary: { scan_summary?: {
issue_severity_distribution: { issue_severity_distribution?: SolidityscanReportSeverityDistribution;
critical: number; lines_analyzed_count?: number;
gas: number; scan_time_taken?: number;
high: number; score?: string;
informational: number; score_v2?: string;
low: number; threat_score?: string;
medium: number;
}; };
lines_analyzed_count: number; scanner_reference_url?: string;
scan_time_taken: number;
score: string;
score_v2: string;
threat_score: string;
};
scanner_reference_url: string;
}; };
} }
export type SolidityscanReportSeverityDistribution = {
critical?: number;
gas?: number;
high?: number;
informational?: number;
low?: number;
medium?: number;
};
type SmartContractSecurityAudit = { type SmartContractSecurityAudit = {
audit_company_name: string; audit_company_name: string;
audit_publish_date: string; audit_publish_date: string;
......
import type { SolidityscanReport } from 'types/api/contract'; import type { SolidityscanReport, SolidityscanReportSeverityDistribution } from 'types/api/contract';
export type MarketplaceAppPreview = { export type MarketplaceAppPreview = {
id: string; id: string;
...@@ -54,7 +54,7 @@ export type MarketplaceAppSecurityReport = { ...@@ -54,7 +54,7 @@ export type MarketplaceAppSecurityReport = {
solidityScanContractsNumber: number; solidityScanContractsNumber: number;
securityScore: number; securityScore: number;
totalIssues?: number; totalIssues?: number;
issueSeverityDistribution: SolidityscanReport['scan_report']['scan_summary']['issue_severity_distribution']; issueSeverityDistribution: SolidityscanReportSeverityDistribution;
}; };
contractsData: Array<{ contractsData: Array<{
address: string; address: string;
......
...@@ -29,13 +29,17 @@ const SolidityscanReport = ({ hash }: Props) => { ...@@ -29,13 +29,17 @@ const SolidityscanReport = ({ hash }: Props) => {
}, },
}); });
const score = Number(data?.scan_report.scan_summary.score_v2); if (isError || !data?.scan_report?.scan_summary) {
return null;
}
const score = Number(data.scan_report.scan_summary.score_v2);
if (isError || !score) { if (!score) {
return null; return null;
} }
const vulnerabilities = data?.scan_report.scan_summary.issue_severity_distribution; const vulnerabilities = data.scan_report.scan_summary.issue_severity_distribution;
const vulnerabilitiesCounts = vulnerabilities ? Object.values(vulnerabilities) : []; const vulnerabilitiesCounts = vulnerabilities ? Object.values(vulnerabilities) : [];
const vulnerabilitiesCount = vulnerabilitiesCounts.reduce((acc, val) => acc + val, 0); const vulnerabilitiesCount = vulnerabilitiesCounts.reduce((acc, val) => acc + val, 0);
......
...@@ -42,7 +42,7 @@ const ContractListModal = ({ onClose, onBack, type, contracts }: Props) => { ...@@ -42,7 +42,7 @@ const ContractListModal = ({ onClose, onBack, type, contracts }: Props) => {
return contracts return contracts
.filter((contract) => Boolean(contract.solidityScanReport)) .filter((contract) => Boolean(contract.solidityScanReport))
.sort((a, b) => .sort((a, b) =>
(parseFloat(b.solidityScanReport?.scan_summary.score_v2 ?? '0')) - (parseFloat(a.solidityScanReport?.scan_summary.score_v2 ?? '0')), (parseFloat(b.solidityScanReport?.scan_summary?.score_v2 ?? '0')) - (parseFloat(a.solidityScanReport?.scan_summary?.score_v2 ?? '0')),
); );
case ContractListTypes.VERIFIED: case ContractListTypes.VERIFIED:
return contracts.filter((contract) => contract.isVerified); return contracts.filter((contract) => contract.isVerified);
......
...@@ -27,7 +27,7 @@ const ContractSecurityReport = ({ securityReport }: Props) => { ...@@ -27,7 +27,7 @@ const ContractSecurityReport = ({ securityReport }: Props) => {
onToggle(); onToggle();
}, [ onToggle ]); }, [ onToggle ]);
if (!securityReport) { if (!securityReport?.scan_summary?.score_v2) {
return null; return null;
} }
......
import { Box, Flex, Text, Grid, useColorModeValue, chakra } from '@chakra-ui/react'; import { Box, Flex, Text, Grid, useColorModeValue, chakra } from '@chakra-ui/react';
import React from 'react'; import React from 'react';
import type { SolidityscanReport } from 'types/api/contract'; import type { SolidityscanReportSeverityDistribution } from 'types/api/contract';
type DistributionItem = { type DistributionItem = {
id: keyof SolidityscanReport['scan_report']['scan_summary']['issue_severity_distribution']; id: keyof SolidityscanReportSeverityDistribution;
name: string; name: string;
color: string; color: string;
} }
...@@ -19,29 +19,34 @@ const DISTRIBUTION_ITEMS: Array<DistributionItem> = [ ...@@ -19,29 +19,34 @@ const DISTRIBUTION_ITEMS: Array<DistributionItem> = [
]; ];
interface Props { interface Props {
vulnerabilities: SolidityscanReport['scan_report']['scan_summary']['issue_severity_distribution']; vulnerabilities: SolidityscanReportSeverityDistribution;
vulnerabilitiesCount: number; vulnerabilitiesCount: number;
} }
type ItemProps = { type ItemProps = {
item: DistributionItem; item: DistributionItem;
vulnerabilities: SolidityscanReport['scan_report']['scan_summary']['issue_severity_distribution']; vulnerabilities: SolidityscanReportSeverityDistribution;
vulnerabilitiesCount: number; vulnerabilitiesCount: number;
} }
const SolidityScanReportItem = ({ item, vulnerabilities, vulnerabilitiesCount }: ItemProps) => { const SolidityScanReportItem = ({ item, vulnerabilities, vulnerabilitiesCount }: ItemProps) => {
const bgBar = useColorModeValue('blackAlpha.50', 'whiteAlpha.50'); const bgBar = useColorModeValue('blackAlpha.50', 'whiteAlpha.50');
const yetAnotherGrayColor = useColorModeValue('gray.400', 'gray.500'); const yetAnotherGrayColor = useColorModeValue('gray.400', 'gray.500');
const vulnerability = vulnerabilities[item.id];
if (vulnerability === undefined) {
return null;
}
return ( return (
<> <>
<Box w={ 3 } h={ 3 } bg={ item.color } borderRadius="6px" mr={ 2 }></Box> <Box w={ 3 } h={ 3 } bg={ item.color } borderRadius="6px" mr={ 2 }></Box>
<Flex justifyContent="space-between" mr={ 3 }> <Flex justifyContent="space-between" mr={ 3 }>
<Text>{ item.name }</Text> <Text>{ item.name }</Text>
<Text color={ vulnerabilities[item.id] > 0 ? 'text' : yetAnotherGrayColor }>{ vulnerabilities[item.id] }</Text> <Text color={ vulnerability > 0 ? 'text' : yetAnotherGrayColor }>{ vulnerabilities[item.id] }</Text>
</Flex> </Flex>
<Box bg={ bgBar } h="10px" borderRadius="8px"> <Box bg={ bgBar } h="10px" borderRadius="8px">
<Box bg={ item.color } w={ vulnerabilities[item.id] / vulnerabilitiesCount } h="10px" borderRadius="8px"/> <Box bg={ item.color } w={ vulnerability / vulnerabilitiesCount } h="10px" borderRadius="8px"/>
</Box> </Box>
</> </>
); );
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment