import { Flex, Text } from '@chakra-ui/react'; import React from 'react'; import type { SmartContract } from 'types/api/contract'; import { route } from 'nextjs/routes'; import { useMultichainContext } from 'lib/contexts/multichain'; import formatLanguageName from 'lib/contracts/formatLanguageName'; import { Link } from 'toolkit/chakra/link'; import { Skeleton } from 'toolkit/chakra/skeleton'; import { Tooltip } from 'toolkit/chakra/tooltip'; import CopyToClipboard from 'ui/shared/CopyToClipboard'; import CodeEditor from 'ui/shared/monaco/CodeEditor'; import formatFilePath from 'ui/shared/monaco/utils/formatFilePath'; import ContractCodeIdes from './ContractCodeIdes'; import ContractExternalLibraries from './ContractExternalLibraries'; function getEditorData(contractInfo: SmartContract | undefined) { if (!contractInfo || !contractInfo.source_code) { return undefined; } const extension = (() => { switch (contractInfo.language) { case 'vyper': return 'vy'; case 'yul': return 'yul'; case 'scilla': return 'scilla'; case 'stylus_rust': return 'rs'; case 'geas': return 'eas'; default: return 'sol'; } })(); return [ { file_path: formatFilePath(contractInfo.file_path || `index.${ extension }`), source_code: contractInfo.source_code }, ...(contractInfo.additional_sources || []).map((source) => ({ ...source, file_path: formatFilePath(source.file_path) })), ]; } interface Props { data: SmartContract | undefined; sourceAddress: string; isLoading?: boolean; } export const ContractSourceCode = ({ data, isLoading, sourceAddress }: Props) => { const multichainContext = useMultichainContext(); const editorData = React.useMemo(() => { return getEditorData(data); }, [ data ]); const heading = ( Contract source code { data?.language && ({ formatLanguageName(data.language) }) } ); const externalLibraries = data?.external_libraries ? : null; const diagramLink = data?.can_be_visualized_via_sol2uml ? ( View UML diagram ) : null; const ides = data?.language && [ 'solidity', 'vyper', 'yul' ].includes(data.language) ? : null; const copyToClipboard = data && editorData?.length === 1 && data.source_code ? ( ) : null; const content = (() => { if (isLoading) { return ; } if (!editorData) { return null; } return ( ); })(); return (
{ heading } { externalLibraries } { diagramLink } { ides } { copyToClipboard } { content }
); }; export default React.memo(ContractSourceCode);