Commit 9933b2a2 authored by tom goriunov's avatar tom goriunov Committed by GitHub

bugfix: Cannot convert string to buffer while write to the contract (#1724)

Fixes #1717
parent d833ceb5
import { Box, Button, Flex, chakra } from '@chakra-ui/react'; import { Box, Button, Flex, chakra } from '@chakra-ui/react';
import _mapValues from 'lodash/mapValues';
import React from 'react'; import React from 'react';
import type { SubmitHandler } from 'react-hook-form'; import type { SubmitHandler } from 'react-hook-form';
import { useForm, FormProvider } from 'react-hook-form'; import { useForm, FormProvider } from 'react-hook-form';
...@@ -35,7 +36,11 @@ const ContractMethodForm = <T extends SmartContractMethod>({ data, onSubmit, res ...@@ -35,7 +36,11 @@ const ContractMethodForm = <T extends SmartContractMethod>({ data, onSubmit, res
}); });
const onFormSubmit: SubmitHandler<ContractMethodFormFields> = React.useCallback(async(formData) => { const onFormSubmit: SubmitHandler<ContractMethodFormFields> = React.useCallback(async(formData) => {
const args = transformFormDataToMethodArgs(formData); // The API used for reading from contracts expects all values to be strings.
const formattedData = methodType === 'read' ?
_mapValues(formData, (value) => value !== undefined ? String(value) : undefined) :
formData;
const args = transformFormDataToMethodArgs(formattedData);
setResult(undefined); setResult(undefined);
setLoading(true); setLoading(true);
......
...@@ -18,7 +18,7 @@ export default function useFormatFieldValue({ argType, argTypeMatchInt }: Params ...@@ -18,7 +18,7 @@ export default function useFormatFieldValue({ argType, argTypeMatchInt }: Params
if (argTypeMatchInt) { if (argTypeMatchInt) {
const formattedString = value.replace(/\s/g, ''); const formattedString = value.replace(/\s/g, '');
return formattedString; return parseInt(formattedString);
} }
if (argType === 'bool') { if (argType === 'bool') {
...@@ -26,11 +26,11 @@ export default function useFormatFieldValue({ argType, argTypeMatchInt }: Params ...@@ -26,11 +26,11 @@ export default function useFormatFieldValue({ argType, argTypeMatchInt }: Params
switch (formattedValue) { switch (formattedValue) {
case 'true': { case 'true': {
return 'true'; return true;
} }
case 'false':{ case 'false':{
return 'false'; return false;
} }
default: default:
......
...@@ -18,13 +18,15 @@ export default function useValidateField({ isOptional, argType, argTypeMatchInt ...@@ -18,13 +18,15 @@ export default function useValidateField({ isOptional, argType, argTypeMatchInt
return argType.match(BYTES_REGEXP); return argType.match(BYTES_REGEXP);
}, [ argType ]); }, [ argType ]);
return React.useCallback((value: string | undefined) => { // some values are formatted before they are sent to the validator
// see ./useFormatFieldValue.tsx hook
return React.useCallback((value: string | number | boolean | undefined) => {
if (value === undefined || value === '') { if (value === undefined || value === '') {
return isOptional ? true : 'Field is required'; return isOptional ? true : 'Field is required';
} }
if (argType === 'address') { if (argType === 'address') {
if (!isAddress(value)) { if (typeof value !== 'string' || !isAddress(value)) {
return 'Invalid address format'; return 'Invalid address format';
} }
...@@ -39,13 +41,11 @@ export default function useValidateField({ isOptional, argType, argTypeMatchInt ...@@ -39,13 +41,11 @@ export default function useValidateField({ isOptional, argType, argTypeMatchInt
} }
if (argTypeMatchInt) { if (argTypeMatchInt) {
const formattedValue = Number(value); if (typeof value !== 'number' || Object.is(value, NaN)) {
if (Object.is(formattedValue, NaN)) {
return 'Invalid integer format'; return 'Invalid integer format';
} }
if (formattedValue > argTypeMatchInt.max || formattedValue < argTypeMatchInt.min) { if (value > argTypeMatchInt.max || value < argTypeMatchInt.min) {
const lowerBoundary = argTypeMatchInt.isUnsigned ? '0' : `-1 * 2 ^ ${ Number(argTypeMatchInt.power) - 1 }`; const lowerBoundary = argTypeMatchInt.isUnsigned ? '0' : `-1 * 2 ^ ${ Number(argTypeMatchInt.power) - 1 }`;
const upperBoundary = argTypeMatchInt.isUnsigned ? `2 ^ ${ argTypeMatchInt.power } - 1` : `2 ^ ${ Number(argTypeMatchInt.power) - 1 } - 1`; const upperBoundary = argTypeMatchInt.isUnsigned ? `2 ^ ${ argTypeMatchInt.power } - 1` : `2 ^ ${ Number(argTypeMatchInt.power) - 1 } - 1`;
return `Value should be in range from "${ lowerBoundary }" to "${ upperBoundary }" inclusively`; return `Value should be in range from "${ lowerBoundary }" to "${ upperBoundary }" inclusively`;
...@@ -55,7 +55,7 @@ export default function useValidateField({ isOptional, argType, argTypeMatchInt ...@@ -55,7 +55,7 @@ export default function useValidateField({ isOptional, argType, argTypeMatchInt
} }
if (argType === 'bool') { if (argType === 'bool') {
if (value !== 'true' && value !== 'false') { if (typeof value !== 'boolean') {
return 'Invalid boolean format. Allowed values: true, false'; return 'Invalid boolean format. Allowed values: true, false';
} }
} }
......
...@@ -2,7 +2,7 @@ import _set from 'lodash/set'; ...@@ -2,7 +2,7 @@ import _set from 'lodash/set';
import type { SmartContractMethodInput } from 'types/api/contract'; import type { SmartContractMethodInput } from 'types/api/contract';
export type ContractMethodFormFields = Record<string, string | undefined>; export type ContractMethodFormFields = Record<string, string | boolean | number | undefined>;
export const INT_REGEXP = /^(u)?int(\d+)?$/i; export const INT_REGEXP = /^(u)?int(\d+)?$/i;
......
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