Skip to content

Commit

Permalink
SOV-2934: validate fast-btc address (#2569)
Browse files Browse the repository at this point in the history
* SOV-2934: validate fast-btc address

* chore: remove contract validation
  • Loading branch information
pietro-maximoff authored Aug 3, 2023
1 parent 591ea66 commit c3f41d8
Showing 1 changed file with 27 additions and 35 deletions.
62 changes: 27 additions & 35 deletions src/app/pages/FastBtcPage/components/Withdraw/AddressForm.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,10 @@ import React, {
useEffect,
} from 'react';
import { Trans, useTranslation } from 'react-i18next';
import debounce from 'lodash.debounce';
import { translations } from 'locales/i18n';
import { WithdrawContext, WithdrawStep } from '../../contexts/withdraw-context';
import { FormGroup } from 'app/components/Form/FormGroup';
import { Input } from '../../../../components/Form/Input';
import { contractReader } from '../../../../../utils/sovryn/contract-reader';
import { ErrorBadge } from '../../../../components/Form/ErrorBadge';
import { FastBtcButton } from '../FastBtcButton';
import {
Expand Down Expand Up @@ -41,7 +39,7 @@ export const AddressForm: React.FC = () => {
);
const [value, setValue] = useState(address);

const invalid = useMemo(
const invalidAddress = useMemo(
() => addressValidationState === AddressValidationState.INVALID,
[addressValidationState],
);
Expand All @@ -58,40 +56,37 @@ export const AddressForm: React.FC = () => {

const validateAddress = useCallback(async (address: string) => {
setAddressValidationState(AddressValidationState.LOADING);
let result = false;
const isValidBtcAddress = validate(address);
const isValid = await contractReader.call(
'fastBtcBridge',
'isValidBtcAddress',
[address],
);
if (isValidBtcAddress && isValid) {
const { network, type } = getAddressInfo(address);
if (
network.toLowerCase() === currentNetwork.toLowerCase() &&
type.toLowerCase() !== AddressType.p2tr
) {
result = true;
}
}

setAddressValidationState(
result ? AddressValidationState.VALID : AddressValidationState.INVALID,
);
}, []);
if (isValidBtcAddress) {
const { type, network } = getAddressInfo(address);
const isNetworkValid =
network.toLowerCase() === currentNetwork.toLowerCase();
const isTypeValid = type.toLowerCase() !== AddressType.p2tr;

// eslint-disable-next-line react-hooks/exhaustive-deps
const delayedOnChange = useCallback(
debounce(addressToValidate => validateAddress(addressToValidate), 300),
[validateAddress],
);
setAddressValidationState(
isNetworkValid && isTypeValid
? AddressValidationState.VALID
: AddressValidationState.INVALID,
);
} else {
setAddressValidationState(AddressValidationState.INVALID);
}
}, []);

useEffect(() => {
if (value) {
if (value && value !== '') {
setAddressValidationState(AddressValidationState.LOADING);
validateAddress(value);
} else {
setAddressValidationState(AddressValidationState.NONE);
delayedOnChange(value);
}
}, [delayedOnChange, value]);
}, [value, validateAddress]);

const isSubmitDisabled = useMemo(
() => invalidAddress || fastBtcLocked || !value || value === '',
[fastBtcLocked, invalidAddress, value],
);

return (
<>
Expand All @@ -105,7 +100,7 @@ export const AddressForm: React.FC = () => {
labelClassName="tw-text-sm tw-font-semibold"
>
<Input onChange={setValue} value={value} className="tw-max-w-none" />
{invalid && (
{invalidAddress && (
<ErrorBadge
content={t(
translations.fastBtcPage.withdraw.addressForm.errorBECH32,
Expand All @@ -119,10 +114,7 @@ export const AddressForm: React.FC = () => {
className="tw-absolute tw-right-0 tw-left-0 tw-bottom-8 tw-mx-auto"
text={t(translations.fastBtcPage.withdraw.addressForm.cta)}
onClick={onContinueClick}
disabled={
addressValidationState !== AddressValidationState.VALID ||
fastBtcLocked
}
disabled={isSubmitDisabled}
loading={addressValidationState === AddressValidationState.LOADING}
/>
{fastBtcLocked && (
Expand Down

0 comments on commit c3f41d8

Please sign in to comment.