Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Merged
merged 2 commits into from
Jan 22, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions app/scripts/controllers/preferences.js
Original file line number Diff line number Diff line change
Expand Up @@ -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
*
Expand All @@ -36,6 +37,7 @@ class PreferencesController {
betaUI: true,
skipAnnounceBetaUI: true,
},
knownMethodData: {},
currentLocale: opts.initLangCode,
identities: {},
lostIdentities: {},
Expand Down Expand Up @@ -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
*
Expand Down
1 change: 1 addition & 0 deletions app/scripts/metamask-controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -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),
Expand Down
8 changes: 7 additions & 1 deletion ui/app/actions.js
Original file line number Diff line number Diff line change
Expand Up @@ -236,6 +236,7 @@ var actions = {
removeToken,
updateTokens,
removeSuggestedTokens,
addKnownMethodData,
UPDATE_TOKENS: 'UPDATE_TOKENS',
setRpcTarget: setRpcTarget,
delRpcTarget: delRpcTarget,
Expand Down Expand Up @@ -1490,7 +1491,6 @@ const backgroundSetLocked = () => {
if (error) {
return reject(error)
}

resolve()
})
})
Expand Down Expand Up @@ -1721,6 +1721,12 @@ function removeSuggestedTokens () {
}
}

function addKnownMethodData (fourBytePrefix, methodData) {
return (dispatch) => {
background.addKnownMethodData(fourBytePrefix, methodData)
}
}

function updateTokens (newTokens) {
return {
type: actions.UPDATE_TOKENS,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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'
Expand All @@ -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))
Expand Down Expand Up @@ -64,6 +72,6 @@ const mergeProps = (stateProps, dispatchProps, ownProps) => {

export default compose(
withRouter,
connect(null, mapDispatchToProps, mergeProps),
connect(mapStateToProps, mapDispatchToProps, mergeProps),
withMethodData,
)(TransactionListItem)
12 changes: 12 additions & 0 deletions ui/app/helpers/transactions.util.js
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
@@ -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 = {
Expand All @@ -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 })
Expand Down
1 change: 1 addition & 0 deletions ui/app/reducers/metamask.js
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ function reduceMetamask (state, action) {
preferences: {
useNativeCurrencyAsPrimaryCurrency: true,
},
knownMethodData: {},
}, state.metamask)

switch (action.type) {
Expand Down