Commit f0302aed authored by tom's avatar tom

fallback and receive methods; array as arg

parent 0363113c
...@@ -14,7 +14,7 @@ import ContractMethodField from './ContractMethodField'; ...@@ -14,7 +14,7 @@ import ContractMethodField from './ContractMethodField';
interface Props<T extends SmartContractMethod> { interface Props<T extends SmartContractMethod> {
data: T; data: T;
onSubmit: (data: T, args: Array<string>) => Promise<ContractMethodCallResult<T>>; onSubmit: (data: T, args: Array<string | Array<string>>) => Promise<ContractMethodCallResult<T>>;
renderResult: (data: T, result: ContractMethodCallResult<T>) => React.ReactNode; renderResult: (data: T, result: ContractMethodCallResult<T>) => React.ReactNode;
isWrite?: boolean; isWrite?: boolean;
} }
...@@ -37,6 +37,15 @@ const sortFields = (data: Array<SmartContractMethodInput>) => ([ a ]: [string, s ...@@ -37,6 +37,15 @@ const sortFields = (data: Array<SmartContractMethodInput>) => ([ a ]: [string, s
return 0; return 0;
}; };
const castFieldValue = (data: Array<SmartContractMethodInput>) => ([ key, value ]: [ string, string ], index: number) => {
if (data[index].type.includes('[]')) {
return [ key, parseArrayValue(value) ];
}
return [ key, value ];
};
const parseArrayValue = (value: string) => value.replace(/(\[|\])|\s/g, '').split(',');
const ContractMethodCallable = <T extends SmartContractMethod>({ data, onSubmit, renderResult, isWrite }: Props<T>) => { const ContractMethodCallable = <T extends SmartContractMethod>({ data, onSubmit, renderResult, isWrite }: Props<T>) => {
const [ result, setResult ] = React.useState<ContractMethodCallResult<T>>(); const [ result, setResult ] = React.useState<ContractMethodCallResult<T>>();
...@@ -60,7 +69,9 @@ const ContractMethodCallable = <T extends SmartContractMethod>({ data, onSubmit, ...@@ -60,7 +69,9 @@ const ContractMethodCallable = <T extends SmartContractMethod>({ data, onSubmit,
const onFormSubmit: SubmitHandler<MethodFormFields> = React.useCallback(async(formData) => { const onFormSubmit: SubmitHandler<MethodFormFields> = React.useCallback(async(formData) => {
const args = Object.entries(formData) const args = Object.entries(formData)
.sort(sortFields(inputs)) .sort(sortFields(inputs))
.map(castFieldValue(inputs))
.map(([ , value ]) => value); .map(([ , value ]) => value);
setResult(undefined); setResult(undefined);
setLoading(true); setLoading(true);
...@@ -70,7 +81,7 @@ const ContractMethodCallable = <T extends SmartContractMethod>({ data, onSubmit, ...@@ -70,7 +81,7 @@ const ContractMethodCallable = <T extends SmartContractMethod>({ data, onSubmit,
setLoading(false); setLoading(false);
}) })
.catch((error) => { .catch((error) => {
setResult('error' in error ? error.error : error); setResult(error?.error || error?.data || error);
setLoading(false); setLoading(false);
}); });
}, [ onSubmit, data, inputs ]); }, [ onSubmit, data, inputs ]);
......
...@@ -34,7 +34,7 @@ const ContractRead = ({ isProxy }: Props) => { ...@@ -34,7 +34,7 @@ const ContractRead = ({ isProxy }: Props) => {
}, },
}); });
const handleMethodFormSubmit = React.useCallback(async(item: SmartContractReadMethod, args: Array<string>) => { const handleMethodFormSubmit = React.useCallback(async(item: SmartContractReadMethod, args: Array<string | Array<string>>) => {
return apiFetch<'contract_method_query', SmartContractQueryMethodRead>('contract_method_query', { return apiFetch<'contract_method_query', SmartContractQueryMethodRead>('contract_method_query', {
pathParams: { id: addressHash }, pathParams: { id: addressHash },
fetchParams: { fetchParams: {
......
import { Alert } from '@chakra-ui/react'; import { Alert } from '@chakra-ui/react';
import { useRouter } from 'next/router'; import { useRouter } from 'next/router';
import React from 'react'; import React from 'react';
import { useSigner } from 'wagmi';
import type { ContractMethodWriteResult } from './types'; import type { ContractMethodWriteResult } from './types';
import type { SmartContractWriteMethod } from 'types/api/contract'; import type { SmartContractWriteMethod } from 'types/api/contract';
...@@ -14,6 +15,7 @@ import { useContractContext } from './context'; ...@@ -14,6 +15,7 @@ import { useContractContext } from './context';
import ContractConnectWallet from './ContractConnectWallet'; import ContractConnectWallet from './ContractConnectWallet';
import ContractMethodCallable from './ContractMethodCallable'; import ContractMethodCallable from './ContractMethodCallable';
import ContractWriteResult from './ContractWriteResult'; import ContractWriteResult from './ContractWriteResult';
import { getNativeCoinValue } from './utils';
interface Props { interface Props {
isProxy?: boolean; isProxy?: boolean;
...@@ -23,6 +25,7 @@ const ContractWrite = ({ isProxy }: Props) => { ...@@ -23,6 +25,7 @@ const ContractWrite = ({ isProxy }: Props) => {
const router = useRouter(); const router = useRouter();
const addressHash = router.query.id?.toString(); const addressHash = router.query.id?.toString();
const { data: signer } = useSigner();
const { data, isLoading, isError } = useApiQuery(isProxy ? 'contract_methods_write_proxy' : 'contract_methods_write', { const { data, isLoading, isError } = useApiQuery(isProxy ? 'contract_methods_write_proxy' : 'contract_methods_write', {
pathParams: { id: addressHash }, pathParams: { id: addressHash },
...@@ -33,25 +36,31 @@ const ContractWrite = ({ isProxy }: Props) => { ...@@ -33,25 +36,31 @@ const ContractWrite = ({ isProxy }: Props) => {
const contract = useContractContext(); const contract = useContractContext();
const handleMethodFormSubmit = React.useCallback(async(item: SmartContractWriteMethod, args: Array<string>) => { const handleMethodFormSubmit = React.useCallback(async(item: SmartContractWriteMethod, args: Array<string | Array<string>>) => {
if (!contract) { if (!contract) {
return; return;
} }
if (item.type === 'fallback' || item.type === 'receive') { if (item.type === 'fallback' || item.type === 'receive') {
return; const value = args[0] ? getNativeCoinValue(args[0]) : '0';
const result = await signer?.sendTransaction({
to: addressHash,
value,
});
return { hash: result?.hash as string };
} }
const _args = item.stateMutability === 'payable' ? args.slice(0, -1) : args;
const value = item.stateMutability === 'payable' ? getNativeCoinValue(args[args.length - 1]) : undefined;
const methodName = item.name; const methodName = item.name;
const result = await contract[methodName](...args, {
const result = await contract[methodName](..._args, {
gasLimit: 100_000, gasLimit: 100_000,
value,
}); });
// eslint-disable-next-line no-console
console.log('__>__', { result, args });
return { hash: result.hash as string }; return { hash: result.hash as string };
}, [ contract ]); }, [ addressHash, contract, signer ]);
const renderResult = React.useCallback((item: SmartContractWriteMethod, result: ContractMethodWriteResult) => { const renderResult = React.useCallback((item: SmartContractWriteMethod, result: ContractMethodWriteResult) => {
if (!result || 'message' in result) { if (!result || 'message' in result) {
......
import BigNumber from 'bignumber.js';
import config from 'configs/app/config';
export const getNativeCoinValue = (value: string | Array<string>) => {
const _value = Array.isArray(value) ? value[0] : value;
return BigNumber(_value).times(10 ** config.network.currency.decimals).toString();
};
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