1
0
mirror of https://github.com/kremalicious/metamask-extension.git synced 2024-12-23 09:52:26 +01:00

Add Approval Confirmation Screen component to Storybook (#10998)

* add metametrics wrapper

* add history dep

* provide test data and mock react router

* add first confirmaion screen

* figure out a way to mock match.params

* render token approval with data

* fix lockfile

* fix lint

* remove use effect

* lintfix

* add . for src paths

* litfix

* Add knobs to change redux store for confirm-approve component (Storybook) (#11135)

* add knob for domain

* knobify

* remove logs

* remove comment

* lintfix

* fix comments

* add background calls + metriccs event to storybook acctions

* lintfixxxx
This commit is contained in:
Etienne Dusseault 2021-05-25 08:20:09 +08:00 committed by GitHub
parent e1c8afc8c4
commit 4c341d83ab
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
20 changed files with 964 additions and 220 deletions

View File

@ -0,0 +1,56 @@
export const currentNetworkTxListSample = {
"id": 7900715443136469,
"time": 1621395091737,
"status": "unapproved",
"metamaskNetworkId": "1337",
"chainId": "0x539",
"loadingDefaults": false,
"txParams": {
"from": "0x90f79bf6eb2c4f870365e785982e1f101e93b906",
"to": "0x057ef64e23666f000b34ae31332854acbd1c8544",
"value": "0x0",
"data": "0x095ea7b30000000000000000000000009bc5baf874d2da8d216ae9f137804184ee5afef40000000000000000000000000000000000000000000000000000000000011170",
"gas": "0xea60",
"gasPrice": "0x4a817c800"
},
"origin": "https://metamask.github.io",
"type": "approve",
"history": [
{
"id": 7900715443136469,
"time": 1621395091737,
"status": "unapproved",
"metamaskNetworkId": "1337",
"chainId": "0x539",
"loadingDefaults": true,
"txParams": {
"from": "0x90f79bf6eb2c4f870365e785982e1f101e93b906",
"to": "0x057ef64e23666f000b34ae31332854acbd1c8544",
"value": "0x0",
"data": "0x095ea7b30000000000000000000000009bc5baf874d2da8d216ae9f137804184ee5afef40000000000000000000000000000000000000000000000000000000000011170",
"gas": "0xea60",
"gasPrice": "0x4a817c800"
},
"origin": "https://metamask.github.io",
"type": "approve"
},
[
{
"op": "replace",
"path": "/loadingDefaults",
"value": false,
"note": "Added new unapproved transaction.",
"timestamp": 1621395091742
}
]
]
}
export const domainMetadata = {
"https://metamask.github.io": {
"name": "E2E Test Dapp",
"icon": "https://metamask.github.io/test-dapp/metamask-fox.svg",
"lastUpdated": 1620723443380,
"host": "metamask.github.io"
}
}

24
.storybook/metametrics.js Normal file
View File

@ -0,0 +1,24 @@
import React from 'react';
import {
MetaMetricsProvider,
LegacyMetaMetricsProvider,
} from '../ui/contexts/metametrics';
import {
MetaMetricsProvider as NewMetaMetricsProvider,
LegacyMetaMetricsProvider as NewLegacyMetaMetricsProvider,
} from '../ui/contexts/metametrics.new';
const MetaMetricsProviderStorybook = (props) =>
(
<MetaMetricsProvider>
<LegacyMetaMetricsProvider>
<NewMetaMetricsProvider>
<NewLegacyMetaMetricsProvider>
{props.children}
</NewLegacyMetaMetricsProvider>
</NewMetaMetricsProvider>
</LegacyMetaMetricsProvider>
</MetaMetricsProvider>
);
export default MetaMetricsProviderStorybook

View File

@ -1,6 +1,6 @@
import React, { useEffect } from 'react'; import React, { useEffect } from 'react';
import { addDecorator, addParameters } from '@storybook/react'; import { addDecorator, addParameters } from '@storybook/react';
import { useGlobals } from '@storybook/api'; import { action } from '@storybook/addon-actions';
import { withKnobs } from '@storybook/addon-knobs'; import { withKnobs } from '@storybook/addon-knobs';
import { Provider } from 'react-redux'; import { Provider } from 'react-redux';
import configureStore from '../ui/store/store'; import configureStore from '../ui/store/store';
@ -8,7 +8,11 @@ import '../ui/css/index.scss';
import localeList from '../app/_locales/index.json'; import localeList from '../app/_locales/index.json';
import * as allLocales from './locales'; import * as allLocales from './locales';
import { I18nProvider, LegacyI18nProvider } from './i18n'; import { I18nProvider, LegacyI18nProvider } from './i18n';
import MetaMetricsProviderStorybook from './metametrics'
import testData from './test-data.js'; import testData from './test-data.js';
import { Router } from "react-router-dom";
import { createBrowserHistory } from "history";
import { _setBackgroundConnection } from '../ui/store/actions'
addParameters({ addParameters({
backgrounds: { backgrounds: {
@ -41,22 +45,36 @@ const styles = {
alignItems: 'center', alignItems: 'center',
}; };
const store = configureStore(testData); export const store = configureStore(testData);
const history = createBrowserHistory();
const proxiedBackground = new Proxy({}, {
get(_, method) {
return function() {
action(`Background call: ${method}`)()
return new Promise(() => {})
}
}
})
_setBackgroundConnection(proxiedBackground)
const metamaskDecorator = (story, context) => { const metamaskDecorator = (story, context) => {
const currentLocale = context.globals.locale; const currentLocale = context.globals.locale;
const current = allLocales[currentLocale]; const current = allLocales[currentLocale];
return ( return (
<Provider store={store}> <Provider store={store}>
<I18nProvider <Router history={history}>
currentLocale={currentLocale} <MetaMetricsProviderStorybook>
current={current} <I18nProvider
en={allLocales.en} currentLocale={currentLocale}
> current={current}
<LegacyI18nProvider> en={allLocales.en}
<div style={styles}>{story()}</div> >
</LegacyI18nProvider> <LegacyI18nProvider>
</I18nProvider> <div style={styles}>{story()}</div>
</LegacyI18nProvider>
</I18nProvider>
</MetaMetricsProviderStorybook>
</Router>
</Provider> </Provider>
); );
}; };

View File

@ -1,217 +1,782 @@
import { TRANSACTION_STATUSES } from '../shared/constants/transaction'; import { TRANSACTION_STATUSES } from '../shared/constants/transaction';
const state = { const state = {
metamask: { "invalidCustomNetwork": {
isInitialized: true, "state": "CLOSED",
isUnlocked: true, "networkName": ""
featureFlags: { sendHexData: true }, },
identities: { "unconnectedAccount": {
'0xfdea65c8e26263f6d9a1b5de9555d2931a33b825': { "state": "CLOSED"
address: '0xfdea65c8e26263f6d9a1b5de9555d2931a33b825', },
name: 'Send Account 1', "activeTab": {},
"metamask": {
"isInitialized": true,
"isUnlocked": true,
"isAccountMenuOpen": false,
"rpcUrl": "https://rawtestrpc.metamask.io/",
"identities": {
"0x983211ce699ea5ab57cc528086154b6db1ad8e55": {
"name": "Account 1",
"address": "0x983211ce699ea5ab57cc528086154b6db1ad8e55"
}, },
'0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb': { "0xb19ac54efa18cc3a14a5b821bfec73d284bf0c5e": {
address: '0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb', "name": "Account 2",
name: 'Send Account 2', "address": "0xb19ac54efa18cc3a14a5b821bfec73d284bf0c5e"
},
'0x2f8d4a878cfa04a6e60d46362f5644deab66572d': {
address: '0x2f8d4a878cfa04a6e60d46362f5644deab66572d',
name: 'Send Account 3',
},
'0xd85a4b6a394794842887b8284293d69163007bbb': {
address: '0xd85a4b6a394794842887b8284293d69163007bbb',
name: 'Send Account 4',
}, },
"0x9d0ba4ddac06032527b140912ec808ab9451b788": {
"name": "Account 3",
"address": "0x9d0ba4ddac06032527b140912ec808ab9451b788"
}
}, },
cachedBalances: {}, "unapprovedTxs": {
currentBlockGasLimit: '0x4c1878', "7786962153682822": {
currentCurrency: 'USD', "id": 7786962153682822,
conversionRate: 1200.88200327, "time": 1620710815484,
conversionDate: 1489013762, "status": "unapproved",
nativeCurrency: 'ETH', "metamaskNetworkId": "3",
frequentRpcList: [], "chainId": "0x3",
network: '3', "loadingDefaults": false,
provider: { "txParams": {
type: 'ropsten', "from": "0x64a845a5b02460acf8a3d84503b0d68d028b4bb4",
chainId: '0x3', "to": "0xad6d458402f60fd3bd25163575031acdce07538d",
}, "value": "0x0",
accounts: { "data": "0xa9059cbb000000000000000000000000b19ac54efa18cc3a14a5b821bfec73d284bf0c5e0000000000000000000000000000000000000000000000003782dace9d900000",
'0xfdea65c8e26263f6d9a1b5de9555d2931a33b825': { "gas": "0xcb28",
code: '0x', "gasPrice": "0x77359400"
balance: '0x47c9d71831c76efe',
nonce: '0x1b',
address: '0xfdea65c8e26263f6d9a1b5de9555d2931a33b825',
},
'0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb': {
code: '0x',
balance: '0x37452b1315889f80',
nonce: '0xa',
address: '0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb',
},
'0x2f8d4a878cfa04a6e60d46362f5644deab66572d': {
code: '0x',
balance: '0x30c9d71831c76efe',
nonce: '0x1c',
address: '0x2f8d4a878cfa04a6e60d46362f5644deab66572d',
},
'0xd85a4b6a394794842887b8284293d69163007bbb': {
code: '0x',
balance: '0x0',
nonce: '0x0',
address: '0xd85a4b6a394794842887b8284293d69163007bbb',
},
},
addressBook: {
'0x3': {
'0x06195827297c7a80a443b6894d3bdb8824b43896': {
address: '0x06195827297c7a80a443b6894d3bdb8824b43896',
name: 'Address Book Account 1',
chainId: '0x3',
}, },
}, "type": "standard",
"origin": "metamask",
"transactionCategory": "transfer",
"history": [
{
"id": 7786962153682822,
"time": 1620710815484,
"status": "unapproved",
"metamaskNetworkId": "3",
"chainId": "0x3",
"loadingDefaults": true,
"txParams": {
"from": "0x64a845a5b02460acf8a3d84503b0d68d028b4bb4",
"to": "0xad6d458402f60fd3bd25163575031acdce07538d",
"value": "0x0",
"data": "0xa9059cbb000000000000000000000000b19ac54efa18cc3a14a5b821bfec73d284bf0c5e0000000000000000000000000000000000000000000000003782dace9d900000",
"gas": "0xcb28",
"gasPrice": "0x77359400"
},
"type": "standard",
"origin": "metamask",
"transactionCategory": "transfer"
},
[
{
"op": "replace",
"path": "/loadingDefaults",
"value": false,
"note": "Added new unapproved transaction.",
"timestamp": 1620710815497
}
]
]
}
}, },
tokens: [ "frequentRpcList": [],
"addressBook": {
"undefined": {
"0": {
"address": "0x39a4e4Af7cCB654dB9500F258c64781c8FbD39F0",
"name": "",
"isEns": false
}
}
},
"contractExchangeRates": {
"0xad6d458402f60fd3bd25163575031acdce07538d": 0
},
"tokens": [
{ {
address: '0x1a195821297c7a80a433b6894d3bdb8824b43896', "address": "0xad6d458402f60fd3bd25163575031acdce07538d",
decimals: 18, "symbol": "DAI",
symbol: 'ABC', "decimals": 18
}, }
{
address: '0x8d6b81208414189a58339873ab429b6c47ab92d3',
decimals: 4,
symbol: 'DEF',
},
{
address: '0xa42084c8d1d9a2198631988579bb36b48433a72b',
decimals: 18,
symbol: 'GHI',
},
], ],
transactions: {}, "pendingTokens": {},
currentNetworkTxList: [ "customNonceValue": "",
{ "send": {
id: 'mockTokenTx1', "gasLimit": "0xcb28",
txParams: { "gasPrice": null,
to: '0x8d6b81208414189a58339873ab429b6c47ab92d3', "gasTotal": null,
from: '0xd85a4b6a394794842887b8284293d69163007bbb', "tokenBalance": "8.7a73149c048545a3fe58",
}, "from": "",
time: 1700000000000, "to": "0xb19ac54efa18cc3a14a5b821bfec73d284bf0c5e",
}, "amount": "3782dace9d900000",
{ "memo": "",
id: 'mockTokenTx2', "errors": {},
txParams: { "maxModeOn": false,
to: '0xafaketokenaddress', "editingTransactionId": null,
from: '0xd85a4b6a394794842887b8284293d69163007bbb', "toNickname": "Account 2",
}, "ensResolution": null,
time: 1600000000000, "ensResolutionError": "",
}, "token": {
{ "address": "0xad6d458402f60fd3bd25163575031acdce07538d",
id: 'mockTokenTx3', "symbol": "DAI",
txParams: { "decimals": 18
to: '0x8d6b81208414189a58339873ab429b6c47ab92d3', }
from: '0xd85a4b6a394794842887b8284293d69163007bbb',
},
time: 1500000000000,
},
{
id: 'mockEthTx1',
txParams: {
to: '0xd85a4b6a394794842887b8284293d69163007bbb',
from: '0xd85a4b6a394794842887b8284293d69163007bbb',
},
time: 1400000000000,
},
],
unapprovedMsgs: {
'0xabc': { id: 'unapprovedMessage1', time: 1650000000000 },
'0xdef': { id: 'unapprovedMessage2', time: 1550000000000 },
'0xghi': { id: 'unapprovedMessage3', time: 1450000000000 },
}, },
unapprovedMsgCount: 0, "useBlockie": false,
unapprovedPersonalMsgs: {}, "featureFlags": {},
unapprovedPersonalMsgCount: 0, "welcomeScreenSeen": false,
unapprovedDecryptMsgs: {}, "currentLocale": "en",
unapprovedDecryptMsgCount: 0, "preferences": {
unapprovedEncryptionPublicKeyMsgs: {}, "useNativeCurrencyAsPrimaryCurrency": true
unapprovedEncryptionPublicKeyMsgCount: 0, },
keyringTypes: ['Simple Key Pair', 'HD Key Tree'], "firstTimeFlowType": "create",
keyrings: [ "completedOnboarding": true,
"knownMethodData": {
"0x60806040": {
"name": "Approve Tokens"
},
"0x095ea7b3": {
"name": "Approve Tokens"
}
},
"participateInMetaMetrics": true,
"metaMetricsSendCount": 2,
"nextNonce": 71,
"connectedStatusPopoverHasBeenShown": true,
"swapsWelcomeMessageHasBeenShown": true,
"defaultHomeActiveTabName": "Assets",
"provider": {
"type": "ropsten",
"ticker": "ETH",
"nickname": "",
"rpcUrl": "",
"chainId": "0x3"
},
"previousProviderStore": {
"type": "ropsten",
"ticker": "ETH",
"nickname": "",
"rpcUrl": "",
"chainId": "0x3"
},
"network": "3",
"accounts": {
"0x983211ce699ea5ab57cc528086154b6db1ad8e55": {
"address": "0x983211ce699ea5ab57cc528086154b6db1ad8e55",
"balance": "0x176e5b6f173ebe66"
},
"0xb19ac54efa18cc3a14a5b821bfec73d284bf0c5e": {
"address": "0xb19ac54efa18cc3a14a5b821bfec73d284bf0c5e",
"balance": "0x2d3142f5000"
},
"0x9d0ba4ddac06032527b140912ec808ab9451b788": {
"address": "0x9d0ba4ddac06032527b140912ec808ab9451b788",
"balance": "0x15f6f0b9d4f8d000"
}
},
"currentBlockGasLimit": "0x793af4",
"currentNetworkTxList": [
],
"cachedBalances": {
"1": {
"0x64a845a5b02460acf8a3d84503b0d68d028b4bb4": "0x0",
"0xb19ac54efa18cc3a14a5b821bfec73d284bf0c5e": "0xcaf5317161f400",
"0x9d0ba4ddac06032527b140912ec808ab9451b788": "0x0"
},
"3": {
"0x64a845a5b02460acf8a3d84503b0d68d028b4bb4": "0x18d289d450bace66",
"0xb19ac54efa18cc3a14a5b821bfec73d284bf0c5e": "0x2d3142f5000",
"0x9d0ba4ddac06032527b140912ec808ab9451b788": "0x15f6f0b9d4f8d000"
},
"0x3": {
"0x64a845a5b02460acf8a3d84503b0d68d028b4bb4": "0x176e5b6f173ebe66",
"0xb19ac54efa18cc3a14a5b821bfec73d284bf0c5e": "0x2d3142f5000",
"0x9d0ba4ddac06032527b140912ec808ab9451b788": "0x15f6f0b9d4f8d000"
}
},
"unapprovedMsgs": {},
"unapprovedMsgCount": 0,
"unapprovedPersonalMsgs": {},
"unapprovedPersonalMsgCount": 0,
"unapprovedDecryptMsgs": {},
"unapprovedDecryptMsgCount": 0,
"unapprovedEncryptionPublicKeyMsgs": {},
"unapprovedEncryptionPublicKeyMsgCount": 0,
"unapprovedTypedMessages": {},
"unapprovedTypedMessagesCount": 0,
"keyringTypes": [
"Simple Key Pair",
"HD Key Tree",
"Trezor Hardware",
"Ledger Hardware"
],
"keyrings": [
{ {
type: 'HD Key Tree', "type": "HD Key Tree",
accounts: [ "accounts": [
'fdea65c8e26263f6d9a1b5de9555d2931a33b825', "0x64a845a5b02460acf8a3d84503b0d68d028b4bb4",
'c5b8dbac4c1d3f152cdeb400e2313f309c410acb', "0xb19ac54efa18cc3a14a5b821bfec73d284bf0c5e",
'2f8d4a878cfa04a6e60d46362f5644deab66572d', "0x9d0ba4ddac06032527b140912ec808ab9451b788"
]
}
],
"frequentRpcListDetail": [
{
"rpcUrl": "http://localhost:8545",
"chainId": "0x539",
"ticker": "ETH",
"nickname": "Localhost 8545",
"rpcPrefs": {}
}
],
"accountTokens": {
"0x64a845a5b02460acf8a3d84503b0d68d028b4bb4": {
"0x1": [
{
"address": "0x6b175474e89094c44da98b954eedeac495271d0f",
"symbol": "DAI",
"decimals": 18
},
{
"address": "0x0d8775f648430679a709e98d2b0cb6250d2887ef",
"symbol": "BAT",
"decimals": 18
}
], ],
"0x3": [
{
"address": "0xad6d458402f60fd3bd25163575031acdce07538d",
"symbol": "DAI",
"decimals": 18
}
]
},
"0xb19ac54efa18cc3a14a5b821bfec73d284bf0c5e": {},
"0x9d0ba4ddac06032527b140912ec808ab9451b788": {}
},
"accountHiddenTokens": {
"0x64a845a5b02460acf8a3d84503b0d68d028b4bb4": {
"0x3": []
}
},
"assetImages": {
"0xad6d458402f60fd3bd25163575031acdce07538d": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xaD6D458402F60fD3Bd25163575031ACDce07538D/logo.png"
},
"hiddenTokens": [],
"suggestedTokens": {},
"useNonceField": false,
"usePhishDetect": true,
"lostIdentities": {},
"forgottenPassword": false,
"ipfsGateway": "dweb.link",
"infuraBlocked": false,
"migratedPrivacyMode": false,
"selectedAddress": "0x64a845a5b02460acf8a3d84503b0d68d028b4bb4",
"metaMetricsId": "0xc2377d11fec1c3b7dd88c4854240ee5e3ed0d9f63b00456d98d80320337b827f",
"conversionDate": 1620710825.03,
"conversionRate": 3910.28,
"currentCurrency": "usd",
"nativeCurrency": "ETH",
"usdConversionRate": 3910.28,
"ticker": "ETH",
"alertEnabledness": {
"unconnectedAccount": true,
"web3ShimUsage": true
},
"unconnectedAccountAlertShownOrigins": {},
"web3ShimUsageOrigins": {},
"seedPhraseBackedUp": null,
"onboardingTabs": {},
"incomingTransactions": {
"0x2de9256a7c604586f7ecfd87ae9509851e217f588f9f85feed793c54ed2ce0aa": {
"blockNumber": "8888976",
"id": 4678200543090532,
"metamaskNetworkId": "1",
"status": "confirmed",
"time": 1573114896000,
"txParams": {
"from": "0x3f1b52850109023775d238c7ed5d5e7161041fd1",
"gas": "0x5208",
"gasPrice": "0x124101100",
"nonce": "0x35",
"to": "0x045c619e4d29bba3b92769508831b681b83d6a96",
"value": "0xbca9bce4d98ca3"
},
"hash": "0x2de9256a7c604586f7ecfd87ae9509851e217f588f9f85feed793c54ed2ce0aa",
"transactionCategory": "incoming"
},
"0x320a1fd769373578f78570e5d8f56e89bc7bce9657bb5f4c12d8fe790d471bfd": {
"blockNumber": "9453174",
"id": 4678200543090535,
"metamaskNetworkId": "1",
"status": "confirmed",
"time": 1581312411000,
"txParams": {
"from": "0xa17bd07d6d38cb9e37b29f7659a4b1047701e969",
"gas": "0xc350",
"gasPrice": "0x1a13b8600",
"nonce": "0x0",
"to": "0x045c619e4d29bba3b92769508831b681b83d6a96",
"value": "0xcdb08ab4254000"
},
"hash": "0x320a1fd769373578f78570e5d8f56e89bc7bce9657bb5f4c12d8fe790d471bfd",
"transactionCategory": "incoming"
},
"0x8add6c1ea089a8de9b15fa2056b1875360f17916755c88ace9e5092b7a4b1239": {
"blockNumber": "10892417",
"id": 4678200543090542,
"metamaskNetworkId": "1",
"status": "confirmed",
"time": 1600515224000,
"txParams": {
"from": "0x0681d8db095565fe8a346fa0277bffde9c0edbbf",
"gas": "0x5208",
"gasPrice": "0x1d1a94a200",
"nonce": "0x2bb8a5",
"to": "0x045c619e4d29bba3b92769508831b681b83d6a96",
"value": "0xe6ed27d6668000"
},
"hash": "0x8add6c1ea089a8de9b15fa2056b1875360f17916755c88ace9e5092b7a4b1239",
"transactionCategory": "incoming"
},
"0x50be62ab1cabd03ff104c602c11fdef7a50f3d73c55006d5583ba97950ab1144": {
"blockNumber": "10902987",
"id": 4678200543090545,
"metamaskNetworkId": "1",
"status": "confirmed",
"time": 1600654021000,
"txParams": {
"from": "0x64a845a5b02460acf8a3d84503b0d68d028b4bb4",
"gas": "0x5208",
"gasPrice": "0x147d357000",
"nonce": "0xf",
"to": "0x045c619e4d29bba3b92769508831b681b83d6a96",
"value": "0x63eb89da4ed00000"
},
"hash": "0x50be62ab1cabd03ff104c602c11fdef7a50f3d73c55006d5583ba97950ab1144",
"transactionCategory": "incoming"
}
},
"incomingTxLastFetchedBlocksByNetwork": {
"ropsten": 8872820,
"rinkeby": null,
"kovan": null,
"goerli": null,
"mainnet": 10902989
},
"permissionsRequests": [],
"permissionsDescriptions": {},
"domains": {
"https://app.uniswap.org": {
"permissions": [
{
"@context": [
"https://github.com/MetaMask/rpc-cap"
],
"invoker": "https://app.uniswap.org",
"parentCapability": "eth_accounts",
"id": "a7342e4b-beae-4525-a36c-c0635fd03359",
"date": 1620710693178,
"caveats": [
{
"type": "limitResponseLength",
"value": 1,
"name": "primaryAccountOnly"
},
{
"type": "filterResponse",
"value": [
"0x64a845a5b02460acf8a3d84503b0d68d028b4bb4"
],
"name": "exposedAccounts"
}
]
}
]
}
},
"permissionsLog": [
{
"id": 522690215,
"method": "eth_accounts",
"methodType": "restricted",
"origin": "https://metamask.io",
"request": {
"method": "eth_accounts",
"params": [],
"jsonrpc": "2.0",
"id": 522690215,
"origin": "https://metamask.io",
"tabId": 5
},
"requestTime": 1602643170686,
"response": {
"id": 522690215,
"jsonrpc": "2.0",
"result": []
},
"responseTime": 1602643170688,
"success": true
}, },
{ {
type: 'Simple Key Pair', "id": 1620464600,
accounts: ['0xd85a4b6a394794842887b8284293d69163007bbb'], "method": "eth_accounts",
}, "methodType": "restricted",
], "origin": "https://widget.getacute.io",
selectedAddress: '0xd85a4b6a394794842887b8284293d69163007bbb', "request": {
send: { "method": "eth_accounts",
gasLimit: '0xFFFF', "params": [],
gasPrice: '0xaa', "jsonrpc": "2.0",
gasTotal: '0xb451dc41b578', "id": 1620464600,
tokenBalance: 3434, "origin": "https://widget.getacute.io",
from: '0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb', "tabId": 5
to: '0x987fedabc',
amount: '0x080',
memo: '',
errors: {
someError: null,
},
maxModeOn: false,
editingTransactionId: 97531,
},
unapprovedTxs: {
4768706228115573: {
id: 4768706228115573,
time: 1487363153561,
status: TRANSACTION_STATUSES.UNAPPROVED,
gasMultiplier: 1,
metamaskNetworkId: '3',
txParams: {
from: '0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb',
to: '0x18a3462427bcc9133bb46e88bcbe39cd7ef0e761',
value: '0xde0b6b3a7640000',
metamaskId: 4768706228115573,
metamaskNetworkId: '3',
gas: '0x5209',
}, },
txFee: '17e0186e60800', "requestTime": 1602643172935,
txValue: 'de0b6b3a7640000', "response": {
maxCost: 'de234b52e4a0800', "id": 1620464600,
gasPrice: '4a817c800', "jsonrpc": "2.0",
"result": []
},
"responseTime": 1602643172935,
"success": true
}, },
{
"id": 4279100021,
"method": "eth_accounts",
"methodType": "restricted",
"origin": "https://app.uniswap.org",
"request": {
"method": "eth_accounts",
"jsonrpc": "2.0",
"id": 4279100021,
"origin": "https://app.uniswap.org",
"tabId": 5
},
"requestTime": 1620710669962,
"response": {
"id": 4279100021,
"jsonrpc": "2.0",
"result": []
},
"responseTime": 1620710669963,
"success": true
},
{
"id": 4279100022,
"method": "eth_requestAccounts",
"methodType": "restricted",
"origin": "https://app.uniswap.org",
"request": {
"method": "eth_requestAccounts",
"jsonrpc": "2.0",
"id": 4279100022,
"origin": "https://app.uniswap.org",
"tabId": 5
},
"requestTime": 1620710686872,
"response": {
"id": 4279100022,
"jsonrpc": "2.0",
"result": [
"0x64a845a5b02460acf8a3d84503b0d68d028b4bb4"
]
},
"responseTime": 1620710693187,
"success": true
},
{
"id": 4279100023,
"method": "eth_requestAccounts",
"methodType": "restricted",
"origin": "https://app.uniswap.org",
"request": {
"method": "eth_requestAccounts",
"jsonrpc": "2.0",
"id": 4279100023,
"origin": "https://app.uniswap.org",
"tabId": 5
},
"requestTime": 1620710693204,
"response": {
"id": 4279100023,
"jsonrpc": "2.0",
"result": [
"0x64a845a5b02460acf8a3d84503b0d68d028b4bb4"
]
},
"responseTime": 1620710693213,
"success": true
},
{
"id": 4279100034,
"method": "eth_accounts",
"methodType": "restricted",
"origin": "https://app.uniswap.org",
"request": {
"method": "eth_accounts",
"params": [],
"jsonrpc": "2.0",
"id": 4279100034,
"origin": "https://app.uniswap.org",
"tabId": 5
},
"requestTime": 1620710712072,
"response": {
"id": 4279100034,
"jsonrpc": "2.0",
"result": [
"0x64a845a5b02460acf8a3d84503b0d68d028b4bb4"
]
},
"responseTime": 1620710712075,
"success": true
}
],
"permissionsHistory": {
"https://app.uniswap.org": {
"eth_accounts": {
"lastApproved": 1620710693213,
"accounts": {
"0x64a845a5b02460acf8a3d84503b0d68d028b4bb4": 1620710693213
}
}
}
}, },
currentLocale: 'en', "domainMetadata": {
"https://metamask.github.io": {
"name": "E2E Test Dapp",
"icon": "https://metamask.github.io/test-dapp/metamask-fox.svg",
"lastUpdated": 1620723443380,
"host": "metamask.github.io"
}
},
"threeBoxSyncingAllowed": false,
"showRestorePrompt": true,
"threeBoxLastUpdated": 0,
"threeBoxAddress": null,
"threeBoxSynced": false,
"threeBoxDisabled": false,
"swapsState": {
"quotes": {},
"fetchParams": null,
"tokens": null,
"tradeTxId": null,
"approveTxId": null,
"quotesLastFetched": null,
"customMaxGas": "",
"customGasPrice": null,
"selectedAggId": null,
"customApproveTxData": "",
"errorKey": "",
"topAggId": null,
"routeState": "",
"swapsFeatureIsLive": false,
"swapsQuoteRefreshTime": 60000
},
"ensResolutionsByAddress": {},
"pendingApprovals": {},
"pendingApprovalCount": 0
}, },
appState: { "appState": {
menuOpen: false, "shouldClose": false,
currentView: { "menuOpen": false,
name: 'accountDetail', "modal": {
detailView: null, "open": false,
context: '0x0dcd5d886577d5081b0c52e242ef29e70be3e7bc', "modalState": {
"name": null,
"props": {}
},
"previousModalState": {
"name": null
}
}, },
accountDetail: { "sidebar": {
subview: 'transactions', "isOpen": false,
"transitionName": "",
"type": "",
"props": {}
}, },
modal: { "alertOpen": false,
modalState: {}, "alertMessage": null,
previousModalState: {}, "qrCodeData": null,
"networkDropdownOpen": false,
"accountDetail": {
"subview": "transactions"
}, },
isLoading: false, "isLoading": false,
warning: null, "warning": null,
scrollToBottom: false, "buyView": {},
forgottenPassword: null, "isMouseUser": true,
"gasIsLoading": false,
"defaultHdPaths": {
"trezor": "m/44'/60'/0'/0",
"ledger": "m/44'/60'/0'/0/0"
},
"networksTabSelectedRpcUrl": "",
"networksTabIsInAddMode": false,
"loadingMethodData": false,
"show3BoxModalAfterImport": false,
"threeBoxLastUpdated": null,
"requestAccountTabs": {},
"openMetaMaskTabs": {},
"currentWindowTab": {}
}, },
send: { "history": {
fromDropdownOpen: false, "mostRecentOverviewPage": "/"
toDropdownOpen: false,
errors: { someError: null },
}, },
}; "send": {
"toDropdownOpen": false,
"gasButtonGroupShown": true,
"errors": {}
},
"confirmTransaction": {
"txData": {
"id": 3111025347726181,
"time": 1620723786838,
"status": "unapproved",
"metamaskNetworkId": "3",
"chainId": "0x3",
"loadingDefaults": false,
"txParams": {
"from": "0x983211ce699ea5ab57cc528086154b6db1ad8e55",
"to": "0xad6d458402f60fd3bd25163575031acdce07538d",
"value": "0x0",
"data": "0x095ea7b30000000000000000000000009bc5baf874d2da8d216ae9f137804184ee5afef40000000000000000000000000000000000000000000000000000000000011170",
"gas": "0xea60",
"gasPrice": "0x4a817c800"
},
"type": "standard",
"origin": "https://metamask.github.io",
"transactionCategory": "approve",
"history": [
{
"id": 3111025347726181,
"time": 1620723786838,
"status": "unapproved",
"metamaskNetworkId": "3",
"chainId": "0x3",
"loadingDefaults": true,
"txParams": {
"from": "0x983211ce699ea5ab57cc528086154b6db1ad8e55",
"to": "0xad6d458402f60fd3bd25163575031acdce07538d",
"value": "0x0",
"data": "0x095ea7b30000000000000000000000009bc5baf874d2da8d216ae9f137804184ee5afef40000000000000000000000000000000000000000000000000000000000011170",
"gas": "0xea60",
"gasPrice": "0x4a817c800"
},
"type": "standard",
"origin": "https://metamask.github.io",
"transactionCategory": "approve"
},
[
{
"op": "replace",
"path": "/loadingDefaults",
"value": false,
"note": "Added new unapproved transaction.",
"timestamp": 1620723786844
}
]
]
},
"tokenData": {
"args": [
"0x9bc5baF874d2DA8D216aE9f137804184EE5AfEF4",
{
"type": "BigNumber",
"hex": "0x011170"
}
],
"functionFragment": {
"type": "function",
"name": "approve",
"constant": false,
"inputs": [
{
"name": "_spender",
"type": "address",
"indexed": null,
"components": null,
"arrayLength": null,
"arrayChildren": null,
"baseType": "address",
"_isParamType": true
},
{
"name": "_value",
"type": "uint256",
"indexed": null,
"components": null,
"arrayLength": null,
"arrayChildren": null,
"baseType": "uint256",
"_isParamType": true
}
],
"outputs": [
{
"name": "success",
"type": "bool",
"indexed": null,
"components": null,
"arrayLength": null,
"arrayChildren": null,
"baseType": "bool",
"_isParamType": true
}
],
"payable": false,
"stateMutability": "nonpayable",
"gas": null,
"_isFragment": true
},
"name": "approve",
"signature": "approve(address,uint256)",
"sighash": "0x095ea7b3",
"value": {
"type": "BigNumber",
"hex": "0x00"
}
},
"fiatTransactionAmount": "0",
"fiatTransactionFee": "4.72",
"fiatTransactionTotal": "4.72",
"ethTransactionAmount": "0",
"ethTransactionFee": "0.0012",
"ethTransactionTotal": "0.0012",
"hexTransactionAmount": "0x0",
"hexTransactionFee": "0x44364c5bb0000",
"hexTransactionTotal": "0x44364c5bb0000",
"nonce": ""
},
"swaps": {
"aggregatorMetadata": null,
"approveTxId": null,
"balanceError": false,
"fetchingQuotes": false,
"fromToken": null,
"quotesFetchStartTime": null,
"topAssets": {},
"toToken": null,
"customGas": {
"price": null,
"limit": null,
"loading": "INITIAL",
"priceEstimates": {},
"fallBackPrice": null
}
},
"gas": {
"customData": {
"price": null,
"limit": "0xcb28"
},
"basicEstimates": {
"average": 2
},
"basicEstimateIsLoading": false
}
}
export default state; export default state;

View File

@ -271,6 +271,7 @@
"gulp-terser-js": "^5.2.2", "gulp-terser-js": "^5.2.2",
"gulp-watch": "^5.0.1", "gulp-watch": "^5.0.1",
"gulp-zip": "^4.0.0", "gulp-zip": "^4.0.0",
"history": "^5.0.0",
"jest": "^26.6.3", "jest": "^26.6.3",
"jsdom": "^11.2.0", "jsdom": "^11.2.0",
"koa": "^2.7.0", "koa": "^2.7.0",

View File

@ -6,7 +6,7 @@ const ConfirmPageContainerWarning = (props) => {
<div className="confirm-page-container-warning"> <div className="confirm-page-container-warning">
<img <img
className="confirm-page-container-warning__icon" className="confirm-page-container-warning__icon"
src="/images/alert.svg" src="./images/alert.svg"
alt="" alt=""
/> />
<div className="confirm-page-container-warning__warning"> <div className="confirm-page-container-warning__warning">

View File

@ -47,7 +47,7 @@ export default function ConfirmPageContainerHeader({
visibility: showEdit ? 'initial' : 'hidden', visibility: showEdit ? 'initial' : 'hidden',
}} }}
> >
<img src="/images/caret-left.svg" alt="" /> <img src="./images/caret-left.svg" alt="" />
<span <span
className="confirm-page-container-header__back-button" className="confirm-page-container-header__back-button"
onClick={() => onEdit()} onClick={() => onEdit()}

View File

@ -33,14 +33,14 @@ const ConfirmPageContainerNavigation = (props) => {
data-testid="first-page" data-testid="first-page"
onClick={() => onNextTx(firstTx)} onClick={() => onNextTx(firstTx)}
> >
<img src="/images/double-arrow.svg" alt="" /> <img src="./images/double-arrow.svg" alt="" />
</div> </div>
<div <div
className="confirm-page-container-navigation__arrow" className="confirm-page-container-navigation__arrow"
data-testid="previous-page" data-testid="previous-page"
onClick={() => onNextTx(prevTxId)} onClick={() => onNextTx(prevTxId)}
> >
<img src="/images/single-arrow.svg" alt="" /> <img src="./images/single-arrow.svg" alt="" />
</div> </div>
</div> </div>
<div className="confirm-page-container-navigation__textcontainer"> <div className="confirm-page-container-navigation__textcontainer">
@ -64,7 +64,7 @@ const ConfirmPageContainerNavigation = (props) => {
> >
<img <img
className="confirm-page-container-navigation__imageflip" className="confirm-page-container-navigation__imageflip"
src="/images/single-arrow.svg" src="./images/single-arrow.svg"
alt="" alt=""
/> />
</div> </div>
@ -75,7 +75,7 @@ const ConfirmPageContainerNavigation = (props) => {
> >
<img <img
className="confirm-page-container-navigation__imageflip" className="confirm-page-container-navigation__imageflip"
src="/images/double-arrow.svg" src="./images/double-arrow.svg"
alt="" alt=""
/> />
</div> </div>

View File

@ -215,7 +215,7 @@ export default class TransactionListItemDetails extends PureComponent {
onClick={this.handleBlockExplorerClick} onClick={this.handleBlockExplorerClick}
disabled={!hash} disabled={!hash}
> >
<img src="/images/arrow-popout.svg" alt="" /> <img src="./images/arrow-popout.svg" alt="" />
</Button> </Button>
</Tooltip> </Tooltip>
{showRetry && ( {showRetry && (

View File

@ -22,7 +22,9 @@ export default function UserPreferencedCurrencyDisplay({
const prefixComponent = useMemo(() => { const prefixComponent = useMemo(() => {
return ( return (
currency === ETH && currency === ETH &&
showEthLogo && <img src="/images/eth.svg" height={ethLogoHeight} alt="" /> showEthLogo && (
<img src="./images/eth.svg" height={ethLogoHeight} alt="" />
)
); );
}, [currency, showEthLogo, ethLogoHeight]); }, [currency, showEthLogo, ethLogoHeight]);

View File

@ -7,7 +7,11 @@ const ErrorMessage = (props, context) => {
return ( return (
<div className="error-message"> <div className="error-message">
<img src="/images/alert-red.svg" alt="" className="error-message__icon" /> <img
src="./images/alert-red.svg"
alt=""
className="error-message__icon"
/>
<div className="error-message__text">{`ALERT: ${error}`}</div> <div className="error-message__text">{`ALERT: ${error}`}</div>
</div> </div>
); );

View File

@ -25,7 +25,7 @@ export default class MetaFoxLogo extends PureComponent {
> >
<img <img
height="30" height="30"
src="/images/logo/metamask-logo-horizontal.svg" src="./images/logo/metamask-logo-horizontal.svg"
className={classnames( className={classnames(
'app-header__metafox-logo', 'app-header__metafox-logo',
'app-header__metafox-logo--horizontal', 'app-header__metafox-logo--horizontal',
@ -34,7 +34,7 @@ export default class MetaFoxLogo extends PureComponent {
/> />
<img <img
{...iconProps} {...iconProps}
src="/images/logo/metamask-fox.svg" src="./images/logo/metamask-fox.svg"
className={classnames( className={classnames(
'app-header__metafox-logo', 'app-header__metafox-logo',
'app-header__metafox-logo--icon', 'app-header__metafox-logo--icon',

View File

@ -350,7 +350,7 @@ export default class ConfirmApproveContent extends Component {
<div className="confirm-approve-content__full-tx-content"> <div className="confirm-approve-content__full-tx-content">
<div className="confirm-approve-content__permission"> <div className="confirm-approve-content__permission">
{this.renderApproveContentCard({ {this.renderApproveContentCard({
symbol: <img src="/images/user-check.svg" alt="" />, symbol: <img src="./images/user-check.svg" alt="" />,
title: 'Permission', title: 'Permission',
content: this.renderPermissionContent(), content: this.renderPermissionContent(),
showEdit: true, showEdit: true,

View File

@ -0,0 +1,67 @@
/* eslint-disable react/prop-types */
import React, { useEffect } from 'react';
import { text } from '@storybook/addon-knobs';
import { useParams } from 'react-router-dom';
import { useSelector } from 'react-redux';
import { updateMetamaskState } from '../../store/actions';
import { currentNetworkTxListSelector } from '../../selectors/transactions';
import { store } from '../../../.storybook/preview';
import {
currentNetworkTxListSample,
domainMetadata,
} from '../../../.storybook/initial-states/approval-screens/token-approval';
import ConfirmApprove from '.';
export default {
title: 'Confirmation Screens',
};
// transaction ID, maps to entry in state.metamask.currentNetworkTxList
const txId = 7900715443136469;
const PageSet = ({ children }) => {
const origin = text('Origin', 'https://metamask.github.io');
const domainIconUrl = text(
'Icon URL',
'https://metamask.github.io/test-dapp/metamask-fox.svg',
);
const currentNetworkTxList = useSelector(currentNetworkTxListSelector);
const transaction = currentNetworkTxList.find(({ id }) => id === txId);
useEffect(() => {
transaction.origin = origin;
store.dispatch(
updateMetamaskState({ currentNetworkTxList: [transaction] }),
);
}, [origin]);
useEffect(() => {
store.dispatch(
updateMetamaskState({
domainMetadata: {
[origin]: {
icon: domainIconUrl,
},
},
}),
);
}, [domainIconUrl]);
const params = useParams();
params.id = txId;
return children;
};
export const ApproveTokens = () => {
store.dispatch(
updateMetamaskState({ currentNetworkTxList: [currentNetworkTxListSample] }),
);
store.dispatch(updateMetamaskState({ domainMetadata }));
return (
<PageSet>
<ConfirmApprove />
</PageSet>
);
};

View File

@ -86,7 +86,7 @@ export default function ConfirmTokenTransactionBase({
primaryTotalTextOverride={ primaryTotalTextOverride={
<div> <div>
<span>{`${tokensText} + `}</span> <span>{`${tokensText} + `}</span>
<img src="/images/eth.svg" height="18" alt="" /> <img src="./images/eth.svg" height="18" alt="" />
<span>{ethTransactionTotal}</span> <span>{ethTransactionTotal}</span>
</div> </div>
} }

View File

@ -50,7 +50,7 @@ export default class SelectAction extends PureComponent {
<div className="select-action__select-button"> <div className="select-action__select-button">
<div className="select-action__button-content"> <div className="select-action__button-content">
<div className="select-action__button-symbol"> <div className="select-action__button-symbol">
<img src="/images/download-alt.svg" alt="" /> <img src="./images/download-alt.svg" alt="" />
</div> </div>
<div className="select-action__button-text-big"> <div className="select-action__button-text-big">
{t('noAlreadyHaveSeed')} {t('noAlreadyHaveSeed')}
@ -70,7 +70,7 @@ export default class SelectAction extends PureComponent {
<div className="select-action__select-button"> <div className="select-action__select-button">
<div className="select-action__button-content"> <div className="select-action__button-content">
<div className="select-action__button-symbol"> <div className="select-action__button-symbol">
<img src="/images/thin-plus.svg" alt="" /> <img src="./images/thin-plus.svg" alt="" />
</div> </div>
<div className="select-action__button-text-big"> <div className="select-action__button-text-big">
{t('letsGoSetUp')} {t('letsGoSetUp')}

View File

@ -49,7 +49,7 @@ export default class ContactListTab extends Component {
return ( return (
<div className="address-book__container"> <div className="address-book__container">
<div> <div>
<img src="/images/address-book.svg" alt="Address book icon" /> <img src="./images/address-book.svg" alt="Address book icon" />
<h4 className="address-book__title">{t('builContactList')}</h4> <h4 className="address-book__title">{t('builContactList')}</h4>
<p className="address-book__sub-title"> <p className="address-book__sub-title">
{t('addFriendsAndAddresses')} {t('addFriendsAndAddresses')}

View File

@ -404,7 +404,7 @@ export default function BuildQuote({
}} }}
> >
<img <img
src="/images/icons/swap2.svg" src="./images/icons/swap2.svg"
alt={t('swapSwapSwitch')} alt={t('swapSwapSwitch')}
width="12" width="12"
height="16" height="16"

View File

@ -80,7 +80,7 @@ const QuoteDetails = ({
<div className="quote-details__row quote-details__row--high"> <div className="quote-details__row quote-details__row--high">
<div className="quote-details__detail-header"> <div className="quote-details__detail-header">
<img <img
src="/images/logo/metamask-fox.svg" src="./images/logo/metamask-fox.svg"
className="quote-details__metafox-logo" className="quote-details__metafox-logo"
alt="" alt=""
/> />

View File

@ -13486,6 +13486,13 @@ history@^4.9.0:
tiny-warning "^1.0.0" tiny-warning "^1.0.0"
value-equal "^1.0.1" value-equal "^1.0.1"
history@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/history/-/history-5.0.0.tgz#0cabbb6c4bbf835addb874f8259f6d25101efd08"
integrity sha512-3NyRMKIiFSJmIPdq7FxkNMJkQ7ZEtVblOQ38VtKaA0zZMW1Eo6Q6W8oDKEflr1kNNTItSnk4JMCO1deeSgbLLg==
dependencies:
"@babel/runtime" "^7.7.6"
hmac-drbg@^1.0.1: hmac-drbg@^1.0.1:
version "1.0.1" version "1.0.1"
resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"