From 5e55cf2cf2c3d414510c795597c9deba8b01c8ff Mon Sep 17 00:00:00 2001 From: Alex Donesky Date: Thu, 12 May 2022 10:02:08 -0500 Subject: [PATCH] add case in useTransactionDisplayData to handle transaction type safeTransferFrom (#14678) * add case in useTransactionDisplayData to handle transaction type safeTransferFrom * add test --- shared/constants/transaction.js | 4 + test/data/transaction-data.json | 352 +++++++++++++++++++++ ui/hooks/useTransactionDisplayData.js | 3 +- ui/hooks/useTransactionDisplayData.test.js | 12 + 4 files changed, 370 insertions(+), 1 deletion(-) diff --git a/shared/constants/transaction.js b/shared/constants/transaction.js index c3a959caf..411e14248 100644 --- a/shared/constants/transaction.js +++ b/shared/constants/transaction.js @@ -9,6 +9,10 @@ import { MESSAGE_TYPE } from './app'; * @property {'transferfrom'} TOKEN_METHOD_TRANSFER_FROM - A token transaction * transferring tokens from an account that the sender has an allowance of. * For more information on allowances, see the approve type. + * @property {'safetransferfrom'} TOKEN_METHOD_SAFE_TRANSFER_FROM - A token transaction + * transferring tokens from an account that the sender has an allowance of. + * The method is prefixed with safe because when calling this method the contract checks + * to ensure that the receiver is an address capable of handling with the token being sent. * @property {'approve'} TOKEN_METHOD_APPROVE - A token transaction requesting an * allowance of the token to spend on behalf of the user * @property {'incoming'} INCOMING - An incoming (deposit) transaction diff --git a/test/data/transaction-data.json b/test/data/transaction-data.json index a5219dbdb..b3f2b05c5 100644 --- a/test/data/transaction-data.json +++ b/test/data/transaction-data.json @@ -856,5 +856,357 @@ }, "hasRetried": false, "hasCancelled": false + }, + { + "nonce": "0x57", + "transactions": [ + { + "id": 1441203963845330, + "time": 1652206763566, + "status": "confirmed", + "metamaskNetworkId": "4", + "originalGasEstimate": "0x118e0", + "userEditedGasLimit": false, + "chainId": "0x4", + "loadingDefaults": false, + "dappSuggestedGasFees": { + "maxPriorityFeePerGas": "0x3B9ACA00", + "maxFeePerGas": "0x7be830aec" + }, + "sendFlowHistory": [], + "txParams": { + "from": "0x806627172af48bd5b0765d3449a7def80d6576ff", + "to": "0xf5de760f2e916647fd766b4ad9e85ff943ce3a2b", + "nonce": "0x57", + "value": "0x0", + "data": "0x42842e0e000000000000000000000000806627172af48bd5b0765d3449a7def80d6576ff000000000000000000000000e7d522230eff653bb0a9b4385f0be0815420dd98000000000000000000000000000000000000000000000000000000000009a7cc", + "gas": "0x118e0", + "maxFeePerGas": "0x7be830aec", + "maxPriorityFeePerGas": "0x3B9ACA00" + }, + "origin": "https://rinkeby.etherscan.io", + "type": "safetransferfrom", + "userFeeLevel": "dappSuggested", + "defaultGasEstimates": { + "estimateType": "dappSuggested", + "gas": "0x118e0", + "maxFeePerGas": "0x7be830aec", + "maxPriorityFeePerGas": "0x3B9ACA00" + }, + "estimatedBaseFee": "3ba182755", + "nonceDetails": { + "params": { + "highestLocallyConfirmed": 87, + "highestSuggested": 87, + "nextNetworkNonce": 87 + }, + "local": { + "name": "local", + "nonce": 87, + "details": { + "startPoint": 87, + "highest": 87 + } + }, + "network": { + "name": "network", + "nonce": 87, + "details": { + "blockNumber": "0xa28e38", + "baseCount": 87 + } + } + }, + "r": "0xd13310569a8d5876e37788183034bfe4bc3b49c0663c5fd9b2bf13adf9b4791c", + "s": "0x7a83d8840e7edcdf4fdedfd2bc1ce19775e54fd17f29ede5165591a1cf3febea", + "v": "0x00", + "rawTx": "0x02f8d10457843b9aca008507be830aec830118e094f5de760f2e916647fd766b4ad9e85ff943ce3a2b80b86442842e0e000000000000000000000000806627172af48bd5b0765d3449a7def80d6576ff000000000000000000000000e7d522230eff653bb0a9b4385f0be0815420dd98000000000000000000000000000000000000000000000000000000000009a7ccc080a0d13310569a8d5876e37788183034bfe4bc3b49c0663c5fd9b2bf13adf9b4791ca07a83d8840e7edcdf4fdedfd2bc1ce19775e54fd17f29ede5165591a1cf3febea", + "hash": "0xe8717d7b075f8bb555cd4bb9846659a7dfba70dc017a84782a2d23d21f948ee3", + "submittedTime": 1652206777046, + "txReceipt": { + "blockHash": "0x75eb415f79d24f62821b979e3a5f0d4904b2381e973da5fadbddc046c701e3d1", + "blockNumber": "a28e39", + "contractAddress": null, + "cumulativeGasUsed": "fd5dee", + "effectiveGasPrice": "0x4028dcaf1", + "from": "0x806627172af48bd5b0765d3449a7def80d6576ff", + "gasUsed": "bb40", + "logs": [ + { + "address": "0xf5de760f2e916647fd766b4ad9e85ff943ce3a2b", + "blockHash": "0x75eb415f79d24f62821b979e3a5f0d4904b2381e973da5fadbddc046c701e3d1", + "blockNumber": "a28e39", + "data": "0x", + "logIndex": "45", + "removed": false, + "topics": [ + "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", + "0x000000000000000000000000806627172af48bd5b0765d3449a7def80d6576ff", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000000000000000000000000000000000000009a7cc" + ], + "transactionHash": "0xe8717d7b075f8bb555cd4bb9846659a7dfba70dc017a84782a2d23d21f948ee3", + "transactionIndex": "23" + }, + { + "address": "0xf5de760f2e916647fd766b4ad9e85ff943ce3a2b", + "blockHash": "0x75eb415f79d24f62821b979e3a5f0d4904b2381e973da5fadbddc046c701e3d1", + "blockNumber": "a28e39", + "data": "0x", + "logIndex": "46", + "removed": false, + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x000000000000000000000000806627172af48bd5b0765d3449a7def80d6576ff", + "0x000000000000000000000000e7d522230eff653bb0a9b4385f0be0815420dd98", + "0x000000000000000000000000000000000000000000000000000000000009a7cc" + ], + "transactionHash": "0xe8717d7b075f8bb555cd4bb9846659a7dfba70dc017a84782a2d23d21f948ee3", + "transactionIndex": "23" + } + ], + "logsBloom": "0x00000000000000001000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000008000200000000000000000000000000008000000000000000000008000000000000000000000000000020800000000000000000800000000000000000000000010000000000000000000000000000080000010000000000000000000000000000000000000020000000000000000000001000000000000000000000000000000000000000000000202000000000000000000000800000000000000000000000000000020000010000000000002008000000000000000000000000000000000000000000000", + "status": "0x1", + "to": "0xf5de760f2e916647fd766b4ad9e85ff943ce3a2b", + "transactionHash": "0xe8717d7b075f8bb555cd4bb9846659a7dfba70dc017a84782a2d23d21f948ee3", + "transactionIndex": "23", + "type": "0x2" + }, + "baseFeePerGas": "0x3c6f300f1", + "blockTimestamp": "627aacc2" + } + ], + "initialTransaction": { + "id": 1441203963845330, + "time": 1652206763566, + "status": "confirmed", + "metamaskNetworkId": "4", + "originalGasEstimate": "0x118e0", + "userEditedGasLimit": false, + "chainId": "0x4", + "loadingDefaults": false, + "dappSuggestedGasFees": { + "maxPriorityFeePerGas": "0x3B9ACA00", + "maxFeePerGas": "0x7be830aec" + }, + "sendFlowHistory": [], + "txParams": { + "from": "0x806627172af48bd5b0765d3449a7def80d6576ff", + "to": "0xf5de760f2e916647fd766b4ad9e85ff943ce3a2b", + "nonce": "0x57", + "value": "0x0", + "data": "0x42842e0e000000000000000000000000806627172af48bd5b0765d3449a7def80d6576ff000000000000000000000000e7d522230eff653bb0a9b4385f0be0815420dd98000000000000000000000000000000000000000000000000000000000009a7cc", + "gas": "0x118e0", + "maxFeePerGas": "0x7be830aec", + "maxPriorityFeePerGas": "0x3B9ACA00" + }, + "origin": "https://rinkeby.etherscan.io", + "type": "safetransferfrom", + "userFeeLevel": "dappSuggested", + "defaultGasEstimates": { + "estimateType": "dappSuggested", + "gas": "0x118e0", + "maxFeePerGas": "0x7be830aec", + "maxPriorityFeePerGas": "0x3B9ACA00" + }, + "estimatedBaseFee": "3ba182755", + "nonceDetails": { + "params": { + "highestLocallyConfirmed": 87, + "highestSuggested": 87, + "nextNetworkNonce": 87 + }, + "local": { + "name": "local", + "nonce": 87, + "details": { + "startPoint": 87, + "highest": 87 + } + }, + "network": { + "name": "network", + "nonce": 87, + "details": { + "blockNumber": "0xa28e38", + "baseCount": 87 + } + } + }, + "r": "0xd13310569a8d5876e37788183034bfe4bc3b49c0663c5fd9b2bf13adf9b4791c", + "s": "0x7a83d8840e7edcdf4fdedfd2bc1ce19775e54fd17f29ede5165591a1cf3febea", + "v": "0x00", + "rawTx": "0x02f8d10457843b9aca008507be830aec830118e094f5de760f2e916647fd766b4ad9e85ff943ce3a2b80b86442842e0e000000000000000000000000806627172af48bd5b0765d3449a7def80d6576ff000000000000000000000000e7d522230eff653bb0a9b4385f0be0815420dd98000000000000000000000000000000000000000000000000000000000009a7ccc080a0d13310569a8d5876e37788183034bfe4bc3b49c0663c5fd9b2bf13adf9b4791ca07a83d8840e7edcdf4fdedfd2bc1ce19775e54fd17f29ede5165591a1cf3febea", + "hash": "0xe8717d7b075f8bb555cd4bb9846659a7dfba70dc017a84782a2d23d21f948ee3", + "submittedTime": 1652206777046, + "txReceipt": { + "blockHash": "0x75eb415f79d24f62821b979e3a5f0d4904b2381e973da5fadbddc046c701e3d1", + "blockNumber": "a28e39", + "contractAddress": null, + "cumulativeGasUsed": "fd5dee", + "effectiveGasPrice": "0x4028dcaf1", + "from": "0x806627172af48bd5b0765d3449a7def80d6576ff", + "gasUsed": "bb40", + "logs": [ + { + "address": "0xf5de760f2e916647fd766b4ad9e85ff943ce3a2b", + "blockHash": "0x75eb415f79d24f62821b979e3a5f0d4904b2381e973da5fadbddc046c701e3d1", + "blockNumber": "a28e39", + "data": "0x", + "logIndex": "45", + "removed": false, + "topics": [ + "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", + "0x000000000000000000000000806627172af48bd5b0765d3449a7def80d6576ff", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000000000000000000000000000000000000009a7cc" + ], + "transactionHash": "0xe8717d7b075f8bb555cd4bb9846659a7dfba70dc017a84782a2d23d21f948ee3", + "transactionIndex": "23" + }, + { + "address": "0xf5de760f2e916647fd766b4ad9e85ff943ce3a2b", + "blockHash": "0x75eb415f79d24f62821b979e3a5f0d4904b2381e973da5fadbddc046c701e3d1", + "blockNumber": "a28e39", + "data": "0x", + "logIndex": "46", + "removed": false, + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x000000000000000000000000806627172af48bd5b0765d3449a7def80d6576ff", + "0x000000000000000000000000e7d522230eff653bb0a9b4385f0be0815420dd98", + "0x000000000000000000000000000000000000000000000000000000000009a7cc" + ], + "transactionHash": "0xe8717d7b075f8bb555cd4bb9846659a7dfba70dc017a84782a2d23d21f948ee3", + "transactionIndex": "23" + } + ], + "logsBloom": "0x00000000000000001000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000008000200000000000000000000000000008000000000000000000008000000000000000000000000000020800000000000000000800000000000000000000000010000000000000000000000000000080000010000000000000000000000000000000000000020000000000000000000001000000000000000000000000000000000000000000000202000000000000000000000800000000000000000000000000000020000010000000000002008000000000000000000000000000000000000000000000", + "status": "0x1", + "to": "0xf5de760f2e916647fd766b4ad9e85ff943ce3a2b", + "transactionHash": "0xe8717d7b075f8bb555cd4bb9846659a7dfba70dc017a84782a2d23d21f948ee3", + "transactionIndex": "23", + "type": "0x2" + }, + "baseFeePerGas": "0x3c6f300f1", + "blockTimestamp": "627aacc2" + }, + "primaryTransaction": { + "id": 1441203963845330, + "time": 1652206763566, + "status": "confirmed", + "metamaskNetworkId": "4", + "originalGasEstimate": "0x118e0", + "userEditedGasLimit": false, + "chainId": "0x4", + "loadingDefaults": false, + "dappSuggestedGasFees": { + "maxPriorityFeePerGas": "0x3B9ACA00", + "maxFeePerGas": "0x7be830aec" + }, + "sendFlowHistory": [], + "txParams": { + "from": "0x806627172af48bd5b0765d3449a7def80d6576ff", + "to": "0xf5de760f2e916647fd766b4ad9e85ff943ce3a2b", + "nonce": "0x57", + "value": "0x0", + "data": "0x42842e0e000000000000000000000000806627172af48bd5b0765d3449a7def80d6576ff000000000000000000000000e7d522230eff653bb0a9b4385f0be0815420dd98000000000000000000000000000000000000000000000000000000000009a7cc", + "gas": "0x118e0", + "maxFeePerGas": "0x7be830aec", + "maxPriorityFeePerGas": "0x3B9ACA00" + }, + "origin": "https://rinkeby.etherscan.io", + "type": "safetransferfrom", + "userFeeLevel": "dappSuggested", + "defaultGasEstimates": { + "estimateType": "dappSuggested", + "gas": "0x118e0", + "maxFeePerGas": "0x7be830aec", + "maxPriorityFeePerGas": "0x3B9ACA00" + }, + "estimatedBaseFee": "3ba182755", + "nonceDetails": { + "params": { + "highestLocallyConfirmed": 87, + "highestSuggested": 87, + "nextNetworkNonce": 87 + }, + "local": { + "name": "local", + "nonce": 87, + "details": { + "startPoint": 87, + "highest": 87 + } + }, + "network": { + "name": "network", + "nonce": 87, + "details": { + "blockNumber": "0xa28e38", + "baseCount": 87 + } + } + }, + "r": "0xd13310569a8d5876e37788183034bfe4bc3b49c0663c5fd9b2bf13adf9b4791c", + "s": "0x7a83d8840e7edcdf4fdedfd2bc1ce19775e54fd17f29ede5165591a1cf3febea", + "v": "0x00", + "rawTx": "0x02f8d10457843b9aca008507be830aec830118e094f5de760f2e916647fd766b4ad9e85ff943ce3a2b80b86442842e0e000000000000000000000000806627172af48bd5b0765d3449a7def80d6576ff000000000000000000000000e7d522230eff653bb0a9b4385f0be0815420dd98000000000000000000000000000000000000000000000000000000000009a7ccc080a0d13310569a8d5876e37788183034bfe4bc3b49c0663c5fd9b2bf13adf9b4791ca07a83d8840e7edcdf4fdedfd2bc1ce19775e54fd17f29ede5165591a1cf3febea", + "hash": "0xe8717d7b075f8bb555cd4bb9846659a7dfba70dc017a84782a2d23d21f948ee3", + "submittedTime": 1652206777046, + "txReceipt": { + "blockHash": "0x75eb415f79d24f62821b979e3a5f0d4904b2381e973da5fadbddc046c701e3d1", + "blockNumber": "a28e39", + "contractAddress": null, + "cumulativeGasUsed": "fd5dee", + "effectiveGasPrice": "0x4028dcaf1", + "from": "0x806627172af48bd5b0765d3449a7def80d6576ff", + "gasUsed": "bb40", + "logs": [ + { + "address": "0xf5de760f2e916647fd766b4ad9e85ff943ce3a2b", + "blockHash": "0x75eb415f79d24f62821b979e3a5f0d4904b2381e973da5fadbddc046c701e3d1", + "blockNumber": "a28e39", + "data": "0x", + "logIndex": "45", + "removed": false, + "topics": [ + "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925", + "0x000000000000000000000000806627172af48bd5b0765d3449a7def80d6576ff", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000000000000000000000000000000000000009a7cc" + ], + "transactionHash": "0xe8717d7b075f8bb555cd4bb9846659a7dfba70dc017a84782a2d23d21f948ee3", + "transactionIndex": "23" + }, + { + "address": "0xf5de760f2e916647fd766b4ad9e85ff943ce3a2b", + "blockHash": "0x75eb415f79d24f62821b979e3a5f0d4904b2381e973da5fadbddc046c701e3d1", + "blockNumber": "a28e39", + "data": "0x", + "logIndex": "46", + "removed": false, + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x000000000000000000000000806627172af48bd5b0765d3449a7def80d6576ff", + "0x000000000000000000000000e7d522230eff653bb0a9b4385f0be0815420dd98", + "0x000000000000000000000000000000000000000000000000000000000009a7cc" + ], + "transactionHash": "0xe8717d7b075f8bb555cd4bb9846659a7dfba70dc017a84782a2d23d21f948ee3", + "transactionIndex": "23" + } + ], + "logsBloom": "0x00000000000000001000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000008000200000000000000000000000000008000000000000000000008000000000000000000000000000020800000000000000000800000000000000000000000010000000000000000000000000000080000010000000000000000000000000000000000000020000000000000000000001000000000000000000000000000000000000000000000202000000000000000000000800000000000000000000000000000020000010000000000002008000000000000000000000000000000000000000000000", + "status": "0x1", + "to": "0xf5de760f2e916647fd766b4ad9e85ff943ce3a2b", + "transactionHash": "0xe8717d7b075f8bb555cd4bb9846659a7dfba70dc017a84782a2d23d21f948ee3", + "transactionIndex": "23", + "type": "0x2" + }, + "baseFeePerGas": "0x3c6f300f1", + "blockTimestamp": "627aacc2" + }, + "hasRetried": false, + "hasCancelled": false } ] diff --git a/ui/hooks/useTransactionDisplayData.js b/ui/hooks/useTransactionDisplayData.js index 02a64bdbf..ee47225c8 100644 --- a/ui/hooks/useTransactionDisplayData.js +++ b/ui/hooks/useTransactionDisplayData.js @@ -238,7 +238,8 @@ export function useTransactionDisplayData(transactionGroup) { subtitle = t('fromAddress', [shortenAddress(senderAddress)]); } else if ( type === TRANSACTION_TYPES.TOKEN_METHOD_TRANSFER_FROM || - type === TRANSACTION_TYPES.TOKEN_METHOD_TRANSFER + type === TRANSACTION_TYPES.TOKEN_METHOD_TRANSFER || + type === TRANSACTION_TYPES.TOKEN_METHOD_SAFE_TRANSFER_FROM ) { category = TRANSACTION_GROUP_CATEGORIES.SEND; title = t('sendSpecifiedTokens', [ diff --git a/ui/hooks/useTransactionDisplayData.test.js b/ui/hooks/useTransactionDisplayData.test.js index c9673daff..29e4d43d2 100644 --- a/ui/hooks/useTransactionDisplayData.test.js +++ b/ui/hooks/useTransactionDisplayData.test.js @@ -130,6 +130,18 @@ const expectedResults = [ isPending: false, displayedStatusKey: TRANSACTION_STATUSES.CONFIRMED, }, + { + title: 'Send Token', + category: TRANSACTION_GROUP_CATEGORIES.SEND, + subtitle: 'To: 0xe7d...dd98', + subtitleContainsOrigin: true, + primaryCurrency: '-0 ETH', + senderAddress: '0x806627172af48bd5b0765d3449a7def80d6576ff', + recipientAddress: '0xe7d522230eff653bb0a9b4385f0be0815420dd98', + secondaryCurrency: '-0 ETH', + isPending: false, + displayedStatusKey: TRANSACTION_STATUSES.CONFIRMED, + }, ]; let useSelector, useI18nContext, useTokenFiatAmount;