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);