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 LedgerInstructionField from '../ledger-instruction-field'; import { MESSAGE_TYPE } from '../../../../shared/constants/app'; import { getURLHostName } from '../../../helpers/utils/util'; import Identicon from '../../ui/identicon'; import AccountListItem from '../account-list-item'; import { conversionUtil } from '../../../../shared/modules/conversion.utils'; import Button from '../../ui/button'; import SiteIcon from '../../ui/site-icon'; export default class SignatureRequestOriginal extends Component { static contextTypes = { t: PropTypes.func.isRequired, trackEvent: 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, subjectMetadata: PropTypes.object, hardwareWalletRequiresConnection: PropTypes.bool, isLedgerWallet: PropTypes.bool, nativeCurrency: PropTypes.string.isRequired, }; state = { fromAccount: this.props.fromAccount, }; renderHeader = () => { return (
{this.context.t('sigRequest')}
); }; renderAccount = () => { const { fromAccount } = this.state; return (
{`${this.context.t('account')}:`}
); }; renderBalance = () => { const { conversionRate, nativeCurrency } = this.props; const { fromAccount: { balance }, } = this.state; const balanceInBaseAsset = conversionUtil(balance, { fromNumericBase: 'hex', toNumericBase: 'dec', fromDenomination: 'WEI', numberOfDecimals: 6, conversionRate, }); return (
{`${this.context.t('balance')}:`}
{`${balanceInBaseAsset} ${nativeCurrency}`}
); }; renderRequestIcon = () => { const { requesterAddress } = this.props; return (
); }; renderAccountInfo = () => { return (
{this.renderAccount()} {this.renderRequestIcon()} {this.renderBalance()}
); }; renderOriginInfo = () => { const { txData, subjectMetadata } = this.props; const { t } = this.context; const targetSubjectMetadata = txData.msgParams.origin ? subjectMetadata?.[txData.msgParams.origin] : null; return (
{`${t('origin')}:`}
{targetSubjectMetadata?.iconUrl ? ( ) : 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 { t } = this.context; const { domain, message } = JSON.parse(data); return (
{domain ? (

{t('domain')}

) : ( '' )} {message ? (

{t('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, txData: { type }, hardwareWalletRequiresConnection, } = this.props; const { trackEvent, t } = this.context; return (
); }; render = () => { return (
{this.renderHeader()} {this.renderBody()} {this.props.isLedgerWallet ? (
) : null} {this.renderFooter()}
); }; }