Commit db540791 authored by tom goriunov's avatar tom goriunov Committed by GitHub

Merge pull request #719 from blockscout/contract-verification/is_rust_verifier_microservice_enabled

support is_rust_verifier_microservice_enabled flag
parents ec0139e6 66a22025
...@@ -124,6 +124,7 @@ export interface SmartContractVerificationConfigRaw { ...@@ -124,6 +124,7 @@ export interface SmartContractVerificationConfigRaw {
verification_options: Array<string>; verification_options: Array<string>;
vyper_compiler_versions: Array<string>; vyper_compiler_versions: Array<string>;
vyper_evm_versions: Array<string>; vyper_evm_versions: Array<string>;
is_rust_verifier_microservice_enabled: boolean;
} }
export interface SmartContractVerificationConfig extends SmartContractVerificationConfigRaw { export interface SmartContractVerificationConfig extends SmartContractVerificationConfigRaw {
......
...@@ -16,6 +16,7 @@ const hooksConfig = { ...@@ -16,6 +16,7 @@ const hooksConfig = {
const hash = '0x2F99338637F027CFB7494E46B49987457beCC6E3'; const hash = '0x2F99338637F027CFB7494E46B49987457beCC6E3';
const formConfig: SmartContractVerificationConfig = { const formConfig: SmartContractVerificationConfig = {
is_rust_verifier_microservice_enabled: true,
solidity_compiler_versions: [ solidity_compiler_versions: [
'v0.8.17+commit.8df45f5f', 'v0.8.17+commit.8df45f5f',
'v0.8.16+commit.07a7930e', 'v0.8.16+commit.07a7930e',
......
...@@ -22,15 +22,6 @@ import ContractVerificationVyperContract from './methods/ContractVerificationVyp ...@@ -22,15 +22,6 @@ import ContractVerificationVyperContract from './methods/ContractVerificationVyp
import ContractVerificationVyperMultiPartFile from './methods/ContractVerificationVyperMultiPartFile'; import ContractVerificationVyperMultiPartFile from './methods/ContractVerificationVyperMultiPartFile';
import { prepareRequestBody, formatSocketErrors, getDefaultValues } from './utils'; import { prepareRequestBody, formatSocketErrors, getDefaultValues } from './utils';
const METHOD_COMPONENTS = {
'flattened-code': <ContractVerificationFlattenSourceCode/>,
'standard-input': <ContractVerificationStandardInput/>,
sourcify: <ContractVerificationSourcify/>,
'multi-part': <ContractVerificationMultiPartFile/>,
'vyper-code': <ContractVerificationVyperContract/>,
'vyper-multi-part': <ContractVerificationVyperMultiPartFile/>,
};
interface Props { interface Props {
method?: SmartContractVerificationMethod; method?: SmartContractVerificationMethod;
config: SmartContractVerificationConfig; config: SmartContractVerificationConfig;
...@@ -122,8 +113,18 @@ const ContractVerificationForm = ({ method: methodFromQuery, config, hash }: Pro ...@@ -122,8 +113,18 @@ const ContractVerificationForm = ({ method: methodFromQuery, config, hash }: Pro
handler: handleNewSocketMessage, handler: handleNewSocketMessage,
}); });
const methods = React.useMemo(() => {
return {
'flattened-code': <ContractVerificationFlattenSourceCode config={ config }/>,
'standard-input': <ContractVerificationStandardInput/>,
sourcify: <ContractVerificationSourcify/>,
'multi-part': <ContractVerificationMultiPartFile/>,
'vyper-code': <ContractVerificationVyperContract config={ config }/>,
'vyper-multi-part': <ContractVerificationVyperMultiPartFile/>,
};
}, [ config ]);
const method = watch('method'); const method = watch('method');
const content = METHOD_COMPONENTS[method?.value] || null; const content = methods[method?.value] || null;
const methodValue = method?.value; const methodValue = method?.value;
useUpdateEffect(() => { useUpdateEffect(() => {
......
...@@ -11,9 +11,10 @@ import ContractVerificationFormRow from '../ContractVerificationFormRow'; ...@@ -11,9 +11,10 @@ import ContractVerificationFormRow from '../ContractVerificationFormRow';
interface Props { interface Props {
hint?: string; hint?: string;
isReadOnly?: boolean;
} }
const ContractVerificationFieldName = ({ hint }: Props) => { const ContractVerificationFieldName = ({ hint, isReadOnly }: Props) => {
const { formState, control } = useFormContext<FormFields>(); const { formState, control } = useFormContext<FormFields>();
const renderControl = React.useCallback(({ field }: {field: ControllerRenderProps<FormFields, 'name'>}) => { const renderControl = React.useCallback(({ field }: {field: ControllerRenderProps<FormFields, 'name'>}) => {
...@@ -26,13 +27,13 @@ const ContractVerificationFieldName = ({ hint }: Props) => { ...@@ -26,13 +27,13 @@ const ContractVerificationFieldName = ({ hint }: Props) => {
required required
isInvalid={ Boolean(error) } isInvalid={ Boolean(error) }
maxLength={ 255 } maxLength={ 255 }
isDisabled={ formState.isSubmitting } isDisabled={ formState.isSubmitting || isReadOnly }
autoComplete="off" autoComplete="off"
/> />
<InputPlaceholder text="Contract name" error={ error }/> <InputPlaceholder text="Contract name" error={ error }/>
</FormControl> </FormControl>
); );
}, [ formState.errors, formState.isSubmitting ]); }, [ formState.errors, formState.isSubmitting, isReadOnly ]);
return ( return (
<ContractVerificationFormRow> <ContractVerificationFormRow>
......
import React from 'react'; import React from 'react';
import type { SmartContractVerificationConfig } from 'types/api/contract';
import ContractVerificationMethod from '../ContractVerificationMethod'; import ContractVerificationMethod from '../ContractVerificationMethod';
import ContractVerificationFieldAutodetectArgs from '../fields/ContractVerificationFieldAutodetectArgs'; import ContractVerificationFieldAutodetectArgs from '../fields/ContractVerificationFieldAutodetectArgs';
import ContractVerificationFieldCode from '../fields/ContractVerificationFieldCode'; import ContractVerificationFieldCode from '../fields/ContractVerificationFieldCode';
...@@ -10,16 +12,16 @@ import ContractVerificationFieldLibraries from '../fields/ContractVerificationFi ...@@ -10,16 +12,16 @@ import ContractVerificationFieldLibraries from '../fields/ContractVerificationFi
import ContractVerificationFieldName from '../fields/ContractVerificationFieldName'; import ContractVerificationFieldName from '../fields/ContractVerificationFieldName';
import ContractVerificationFieldOptimization from '../fields/ContractVerificationFieldOptimization'; import ContractVerificationFieldOptimization from '../fields/ContractVerificationFieldOptimization';
const ContractVerificationFlattenSourceCode = () => { const ContractVerificationFlattenSourceCode = ({ config }: { config: SmartContractVerificationConfig }) => {
return ( return (
<ContractVerificationMethod title="Contract verification via Solidity (flattened source code)"> <ContractVerificationMethod title="Contract verification via Solidity (flattened source code)">
<ContractVerificationFieldName/> { !config?.is_rust_verifier_microservice_enabled && <ContractVerificationFieldName/> }
<ContractVerificationFieldIsYul/> { config?.is_rust_verifier_microservice_enabled && <ContractVerificationFieldIsYul/> }
<ContractVerificationFieldCompiler/> <ContractVerificationFieldCompiler/>
<ContractVerificationFieldEvmVersion/> <ContractVerificationFieldEvmVersion/>
<ContractVerificationFieldOptimization/> <ContractVerificationFieldOptimization/>
<ContractVerificationFieldCode/> <ContractVerificationFieldCode/>
<ContractVerificationFieldAutodetectArgs/> { !config?.is_rust_verifier_microservice_enabled && <ContractVerificationFieldAutodetectArgs/> }
<ContractVerificationFieldLibraries/> <ContractVerificationFieldLibraries/>
</ContractVerificationMethod> </ContractVerificationMethod>
); );
......
import React from 'react'; import React from 'react';
import type { SmartContractVerificationConfig } from 'types/api/contract';
import ContractVerificationMethod from '../ContractVerificationMethod'; import ContractVerificationMethod from '../ContractVerificationMethod';
import ContractVerificationFieldCode from '../fields/ContractVerificationFieldCode'; import ContractVerificationFieldCode from '../fields/ContractVerificationFieldCode';
import ContractVerificationFieldCompiler from '../fields/ContractVerificationFieldCompiler'; import ContractVerificationFieldCompiler from '../fields/ContractVerificationFieldCompiler';
import ContractVerificationFieldConstructorArgs from '../fields/ContractVerificationFieldConstructorArgs'; import ContractVerificationFieldConstructorArgs from '../fields/ContractVerificationFieldConstructorArgs';
import ContractVerificationFieldEvmVersion from '../fields/ContractVerificationFieldEvmVersion';
import ContractVerificationFieldName from '../fields/ContractVerificationFieldName'; import ContractVerificationFieldName from '../fields/ContractVerificationFieldName';
const ContractVerificationVyperContract = () => { const ContractVerificationVyperContract = ({ config }: { config: SmartContractVerificationConfig }) => {
return ( return (
<ContractVerificationMethod title="Contract verification via Vyper (contract)"> <ContractVerificationMethod title="Contract verification via Vyper (contract)">
<ContractVerificationFieldName hint="Must match the name specified in the code."/> <ContractVerificationFieldName hint="Must match the name specified in the code." isReadOnly/>
<ContractVerificationFieldCompiler isVyper/> <ContractVerificationFieldCompiler isVyper/>
{ config?.is_rust_verifier_microservice_enabled && <ContractVerificationFieldEvmVersion isVyper/> }
<ContractVerificationFieldCode isVyper/> <ContractVerificationFieldCode isVyper/>
<ContractVerificationFieldConstructorArgs/> { !config?.is_rust_verifier_microservice_enabled && <ContractVerificationFieldConstructorArgs/> }
</ContractVerificationMethod> </ContractVerificationMethod>
); );
}; };
......
...@@ -14,7 +14,7 @@ interface MethodOption { ...@@ -14,7 +14,7 @@ interface MethodOption {
export interface FormFieldsFlattenSourceCode { export interface FormFieldsFlattenSourceCode {
method: MethodOption; method: MethodOption;
is_yul: boolean; is_yul: boolean;
name: string; name: string | undefined;
compiler: Option | null; compiler: Option | null;
evm_version: Option | null; evm_version: Option | null;
is_optimization_enabled: boolean; is_optimization_enabled: boolean;
...@@ -53,9 +53,10 @@ export interface FormFieldsMultiPartFile { ...@@ -53,9 +53,10 @@ export interface FormFieldsMultiPartFile {
export interface FormFieldsVyperContract { export interface FormFieldsVyperContract {
method: MethodOption; method: MethodOption;
name: string; name: string;
evm_version: Option | null;
compiler: Option | null; compiler: Option | null;
code: string; code: string;
constructor_args: string; constructor_args: string | undefined;
} }
export interface FormFieldsVyperMultiPartFile { export interface FormFieldsVyperMultiPartFile {
......
...@@ -84,8 +84,9 @@ export const DEFAULT_VALUES: Record<SmartContractVerificationMethod, FormFields> ...@@ -84,8 +84,9 @@ export const DEFAULT_VALUES: Record<SmartContractVerificationMethod, FormFields>
value: 'vyper-code' as const, value: 'vyper-code' as const,
label: METHOD_LABELS['vyper-code'], label: METHOD_LABELS['vyper-code'],
}, },
name: '', name: 'Vyper_contract',
compiler: null, compiler: null,
evm_version: null,
code: '', code: '',
constructor_args: '', constructor_args: '',
}, },
...@@ -113,6 +114,13 @@ export function getDefaultValues(method: SmartContractVerificationMethod, config ...@@ -113,6 +114,13 @@ export function getDefaultValues(method: SmartContractVerificationMethod, config
} }
} }
if (config.is_rust_verifier_microservice_enabled) {
if (method === 'flattened-code') {
'name' in defaultValues && (defaultValues.name = undefined);
'autodetect_constructor_args' in defaultValues && (defaultValues.autodetect_constructor_args = false);
}
}
return defaultValues; return defaultValues;
} }
...@@ -145,7 +153,7 @@ export function prepareRequestBody(data: FormFields): FetchParams['body'] { ...@@ -145,7 +153,7 @@ export function prepareRequestBody(data: FormFields): FetchParams['body'] {
is_optimization_enabled: _data.is_optimization_enabled, is_optimization_enabled: _data.is_optimization_enabled,
is_yul_contract: _data.is_yul, is_yul_contract: _data.is_yul,
optimization_runs: _data.optimization_runs, optimization_runs: _data.optimization_runs,
contract_name: _data.name, contract_name: _data.name || undefined,
libraries: reduceLibrariesArray(_data.libraries), libraries: reduceLibrariesArray(_data.libraries),
evm_version: _data.evm_version?.value, evm_version: _data.evm_version?.value,
autodetect_constructor_args: _data.autodetect_constructor_args, autodetect_constructor_args: _data.autodetect_constructor_args,
...@@ -196,6 +204,7 @@ export function prepareRequestBody(data: FormFields): FetchParams['body'] { ...@@ -196,6 +204,7 @@ export function prepareRequestBody(data: FormFields): FetchParams['body'] {
return { return {
compiler_version: _data.compiler?.value, compiler_version: _data.compiler?.value,
evm_version: _data.evm_version?.value,
source_code: _data.code, source_code: _data.code,
contract_name: _data.name, contract_name: _data.name,
constructor_args: _data.constructor_args, constructor_args: _data.constructor_args,
......
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