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

Use Parity on-chain registry only when is needed (#6052)

* add and use knownMethodData to avoid infura requests

* dataMethod to methodData and check empty response
This commit is contained in:
Esteban Miño 2019-01-22 15:22:56 -03:00 committed by Dan Finlay
parent fe780fb3d4
commit e21dfd1862
7 changed files with 61 additions and 6 deletions

View File

@ -19,6 +19,7 @@ class PreferencesController {
* @property {boolean} store.useBlockie The users preference for blockie identicons within the UI
* @property {object} store.featureFlags A key-boolean map, where keys refer to features and booleans to whether the
* user wishes to see that feature
* @property {object} store.knownMethodData Contains all data methods known by the user
* @property {string} store.currentLocale The preferred language locale key
* @property {string} store.selectedAddress A hex string that matches the currently selected address in the app
*
@ -36,6 +37,7 @@ class PreferencesController {
betaUI: true,
skipAnnounceBetaUI: true,
},
knownMethodData: {},
currentLocale: opts.initLangCode,
identities: {},
lostIdentities: {},
@ -98,6 +100,18 @@ class PreferencesController {
this.store.updateState({ suggestedTokens: suggested })
}
/**
* Add new methodData to state, to avoid requesting this information again through Infura
*
* @param {string} fourBytePrefix Four-byte method signature
* @param {string} methodData Corresponding data method
*/
addKnownMethodData (fourBytePrefix, methodData) {
const knownMethodData = this.store.getState().knownMethodData
knownMethodData[fourBytePrefix] = methodData
this.store.updateState({ knownMethodData })
}
/**
* RPC engine middleware for requesting new asset added
*

View File

@ -425,6 +425,7 @@ module.exports = class MetamaskController extends EventEmitter {
setAccountLabel: nodeify(preferencesController.setAccountLabel, preferencesController),
setFeatureFlag: nodeify(preferencesController.setFeatureFlag, preferencesController),
setPreference: nodeify(preferencesController.setPreference, preferencesController),
addKnownMethodData: nodeify(preferencesController.addKnownMethodData, preferencesController),
// BlacklistController
whitelistPhishingDomain: this.whitelistPhishingDomain.bind(this),

View File

@ -236,6 +236,7 @@ var actions = {
removeToken,
updateTokens,
removeSuggestedTokens,
addKnownMethodData,
UPDATE_TOKENS: 'UPDATE_TOKENS',
setRpcTarget: setRpcTarget,
delRpcTarget: delRpcTarget,
@ -1490,7 +1491,6 @@ const backgroundSetLocked = () => {
if (error) {
return reject(error)
}
resolve()
})
})
@ -1721,6 +1721,12 @@ function removeSuggestedTokens () {
}
}
function addKnownMethodData (fourBytePrefix, methodData) {
return (dispatch) => {
background.addKnownMethodData(fourBytePrefix, methodData)
}
}
function updateTokens (newTokens) {
return {
type: actions.UPDATE_TOKENS,

View File

@ -3,7 +3,7 @@ import { withRouter } from 'react-router-dom'
import { compose } from 'recompose'
import withMethodData from '../../higher-order-components/with-method-data'
import TransactionListItem from './transaction-list-item.component'
import { setSelectedToken, showModal, showSidebar } from '../../actions'
import { setSelectedToken, showModal, showSidebar, addKnownMethodData } from '../../actions'
import { hexToDecimal } from '../../helpers/conversions.util'
import { getTokenData } from '../../helpers/transactions.util'
import { increaseLastGasPrice } from '../../helpers/confirm-transaction/util'
@ -15,11 +15,19 @@ import {
setCustomGasLimit,
} from '../../ducks/gas.duck'
const mapStateToProps = state => {
const { metamask: { knownMethodData } } = state
return {
knownMethodData,
}
}
const mapDispatchToProps = dispatch => {
return {
fetchBasicGasAndTimeEstimates: () => dispatch(fetchBasicGasAndTimeEstimates()),
fetchGasEstimates: (blockTime) => dispatch(fetchGasEstimates(blockTime)),
setSelectedToken: tokenAddress => dispatch(setSelectedToken(tokenAddress)),
addKnownMethodData: (fourBytePrefix, methodData) => dispatch(addKnownMethodData(fourBytePrefix, methodData)),
retryTransaction: (transaction, gasPrice) => {
dispatch(setCustomGasPriceForRetry(gasPrice || transaction.txParams.gasPrice))
dispatch(setCustomGasLimit(transaction.txParams.gas))
@ -64,6 +72,6 @@ const mergeProps = (stateProps, dispatchProps, ownProps) => {
export default compose(
withRouter,
connect(null, mapDispatchToProps, mergeProps),
connect(mapStateToProps, mapDispatchToProps, mergeProps),
withMethodData,
)(TransactionListItem)

View File

@ -59,6 +59,18 @@ export function isConfirmDeployContract (txData = {}) {
return !txParams.to
}
/**
* Returns four-byte method signature from data
*
* @param {string} data - The hex data (@code txParams.data) of a transaction
* @returns {string} - The four-byte method signature
*/
export function getFourBytePrefix (data = '') {
const prefixedData = ethUtil.addHexPrefix(data)
const fourBytePrefix = prefixedData.slice(0, 10)
return fourBytePrefix
}
/**
* Returns the action of a transaction as a key to be passed into the translator.
* @param {Object} transaction - txData object

View File

@ -1,15 +1,18 @@
import React, { PureComponent } from 'react'
import PropTypes from 'prop-types'
import { getMethodData } from '../../helpers/transactions.util'
import { getMethodData, getFourBytePrefix } from '../../helpers/transactions.util'
export default function withMethodData (WrappedComponent) {
return class MethodDataWrappedComponent extends PureComponent {
static propTypes = {
transaction: PropTypes.object,
knownMethodData: PropTypes.object,
addKnownMethodData: PropTypes.func,
}
static defaultProps = {
transaction: {},
knownMethodData: {},
}
state = {
@ -23,12 +26,22 @@ export default function withMethodData (WrappedComponent) {
}
async fetchMethodData () {
const { transaction } = this.props
const { transaction, knownMethodData, addKnownMethodData } = this.props
const { txParams: { data = '' } = {} } = transaction
if (data) {
try {
const methodData = await getMethodData(data)
let methodData
const fourBytePrefix = getFourBytePrefix(data)
if (fourBytePrefix in knownMethodData) {
methodData = knownMethodData[fourBytePrefix]
} else {
methodData = await getMethodData(data)
if (!Object.entries(methodData).length === 0) {
addKnownMethodData(fourBytePrefix, methodData)
}
}
this.setState({ methodData, done: true })
} catch (error) {
this.setState({ done: true, error })

View File

@ -54,6 +54,7 @@ function reduceMetamask (state, action) {
preferences: {
useNativeCurrencyAsPrimaryCurrency: true,
},
knownMethodData: {},
}, state.metamask)
switch (action.type) {