From 7f9e24c4f03f9b32c14798221d9e70ab043f9128 Mon Sep 17 00:00:00 2001 From: Dan J Miller Date: Tue, 28 Jun 2022 14:21:09 -0230 Subject: [PATCH] Ensure that addresses are properly hex-prefixed in the generate ERC token transfer functions (#15064) * Ensure that addresses are properly hex-prefixed in the generate ERC token transfer functions * Ensure hex-prefixed addresses in send input * Update unit tests Co-authored-by: Frederik Bolding --- ui/ducks/send/send.test.js | 59 +++++++++++++++++++ .../add-recipient/ens-input.component.js | 6 +- ui/pages/send/send.utils.js | 4 +- ui/pages/send/send.utils.test.js | 2 +- 4 files changed, 66 insertions(+), 5 deletions(-) diff --git a/ui/ducks/send/send.test.js b/ui/ducks/send/send.test.js index a8466753b..c7ea60bf4 100644 --- a/ui/ducks/send/send.test.js +++ b/ui/ducks/send/send.test.js @@ -88,11 +88,16 @@ setBackgroundConnection({ describe('Send Slice', () => { let getTokenStandardAndDetailsStub; + let addUnapprovedTransactionAndRouteToConfirmationPageStub; beforeEach(() => { jest.useFakeTimers(); getTokenStandardAndDetailsStub = jest .spyOn(Actions, 'getTokenStandardAndDetails') .mockImplementation(() => Promise.resolve({ standard: 'ERC20' })); + addUnapprovedTransactionAndRouteToConfirmationPageStub = jest.spyOn( + Actions, + 'addUnapprovedTransactionAndRouteToConfirmationPage', + ); jest .spyOn(Actions, 'estimateGas') .mockImplementation(() => Promise.resolve('0x0')); @@ -2144,6 +2149,60 @@ describe('Send Slice', () => { expect(actionResult[1].type).toStrictEqual('SHOW_CONF_TX_PAGE'); }); + describe('with token transfers', () => { + it('should pass the correct transaction parameters to addUnapprovedTransactionAndRouteToConfirmationPage', async () => { + const tokenTransferTxState = { + metamask: { + unapprovedTxs: { + 1: { + id: 1, + txParams: { + value: 'oldTxValue', + }, + }, + }, + }, + send: { + ...signTransactionState.send, + stage: SEND_STAGES.DRAFT, + id: 1, + account: { + address: '0x6784e8507A1A46443f7bDc8f8cA39bdA92A675A6', + }, + asset: { + details: { + address: '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2', + }, + type: 'TOKEN', + }, + recipient: { + address: '4F90e18605Fd46F9F9Fab0e225D88e1ACf5F5324', + }, + amount: { + value: '0x1', + }, + }, + }; + + jest.mock('../../store/actions.js'); + + const store = mockStore(tokenTransferTxState); + + await store.dispatch(signTransaction()); + + expect( + addUnapprovedTransactionAndRouteToConfirmationPageStub.mock + .calls[0][0].data, + ).toStrictEqual( + '0xa9059cbb0000000000000000000000004f90e18605fd46f9f9fab0e225d88e1acf5f53240000000000000000000000000000000000000000000000000000000000000001', + ); + expect( + addUnapprovedTransactionAndRouteToConfirmationPageStub.mock + .calls[0][0].to, + ).toStrictEqual('0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2'); + }); + }); + it('should create actions for updateTransaction rejecting', async () => { const editStageSignTxState = { metamask: { diff --git a/ui/pages/send/send-content/add-recipient/ens-input.component.js b/ui/pages/send/send-content/add-recipient/ens-input.component.js index 4cf63a7fa..a8ae49439 100644 --- a/ui/pages/send/send-content/add-recipient/ens-input.component.js +++ b/ui/pages/send/send-content/add-recipient/ens-input.component.js @@ -2,6 +2,7 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import classnames from 'classnames'; +import { addHexPrefix } from '../../../../../app/scripts/lib/util'; import { isValidDomainName } from '../../../../helpers/utils/util'; import { isBurnAddress, @@ -36,6 +37,7 @@ export default class EnsInput extends Component { onPaste = (event) => { if (event.clipboardData.items?.length) { + event.preventDefault(); const clipboardItem = event.clipboardData.items[0]; clipboardItem?.getAsString((text) => { const input = text.trim(); @@ -43,7 +45,7 @@ export default class EnsInput extends Component { !isBurnAddress(input) && isValidHexAddress(input, { mixedCaseUseChecksum: true }) ) { - this.props.onPaste(input); + this.props.onPaste(addHexPrefix(input)); } }); } @@ -74,7 +76,7 @@ export default class EnsInput extends Component { !isBurnAddress(input) && isValidHexAddress(input, { mixedCaseUseChecksum: true }) ) { - onValidAddressTyped(input); + onValidAddressTyped(addHexPrefix(input)); } } diff --git a/ui/pages/send/send.utils.js b/ui/pages/send/send.utils.js index 6935a8b0c..c53b39d54 100644 --- a/ui/pages/send/send.utils.js +++ b/ui/pages/send/send.utils.js @@ -142,7 +142,7 @@ function generateERC20TransferData({ .call( abi.rawEncode( ['address', 'uint256'], - [toAddress, addHexPrefix(amount)], + [addHexPrefix(toAddress), addHexPrefix(amount)], ), (x) => `00${x.toString(16)}`.slice(-2), ) @@ -164,7 +164,7 @@ function generateERC721TransferData({ .call( abi.rawEncode( ['address', 'address', 'uint256'], - [fromAddress, toAddress, tokenId], + [addHexPrefix(fromAddress), addHexPrefix(toAddress), tokenId], ), (x) => `00${x.toString(16)}`.slice(-2), ) diff --git a/ui/pages/send/send.utils.test.js b/ui/pages/send/send.utils.test.js index f6da81d0e..39f7c7b8f 100644 --- a/ui/pages/send/send.utils.test.js +++ b/ui/pages/send/send.utils.test.js @@ -73,7 +73,7 @@ describe('send utils', () => { expect(rawEncode.mock.calls[0].toString()).toStrictEqual( [ ['address', 'uint256'], - ['mockAddress', '0xab'], + ['0xmockAddress', '0xab'], ].toString(), ); });