import React, { Component } from 'react'; import PropTypes from 'prop-types'; import { stripHexPrefix } from 'ethereumjs-util'; import classnames from 'classnames'; import { ObjectInspector } from 'react-inspector'; import { ENVIRONMENT_TYPE_NOTIFICATION, MESSAGE_TYPE, } from '../../../../shared/constants/app'; import { getEnvironmentType } from '../../../../app/scripts/lib/util'; import Identicon from '../../ui/identicon'; import AccountListItem from '../account-list-item'; import { conversionUtil } from '../../../helpers/utils/conversion-util'; import Button from '../../ui/button'; import SiteIcon from '../../ui/site-icon'; export default class SignatureRequestOriginal extends Component { static contextTypes = { t: PropTypes.func.isRequired, metricsEvent: PropTypes.func.isRequired, }; static propTypes = { fromAccount: PropTypes.shape({ address: PropTypes.string.isRequired, balance: PropTypes.string, name: PropTypes.string, }).isRequired, cancel: PropTypes.func.isRequired, clearConfirmTransaction: PropTypes.func.isRequired, conversionRate: PropTypes.number, history: PropTypes.object.isRequired, mostRecentOverviewPage: PropTypes.string.isRequired, requesterAddress: PropTypes.string, sign: PropTypes.func.isRequired, txData: PropTypes.object.isRequired, domainMetadata: PropTypes.object, }; state = { fromAccount: this.props.fromAccount, }; componentDidMount = () => { if (getEnvironmentType() === ENVIRONMENT_TYPE_NOTIFICATION) { window.addEventListener('beforeunload', this._beforeUnload); } }; componentWillUnmount = () => { this._removeBeforeUnload(); }; _beforeUnload = (event) => { const { clearConfirmTransaction, cancel } = this.props; const { metricsEvent } = this.context; metricsEvent({ eventOpts: { category: 'Transactions', action: 'Sign Request', name: 'Cancel Sig Request Via Notification Close', }, }); clearConfirmTransaction(); cancel(event); }; _removeBeforeUnload = () => { if (getEnvironmentType() === ENVIRONMENT_TYPE_NOTIFICATION) { window.removeEventListener('beforeunload', this._beforeUnload); } }; renderHeader = () => { return (
{this.context.t('sigRequest')}
); }; renderAccount = () => { const { fromAccount } = this.state; return (
{`${this.context.t('account')}:`}
); }; renderBalance = () => { const { conversionRate } = this.props; const { fromAccount: { balance }, } = this.state; const balanceInEther = conversionUtil(balance, { fromNumericBase: 'hex', toNumericBase: 'dec', fromDenomination: 'WEI', numberOfDecimals: 6, conversionRate, }); return (
{`${this.context.t('balance')}:`}
{`${balanceInEther} ETH`}
); }; renderRequestIcon = () => { const { requesterAddress } = this.props; return (
); }; renderAccountInfo = () => { return (
{this.renderAccount()} {this.renderRequestIcon()} {this.renderBalance()}
); }; renderOriginInfo = () => { const { txData, domainMetadata } = this.props; const { t } = this.context; const originMetadata = txData.msgParams.origin ? domainMetadata?.[txData.msgParams.origin] : null; return (
{`${t('origin')}:`}
{originMetadata?.icon ? ( ) : null}
{txData.msgParams.origin}
); }; msgHexToText = (hex) => { try { const stripped = stripHexPrefix(hex); const buff = Buffer.from(stripped, 'hex'); return buff.length === 32 ? hex : buff.toString('utf8'); } catch (e) { return hex; } }; renderTypedData = (data) => { const { domain, message } = JSON.parse(data); return (
{domain ? (

Domain

) : ( '' )} {message ? (

Message

) : ( '' )}
); }; renderBody = () => { let rows; let notice = `${this.context.t('youSign')}:`; const { txData } = this.props; const { type, msgParams: { data }, } = txData; if (type === MESSAGE_TYPE.PERSONAL_SIGN) { rows = [ { name: this.context.t('message'), value: this.msgHexToText(data) }, ]; } else if (type === MESSAGE_TYPE.ETH_SIGN_TYPED_DATA) { rows = data; } else if (type === MESSAGE_TYPE.ETH_SIGN) { rows = [{ name: this.context.t('message'), value: data }]; notice = this.context.t('signNotice'); } return (
{this.renderAccountInfo()} {this.renderOriginInfo()}
{notice} {type === MESSAGE_TYPE.ETH_SIGN ? ( { global.platform.openTab({ url: 'https://metamask.zendesk.com/hc/en-us/articles/360015488751', }); }} > {this.context.t('learnMore')} ) : null}
{rows.map(({ name, value }, index) => { if (typeof value === 'boolean') { // eslint-disable-next-line no-param-reassign value = value.toString(); } return (
{`${name}:`}
{value}
); })}
); }; renderFooter = () => { const { cancel, clearConfirmTransaction, history, mostRecentOverviewPage, sign, } = this.props; return (
); }; render = () => { return (
{this.renderHeader()} {this.renderBody()} {this.renderFooter()}
); }; }