import React, { useCallback, useContext, useState } from 'react'; import PropTypes from 'prop-types'; import { useSelector } from 'react-redux'; import log from 'loglevel'; import ActionableMessage from '../../ui/actionable-message'; import Popover from '../../ui/popover'; import Checkbox from '../../ui/check-box'; import { I18nContext } from '../../../contexts/i18n'; import { PageContainerFooter } from '../../ui/page-container'; import { accountsWithSendEtherInfoSelector, getSubjectMetadata, } from '../../../selectors'; import { getAccountByAddress } from '../../../helpers/utils/util'; import { formatMessageParams } from '../../../../shared/modules/siwe'; import { Icon } from '../../component-library/icon/icon'; import { IconColor } from '../../../helpers/constants/design-system'; import SecurityProviderBannerMessage from '../security-provider-banner-message/security-provider-banner-message'; import { SECURITY_PROVIDER_MESSAGE_SEVERITIES } from '../security-provider-banner-message/security-provider-banner-message.constants'; import Header from './signature-request-siwe-header'; import Message from './signature-request-siwe-message'; export default function SignatureRequestSIWE({ txData, cancelPersonalMessage, signPersonalMessage, }) { const allAccounts = useSelector(accountsWithSendEtherInfoSelector); const subjectMetadata = useSelector(getSubjectMetadata); const { msgParams: { from, origin, siwe: { parsedMessage }, }, } = txData; const fromAccount = getAccountByAddress(allAccounts, from); const targetSubjectMetadata = subjectMetadata[origin]; const t = useContext(I18nContext); const isMatchingAddress = from.toLowerCase() === parsedMessage.address.toLowerCase(); const checkSIWEDomain = () => { let isSIWEDomainValid = false; if (origin) { const { host } = new URL(origin); isSIWEDomainValid = parsedMessage.domain === host; } return isSIWEDomainValid; }; const isSIWEDomainValid = checkSIWEDomain(); const [isShowingDomainWarning, setIsShowingDomainWarning] = useState(false); const [agreeToDomainWarning, setAgreeToDomainWarning] = useState(false); const onSign = useCallback( async (event) => { try { await signPersonalMessage(event); } catch (e) { log.error(e); } }, [signPersonalMessage], ); const onCancel = useCallback( async (event) => { try { await cancelPersonalMessage(event); } catch (e) { log.error(e); } }, [cancelPersonalMessage], ); return (
{(txData?.securityProviderResponse?.flagAsDangerous !== undefined && txData?.securityProviderResponse?.flagAsDangerous !== SECURITY_PROVIDER_MESSAGE_SEVERITIES.NOT_MALICIOUS) || (txData?.securityProviderResponse && Object.keys(txData.securityProviderResponse).length === 0) ? ( ) : null} {!isMatchingAddress && ( } /> )} {!isSIWEDomainValid && (

{t('SIWEDomainInvalidTitle')}

{' '} {t('SIWEDomainInvalidText')} } iconFillColor="var(--color-error-default)" useIcon withRightButton icon={} /> )} setIsShowingDomainWarning(true) } cancelText={t('cancel')} submitText={t('signin')} submitButtonType={isSIWEDomainValid ? 'primary' : 'danger-primary'} /> {isShowingDomainWarning && ( setIsShowingDomainWarning(false)} title={t('SIWEWarningTitle')} subtitle={t('SIWEWarningSubtitle')} className="signature-request-siwe__warning-popover" footerClassName="signature-request-siwe__warning-popover__footer" footer={ setIsShowingDomainWarning(false)} cancelText={t('cancel')} cancelButtonType="default" onSubmit={onSign} submitText={t('confirm')} submitButtonType="danger-primary" disabled={!agreeToDomainWarning} /> } >
setAgreeToDomainWarning((checked) => !checked)} />
)}
); } SignatureRequestSIWE.propTypes = { /** * The display content of transaction data */ txData: PropTypes.object.isRequired, /** * Handler for cancel button */ cancelPersonalMessage: PropTypes.func.isRequired, /** * Handler for sign button */ signPersonalMessage: PropTypes.func.isRequired, };