parent
8defb365b4
commit
800eb2b969
File diff suppressed because it is too large
Load Diff
@ -1,76 +0,0 @@ |
|||||||
const extend = require('xtend') |
|
||||||
const copyToClipboard = require('copy-to-clipboard') |
|
||||||
|
|
||||||
//
|
|
||||||
// Sub-Reducers take in the complete state and return their sub-state
|
|
||||||
//
|
|
||||||
const reduceIdentities = require('./reducers/identities') |
|
||||||
const reduceMetamask = require('./reducers/metamask') |
|
||||||
const reduceApp = require('./reducers/app') |
|
||||||
|
|
||||||
window.METAMASK_CACHED_LOG_STATE = null |
|
||||||
|
|
||||||
module.exports = rootReducer |
|
||||||
|
|
||||||
function rootReducer (state, action) { |
|
||||||
// clone
|
|
||||||
state = extend(state) |
|
||||||
|
|
||||||
if (action.type === 'GLOBAL_FORCE_UPDATE') { |
|
||||||
return action.value |
|
||||||
} |
|
||||||
|
|
||||||
//
|
|
||||||
// Identities
|
|
||||||
//
|
|
||||||
|
|
||||||
state.identities = reduceIdentities(state, action) |
|
||||||
|
|
||||||
//
|
|
||||||
// MetaMask
|
|
||||||
//
|
|
||||||
|
|
||||||
state.metamask = reduceMetamask(state, action) |
|
||||||
|
|
||||||
//
|
|
||||||
// AppState
|
|
||||||
//
|
|
||||||
|
|
||||||
state.appState = reduceApp(state, action) |
|
||||||
|
|
||||||
window.METAMASK_CACHED_LOG_STATE = state |
|
||||||
return state |
|
||||||
} |
|
||||||
|
|
||||||
window.logStateString = function (cb) { |
|
||||||
const state = window.METAMASK_CACHED_LOG_STATE |
|
||||||
const version = global.platform.getVersion() |
|
||||||
const browser = window.navigator.userAgent |
|
||||||
return global.platform.getPlatformInfo((err, platform) => { |
|
||||||
if (err) { |
|
||||||
return cb(err) |
|
||||||
} |
|
||||||
state.version = version |
|
||||||
state.platform = platform |
|
||||||
state.browser = browser |
|
||||||
const stateString = JSON.stringify(state, removeSeedWords, 2) |
|
||||||
return cb(null, stateString) |
|
||||||
}) |
|
||||||
} |
|
||||||
|
|
||||||
window.logState = function (toClipboard) { |
|
||||||
return window.logStateString((err, result) => { |
|
||||||
if (err) { |
|
||||||
console.error(err.message) |
|
||||||
} else if (toClipboard) { |
|
||||||
copyToClipboard(result) |
|
||||||
console.log('State log copied') |
|
||||||
} else { |
|
||||||
console.log(result) |
|
||||||
} |
|
||||||
}) |
|
||||||
} |
|
||||||
|
|
||||||
function removeSeedWords (key, value) { |
|
||||||
return key === 'seedWords' ? undefined : value |
|
||||||
} |
|
@ -1,599 +0,0 @@ |
|||||||
const extend = require('xtend') |
|
||||||
const actions = require('../../../ui/app/actions') |
|
||||||
const txHelper = require('../../lib/tx-helper') |
|
||||||
|
|
||||||
module.exports = reduceApp |
|
||||||
|
|
||||||
|
|
||||||
function reduceApp (state, action) { |
|
||||||
log.debug('App Reducer got ' + action.type) |
|
||||||
// clone and defaults
|
|
||||||
const selectedAddress = state.metamask.selectedAddress |
|
||||||
const hasUnconfActions = checkUnconfActions(state) |
|
||||||
let name = 'accounts' |
|
||||||
if (selectedAddress) { |
|
||||||
name = 'accountDetail' |
|
||||||
} |
|
||||||
if (hasUnconfActions) { |
|
||||||
log.debug('pending txs detected, defaulting to conf-tx view.') |
|
||||||
name = 'confTx' |
|
||||||
} |
|
||||||
|
|
||||||
var defaultView = { |
|
||||||
name, |
|
||||||
detailView: null, |
|
||||||
context: selectedAddress, |
|
||||||
} |
|
||||||
|
|
||||||
// confirm seed words
|
|
||||||
var seedWords = state.metamask.seedWords |
|
||||||
var seedConfView = { |
|
||||||
name: 'createVaultComplete', |
|
||||||
seedWords, |
|
||||||
} |
|
||||||
|
|
||||||
// default state
|
|
||||||
var appState = extend({ |
|
||||||
shouldClose: false, |
|
||||||
menuOpen: false, |
|
||||||
currentView: seedWords ? seedConfView : defaultView, |
|
||||||
accountDetail: { |
|
||||||
subview: 'transactions', |
|
||||||
}, |
|
||||||
// Used to render transition direction
|
|
||||||
transForward: true, |
|
||||||
// Used to display loading indicator
|
|
||||||
isLoading: false, |
|
||||||
// Used to display error text
|
|
||||||
warning: null, |
|
||||||
}, state.appState) |
|
||||||
|
|
||||||
switch (action.type) { |
|
||||||
|
|
||||||
// transition methods
|
|
||||||
|
|
||||||
case actions.TRANSITION_FORWARD: |
|
||||||
return extend(appState, { |
|
||||||
transForward: true, |
|
||||||
}) |
|
||||||
|
|
||||||
case actions.TRANSITION_BACKWARD: |
|
||||||
return extend(appState, { |
|
||||||
transForward: false, |
|
||||||
}) |
|
||||||
|
|
||||||
// intialize
|
|
||||||
|
|
||||||
case actions.SHOW_CREATE_VAULT: |
|
||||||
return extend(appState, { |
|
||||||
currentView: { |
|
||||||
name: 'createVault', |
|
||||||
}, |
|
||||||
transForward: true, |
|
||||||
warning: null, |
|
||||||
}) |
|
||||||
|
|
||||||
case actions.SHOW_RESTORE_VAULT: |
|
||||||
return extend(appState, { |
|
||||||
currentView: { |
|
||||||
name: 'restoreVault', |
|
||||||
}, |
|
||||||
transForward: true, |
|
||||||
forgottenPassword: true, |
|
||||||
}) |
|
||||||
|
|
||||||
case actions.FORGOT_PASSWORD: |
|
||||||
return extend(appState, { |
|
||||||
currentView: { |
|
||||||
name: 'restoreVault', |
|
||||||
}, |
|
||||||
transForward: false, |
|
||||||
forgottenPassword: true, |
|
||||||
}) |
|
||||||
|
|
||||||
case actions.SHOW_INIT_MENU: |
|
||||||
return extend(appState, { |
|
||||||
currentView: defaultView, |
|
||||||
transForward: false, |
|
||||||
}) |
|
||||||
|
|
||||||
case actions.SHOW_CONFIG_PAGE: |
|
||||||
return extend(appState, { |
|
||||||
currentView: { |
|
||||||
name: 'config', |
|
||||||
context: appState.currentView.context, |
|
||||||
}, |
|
||||||
transForward: action.value, |
|
||||||
}) |
|
||||||
|
|
||||||
case actions.SHOW_ADD_TOKEN_PAGE: |
|
||||||
return extend(appState, { |
|
||||||
currentView: { |
|
||||||
name: 'add-token', |
|
||||||
context: appState.currentView.context, |
|
||||||
}, |
|
||||||
transForward: action.value, |
|
||||||
}) |
|
||||||
|
|
||||||
case actions.SHOW_IMPORT_PAGE: |
|
||||||
|
|
||||||
return extend(appState, { |
|
||||||
currentView: { |
|
||||||
name: 'import-menu', |
|
||||||
}, |
|
||||||
transForward: true, |
|
||||||
warning: null, |
|
||||||
}) |
|
||||||
|
|
||||||
case actions.SHOW_INFO_PAGE: |
|
||||||
return extend(appState, { |
|
||||||
currentView: { |
|
||||||
name: 'info', |
|
||||||
context: appState.currentView.context, |
|
||||||
}, |
|
||||||
transForward: true, |
|
||||||
}) |
|
||||||
|
|
||||||
case actions.CREATE_NEW_VAULT_IN_PROGRESS: |
|
||||||
return extend(appState, { |
|
||||||
currentView: { |
|
||||||
name: 'createVault', |
|
||||||
inProgress: true, |
|
||||||
}, |
|
||||||
transForward: true, |
|
||||||
isLoading: true, |
|
||||||
}) |
|
||||||
|
|
||||||
case actions.SHOW_NEW_VAULT_SEED: |
|
||||||
return extend(appState, { |
|
||||||
currentView: { |
|
||||||
name: 'createVaultComplete', |
|
||||||
seedWords: action.value, |
|
||||||
}, |
|
||||||
transForward: true, |
|
||||||
isLoading: false, |
|
||||||
}) |
|
||||||
|
|
||||||
case actions.NEW_ACCOUNT_SCREEN: |
|
||||||
return extend(appState, { |
|
||||||
currentView: { |
|
||||||
name: 'new-account', |
|
||||||
context: appState.currentView.context, |
|
||||||
}, |
|
||||||
transForward: true, |
|
||||||
}) |
|
||||||
|
|
||||||
case actions.SHOW_SEND_PAGE: |
|
||||||
return extend(appState, { |
|
||||||
currentView: { |
|
||||||
name: 'sendTransaction', |
|
||||||
context: appState.currentView.context, |
|
||||||
}, |
|
||||||
transForward: true, |
|
||||||
warning: null, |
|
||||||
}) |
|
||||||
|
|
||||||
case actions.SHOW_NEW_KEYCHAIN: |
|
||||||
return extend(appState, { |
|
||||||
currentView: { |
|
||||||
name: 'newKeychain', |
|
||||||
context: appState.currentView.context, |
|
||||||
}, |
|
||||||
transForward: true, |
|
||||||
}) |
|
||||||
|
|
||||||
// unlock
|
|
||||||
|
|
||||||
case actions.UNLOCK_METAMASK: |
|
||||||
return extend(appState, { |
|
||||||
forgottenPassword: appState.forgottenPassword ? !appState.forgottenPassword : null, |
|
||||||
detailView: {}, |
|
||||||
transForward: true, |
|
||||||
isLoading: false, |
|
||||||
warning: null, |
|
||||||
}) |
|
||||||
|
|
||||||
case actions.LOCK_METAMASK: |
|
||||||
return extend(appState, { |
|
||||||
currentView: defaultView, |
|
||||||
transForward: false, |
|
||||||
warning: null, |
|
||||||
}) |
|
||||||
|
|
||||||
case actions.BACK_TO_INIT_MENU: |
|
||||||
return extend(appState, { |
|
||||||
warning: null, |
|
||||||
transForward: false, |
|
||||||
forgottenPassword: true, |
|
||||||
currentView: { |
|
||||||
name: 'InitMenu', |
|
||||||
}, |
|
||||||
}) |
|
||||||
|
|
||||||
case actions.BACK_TO_UNLOCK_VIEW: |
|
||||||
return extend(appState, { |
|
||||||
warning: null, |
|
||||||
transForward: true, |
|
||||||
forgottenPassword: false, |
|
||||||
currentView: { |
|
||||||
name: 'UnlockScreen', |
|
||||||
}, |
|
||||||
}) |
|
||||||
// reveal seed words
|
|
||||||
|
|
||||||
case actions.REVEAL_SEED_CONFIRMATION: |
|
||||||
return extend(appState, { |
|
||||||
currentView: { |
|
||||||
name: 'reveal-seed-conf', |
|
||||||
}, |
|
||||||
transForward: true, |
|
||||||
warning: null, |
|
||||||
}) |
|
||||||
|
|
||||||
// accounts
|
|
||||||
|
|
||||||
case actions.SET_SELECTED_ACCOUNT: |
|
||||||
return extend(appState, { |
|
||||||
activeAddress: action.value, |
|
||||||
}) |
|
||||||
|
|
||||||
case actions.GO_HOME: |
|
||||||
return extend(appState, { |
|
||||||
currentView: extend(appState.currentView, { |
|
||||||
name: 'accountDetail', |
|
||||||
}), |
|
||||||
accountDetail: { |
|
||||||
subview: 'transactions', |
|
||||||
accountExport: 'none', |
|
||||||
privateKey: '', |
|
||||||
}, |
|
||||||
transForward: false, |
|
||||||
warning: null, |
|
||||||
}) |
|
||||||
|
|
||||||
case actions.SHOW_ACCOUNT_DETAIL: |
|
||||||
return extend(appState, { |
|
||||||
forgottenPassword: appState.forgottenPassword ? !appState.forgottenPassword : null, |
|
||||||
currentView: { |
|
||||||
name: 'accountDetail', |
|
||||||
context: action.value, |
|
||||||
}, |
|
||||||
accountDetail: { |
|
||||||
subview: 'transactions', |
|
||||||
accountExport: 'none', |
|
||||||
privateKey: '', |
|
||||||
}, |
|
||||||
transForward: false, |
|
||||||
}) |
|
||||||
|
|
||||||
case actions.BACK_TO_ACCOUNT_DETAIL: |
|
||||||
return extend(appState, { |
|
||||||
currentView: { |
|
||||||
name: 'accountDetail', |
|
||||||
context: action.value, |
|
||||||
}, |
|
||||||
accountDetail: { |
|
||||||
subview: 'transactions', |
|
||||||
accountExport: 'none', |
|
||||||
privateKey: '', |
|
||||||
}, |
|
||||||
transForward: false, |
|
||||||
}) |
|
||||||
|
|
||||||
case actions.SHOW_ACCOUNTS_PAGE: |
|
||||||
return extend(appState, { |
|
||||||
currentView: { |
|
||||||
name: seedWords ? 'createVaultComplete' : 'accounts', |
|
||||||
seedWords, |
|
||||||
}, |
|
||||||
transForward: true, |
|
||||||
isLoading: false, |
|
||||||
warning: null, |
|
||||||
scrollToBottom: false, |
|
||||||
forgottenPassword: false, |
|
||||||
}) |
|
||||||
|
|
||||||
case actions.SHOW_NOTICE: |
|
||||||
return extend(appState, { |
|
||||||
transForward: true, |
|
||||||
isLoading: false, |
|
||||||
}) |
|
||||||
|
|
||||||
case actions.REVEAL_ACCOUNT: |
|
||||||
return extend(appState, { |
|
||||||
scrollToBottom: true, |
|
||||||
}) |
|
||||||
|
|
||||||
case actions.SHOW_CONF_TX_PAGE: |
|
||||||
return extend(appState, { |
|
||||||
currentView: { |
|
||||||
name: 'confTx', |
|
||||||
context: 0, |
|
||||||
}, |
|
||||||
transForward: action.transForward, |
|
||||||
warning: null, |
|
||||||
isLoading: false, |
|
||||||
}) |
|
||||||
|
|
||||||
case actions.SHOW_CONF_MSG_PAGE: |
|
||||||
return extend(appState, { |
|
||||||
currentView: { |
|
||||||
name: hasUnconfActions ? 'confTx' : 'account-detail', |
|
||||||
context: 0, |
|
||||||
}, |
|
||||||
transForward: true, |
|
||||||
warning: null, |
|
||||||
isLoading: false, |
|
||||||
}) |
|
||||||
|
|
||||||
case actions.COMPLETED_TX: |
|
||||||
log.debug('reducing COMPLETED_TX for tx ' + action.value) |
|
||||||
const otherUnconfActions = getUnconfActionList(state) |
|
||||||
.filter(tx => tx.id !== action.value) |
|
||||||
const hasOtherUnconfActions = otherUnconfActions.length > 0 |
|
||||||
|
|
||||||
if (hasOtherUnconfActions) { |
|
||||||
log.debug('reducer detected txs - rendering confTx view') |
|
||||||
return extend(appState, { |
|
||||||
transForward: false, |
|
||||||
currentView: { |
|
||||||
name: 'confTx', |
|
||||||
context: 0, |
|
||||||
}, |
|
||||||
warning: null, |
|
||||||
}) |
|
||||||
} else { |
|
||||||
log.debug('attempting to close popup') |
|
||||||
return extend(appState, { |
|
||||||
// indicate notification should close
|
|
||||||
shouldClose: true, |
|
||||||
transForward: false, |
|
||||||
warning: null, |
|
||||||
currentView: { |
|
||||||
name: 'accountDetail', |
|
||||||
context: state.metamask.selectedAddress, |
|
||||||
}, |
|
||||||
accountDetail: { |
|
||||||
subview: 'transactions', |
|
||||||
}, |
|
||||||
}) |
|
||||||
} |
|
||||||
|
|
||||||
case actions.NEXT_TX: |
|
||||||
return extend(appState, { |
|
||||||
transForward: true, |
|
||||||
currentView: { |
|
||||||
name: 'confTx', |
|
||||||
context: ++appState.currentView.context, |
|
||||||
warning: null, |
|
||||||
}, |
|
||||||
}) |
|
||||||
|
|
||||||
case actions.VIEW_PENDING_TX: |
|
||||||
const context = indexForPending(state, action.value) |
|
||||||
return extend(appState, { |
|
||||||
transForward: true, |
|
||||||
currentView: { |
|
||||||
name: 'confTx', |
|
||||||
context, |
|
||||||
warning: null, |
|
||||||
}, |
|
||||||
}) |
|
||||||
|
|
||||||
case actions.PREVIOUS_TX: |
|
||||||
return extend(appState, { |
|
||||||
transForward: false, |
|
||||||
currentView: { |
|
||||||
name: 'confTx', |
|
||||||
context: --appState.currentView.context, |
|
||||||
warning: null, |
|
||||||
}, |
|
||||||
}) |
|
||||||
|
|
||||||
case actions.TRANSACTION_ERROR: |
|
||||||
return extend(appState, { |
|
||||||
currentView: { |
|
||||||
name: 'confTx', |
|
||||||
errorMessage: 'There was a problem submitting this transaction.', |
|
||||||
}, |
|
||||||
}) |
|
||||||
|
|
||||||
case actions.UNLOCK_FAILED: |
|
||||||
return extend(appState, { |
|
||||||
warning: action.value || 'Incorrect password. Try again.', |
|
||||||
}) |
|
||||||
|
|
||||||
case actions.SHOW_LOADING: |
|
||||||
return extend(appState, { |
|
||||||
isLoading: true, |
|
||||||
loadingMessage: action.value, |
|
||||||
}) |
|
||||||
|
|
||||||
case actions.HIDE_LOADING: |
|
||||||
return extend(appState, { |
|
||||||
isLoading: false, |
|
||||||
}) |
|
||||||
|
|
||||||
case actions.SHOW_SUB_LOADING_INDICATION: |
|
||||||
return extend(appState, { |
|
||||||
isSubLoading: true, |
|
||||||
}) |
|
||||||
|
|
||||||
case actions.HIDE_SUB_LOADING_INDICATION: |
|
||||||
return extend(appState, { |
|
||||||
isSubLoading: false, |
|
||||||
}) |
|
||||||
case actions.CLEAR_SEED_WORD_CACHE: |
|
||||||
return extend(appState, { |
|
||||||
transForward: true, |
|
||||||
currentView: {}, |
|
||||||
isLoading: false, |
|
||||||
accountDetail: { |
|
||||||
subview: 'transactions', |
|
||||||
accountExport: 'none', |
|
||||||
privateKey: '', |
|
||||||
}, |
|
||||||
}) |
|
||||||
|
|
||||||
case actions.DISPLAY_WARNING: |
|
||||||
return extend(appState, { |
|
||||||
warning: action.value, |
|
||||||
isLoading: false, |
|
||||||
}) |
|
||||||
|
|
||||||
case actions.HIDE_WARNING: |
|
||||||
return extend(appState, { |
|
||||||
warning: undefined, |
|
||||||
}) |
|
||||||
|
|
||||||
case actions.REQUEST_ACCOUNT_EXPORT: |
|
||||||
return extend(appState, { |
|
||||||
transForward: true, |
|
||||||
currentView: { |
|
||||||
name: 'accountDetail', |
|
||||||
context: appState.currentView.context, |
|
||||||
}, |
|
||||||
accountDetail: { |
|
||||||
subview: 'export', |
|
||||||
accountExport: 'requested', |
|
||||||
}, |
|
||||||
}) |
|
||||||
|
|
||||||
case actions.EXPORT_ACCOUNT: |
|
||||||
return extend(appState, { |
|
||||||
accountDetail: { |
|
||||||
subview: 'export', |
|
||||||
accountExport: 'completed', |
|
||||||
}, |
|
||||||
}) |
|
||||||
|
|
||||||
case actions.SHOW_PRIVATE_KEY: |
|
||||||
return extend(appState, { |
|
||||||
accountDetail: { |
|
||||||
subview: 'export', |
|
||||||
accountExport: 'completed', |
|
||||||
privateKey: action.value, |
|
||||||
}, |
|
||||||
}) |
|
||||||
|
|
||||||
case actions.BUY_ETH_VIEW: |
|
||||||
return extend(appState, { |
|
||||||
transForward: true, |
|
||||||
currentView: { |
|
||||||
name: 'buyEth', |
|
||||||
context: appState.currentView.name, |
|
||||||
}, |
|
||||||
identity: state.metamask.identities[action.value], |
|
||||||
buyView: { |
|
||||||
subview: 'Coinbase', |
|
||||||
amount: '15.00', |
|
||||||
buyAddress: action.value, |
|
||||||
formView: { |
|
||||||
coinbase: true, |
|
||||||
shapeshift: false, |
|
||||||
}, |
|
||||||
}, |
|
||||||
}) |
|
||||||
|
|
||||||
case actions.ONBOARDING_BUY_ETH_VIEW: |
|
||||||
return extend(appState, { |
|
||||||
transForward: true, |
|
||||||
currentView: { |
|
||||||
name: 'onboardingBuyEth', |
|
||||||
context: appState.currentView.name, |
|
||||||
}, |
|
||||||
identity: state.metamask.identities[action.value], |
|
||||||
}) |
|
||||||
|
|
||||||
case actions.COINBASE_SUBVIEW: |
|
||||||
return extend(appState, { |
|
||||||
buyView: { |
|
||||||
subview: 'Coinbase', |
|
||||||
formView: { |
|
||||||
coinbase: true, |
|
||||||
shapeshift: false, |
|
||||||
}, |
|
||||||
buyAddress: appState.buyView.buyAddress, |
|
||||||
amount: appState.buyView.amount, |
|
||||||
}, |
|
||||||
}) |
|
||||||
|
|
||||||
case actions.SHAPESHIFT_SUBVIEW: |
|
||||||
return extend(appState, { |
|
||||||
buyView: { |
|
||||||
subview: 'ShapeShift', |
|
||||||
formView: { |
|
||||||
coinbase: false, |
|
||||||
shapeshift: true, |
|
||||||
marketinfo: action.value.marketinfo, |
|
||||||
coinOptions: action.value.coinOptions, |
|
||||||
}, |
|
||||||
buyAddress: appState.buyView.buyAddress, |
|
||||||
amount: appState.buyView.amount, |
|
||||||
}, |
|
||||||
}) |
|
||||||
|
|
||||||
case actions.PAIR_UPDATE: |
|
||||||
return extend(appState, { |
|
||||||
buyView: { |
|
||||||
subview: 'ShapeShift', |
|
||||||
formView: { |
|
||||||
coinbase: false, |
|
||||||
shapeshift: true, |
|
||||||
marketinfo: action.value.marketinfo, |
|
||||||
coinOptions: appState.buyView.formView.coinOptions, |
|
||||||
}, |
|
||||||
buyAddress: appState.buyView.buyAddress, |
|
||||||
amount: appState.buyView.amount, |
|
||||||
warning: null, |
|
||||||
}, |
|
||||||
}) |
|
||||||
|
|
||||||
case actions.SHOW_QR: |
|
||||||
return extend(appState, { |
|
||||||
qrRequested: true, |
|
||||||
transForward: true, |
|
||||||
|
|
||||||
Qr: { |
|
||||||
message: action.value.message, |
|
||||||
data: action.value.data, |
|
||||||
}, |
|
||||||
}) |
|
||||||
|
|
||||||
case actions.SHOW_QR_VIEW: |
|
||||||
return extend(appState, { |
|
||||||
currentView: { |
|
||||||
name: 'qr', |
|
||||||
context: appState.currentView.context, |
|
||||||
}, |
|
||||||
transForward: true, |
|
||||||
Qr: { |
|
||||||
message: action.value.message, |
|
||||||
data: action.value.data, |
|
||||||
}, |
|
||||||
}) |
|
||||||
default: |
|
||||||
return appState |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
function checkUnconfActions (state) { |
|
||||||
const unconfActionList = getUnconfActionList(state) |
|
||||||
const hasUnconfActions = unconfActionList.length > 0 |
|
||||||
return hasUnconfActions |
|
||||||
} |
|
||||||
|
|
||||||
function getUnconfActionList (state) { |
|
||||||
const { unapprovedTxs, unapprovedMsgs, |
|
||||||
unapprovedPersonalMsgs, unapprovedTypedMessages, network } = state.metamask |
|
||||||
|
|
||||||
const unconfActionList = txHelper(unapprovedTxs, unapprovedMsgs, unapprovedPersonalMsgs, unapprovedTypedMessages, network) |
|
||||||
return unconfActionList |
|
||||||
} |
|
||||||
|
|
||||||
function indexForPending (state, txId) { |
|
||||||
const unconfTxList = getUnconfActionList(state) |
|
||||||
const match = unconfTxList.find((tx) => tx.id === txId) |
|
||||||
const index = unconfTxList.indexOf(match) |
|
||||||
return index |
|
||||||
} |
|
@ -1,15 +0,0 @@ |
|||||||
const extend = require('xtend') |
|
||||||
|
|
||||||
module.exports = reduceIdentities |
|
||||||
|
|
||||||
function reduceIdentities (state, action) { |
|
||||||
// clone + defaults
|
|
||||||
var idState = extend({ |
|
||||||
|
|
||||||
}, state.identities) |
|
||||||
|
|
||||||
switch (action.type) { |
|
||||||
default: |
|
||||||
return idState |
|
||||||
} |
|
||||||
} |
|
@ -1,166 +0,0 @@ |
|||||||
const extend = require('xtend') |
|
||||||
const actions = require('../../../ui/app/actions') |
|
||||||
const MetamascaraPlatform = require('../../../app/scripts/platforms/window') |
|
||||||
|
|
||||||
module.exports = reduceMetamask |
|
||||||
|
|
||||||
function reduceMetamask (state, action) { |
|
||||||
let newState |
|
||||||
|
|
||||||
// clone + defaults
|
|
||||||
var metamaskState = extend({ |
|
||||||
isInitialized: false, |
|
||||||
isUnlocked: false, |
|
||||||
isMascara: window.platform instanceof MetamascaraPlatform, |
|
||||||
rpcTarget: 'https://rawtestrpc.metamask.io/', |
|
||||||
identities: {}, |
|
||||||
unapprovedTxs: {}, |
|
||||||
noActiveNotices: true, |
|
||||||
lastUnreadNotice: undefined, |
|
||||||
frequentRpcList: [], |
|
||||||
addressBook: [], |
|
||||||
tokenExchangeRates: {}, |
|
||||||
coinOptions: {}, |
|
||||||
featureFlags: {}, |
|
||||||
}, state.metamask) |
|
||||||
|
|
||||||
switch (action.type) { |
|
||||||
|
|
||||||
case actions.SHOW_ACCOUNTS_PAGE: |
|
||||||
newState = extend(metamaskState) |
|
||||||
delete newState.seedWords |
|
||||||
return newState |
|
||||||
|
|
||||||
case actions.SHOW_NOTICE: |
|
||||||
return extend(metamaskState, { |
|
||||||
noActiveNotices: false, |
|
||||||
lastUnreadNotice: action.value, |
|
||||||
}) |
|
||||||
|
|
||||||
case actions.CLEAR_NOTICES: |
|
||||||
return extend(metamaskState, { |
|
||||||
noActiveNotices: true, |
|
||||||
}) |
|
||||||
|
|
||||||
case actions.UPDATE_METAMASK_STATE: |
|
||||||
return extend(metamaskState, action.value) |
|
||||||
|
|
||||||
case actions.UNLOCK_METAMASK: |
|
||||||
return extend(metamaskState, { |
|
||||||
isUnlocked: true, |
|
||||||
isInitialized: true, |
|
||||||
selectedAddress: action.value, |
|
||||||
}) |
|
||||||
|
|
||||||
case actions.LOCK_METAMASK: |
|
||||||
return extend(metamaskState, { |
|
||||||
isUnlocked: false, |
|
||||||
}) |
|
||||||
|
|
||||||
case actions.SET_RPC_LIST: |
|
||||||
return extend(metamaskState, { |
|
||||||
frequentRpcList: action.value, |
|
||||||
}) |
|
||||||
|
|
||||||
case actions.SET_RPC_TARGET: |
|
||||||
return extend(metamaskState, { |
|
||||||
provider: { |
|
||||||
type: 'rpc', |
|
||||||
rpcTarget: action.value, |
|
||||||
}, |
|
||||||
}) |
|
||||||
|
|
||||||
case actions.SET_PROVIDER_TYPE: |
|
||||||
return extend(metamaskState, { |
|
||||||
provider: { |
|
||||||
type: action.value, |
|
||||||
}, |
|
||||||
}) |
|
||||||
|
|
||||||
case actions.COMPLETED_TX: |
|
||||||
var stringId = String(action.id) |
|
||||||
newState = extend(metamaskState, { |
|
||||||
unapprovedTxs: {}, |
|
||||||
unapprovedMsgs: {}, |
|
||||||
}) |
|
||||||
for (const id in metamaskState.unapprovedTxs) { |
|
||||||
if (id !== stringId) { |
|
||||||
newState.unapprovedTxs[id] = metamaskState.unapprovedTxs[id] |
|
||||||
} |
|
||||||
} |
|
||||||
for (const id in metamaskState.unapprovedMsgs) { |
|
||||||
if (id !== stringId) { |
|
||||||
newState.unapprovedMsgs[id] = metamaskState.unapprovedMsgs[id] |
|
||||||
} |
|
||||||
} |
|
||||||
return newState |
|
||||||
|
|
||||||
case actions.SHOW_NEW_VAULT_SEED: |
|
||||||
return extend(metamaskState, { |
|
||||||
isUnlocked: true, |
|
||||||
isInitialized: false, |
|
||||||
seedWords: action.value, |
|
||||||
}) |
|
||||||
|
|
||||||
case actions.CLEAR_SEED_WORD_CACHE: |
|
||||||
newState = extend(metamaskState, { |
|
||||||
isUnlocked: true, |
|
||||||
isInitialized: true, |
|
||||||
selectedAddress: action.value, |
|
||||||
}) |
|
||||||
delete newState.seedWords |
|
||||||
return newState |
|
||||||
|
|
||||||
case actions.SHOW_ACCOUNT_DETAIL: |
|
||||||
newState = extend(metamaskState, { |
|
||||||
isUnlocked: true, |
|
||||||
isInitialized: true, |
|
||||||
selectedAddress: action.value, |
|
||||||
}) |
|
||||||
delete newState.seedWords |
|
||||||
return newState |
|
||||||
|
|
||||||
case actions.SAVE_ACCOUNT_LABEL: |
|
||||||
const account = action.value.account |
|
||||||
const name = action.value.label |
|
||||||
var id = {} |
|
||||||
id[account] = extend(metamaskState.identities[account], { name }) |
|
||||||
var identities = extend(metamaskState.identities, id) |
|
||||||
return extend(metamaskState, { identities }) |
|
||||||
|
|
||||||
case actions.SET_CURRENT_FIAT: |
|
||||||
return extend(metamaskState, { |
|
||||||
currentCurrency: action.value.currentCurrency, |
|
||||||
conversionRate: action.value.conversionRate, |
|
||||||
conversionDate: action.value.conversionDate, |
|
||||||
}) |
|
||||||
|
|
||||||
case actions.PAIR_UPDATE: |
|
||||||
const { value: { marketinfo: pairMarketInfo } } = action |
|
||||||
return extend(metamaskState, { |
|
||||||
tokenExchangeRates: { |
|
||||||
...metamaskState.tokenExchangeRates, |
|
||||||
[pairMarketInfo.pair]: pairMarketInfo, |
|
||||||
}, |
|
||||||
}) |
|
||||||
|
|
||||||
case actions.SHAPESHIFT_SUBVIEW: |
|
||||||
const { value: { marketinfo, coinOptions } } = action |
|
||||||
return extend(metamaskState, { |
|
||||||
tokenExchangeRates: { |
|
||||||
...metamaskState.tokenExchangeRates, |
|
||||||
[marketinfo.pair]: marketinfo, |
|
||||||
}, |
|
||||||
coinOptions, |
|
||||||
}) |
|
||||||
|
|
||||||
case actions.UPDATE_FEATURE_FLAGS: |
|
||||||
return extend(metamaskState, { |
|
||||||
featureFlags: action.value, |
|
||||||
}) |
|
||||||
|
|
||||||
default: |
|
||||||
return metamaskState |
|
||||||
|
|
||||||
} |
|
||||||
} |
|
@ -1,23 +0,0 @@ |
|||||||
const inherits = require('util').inherits |
|
||||||
const Component = require('react').Component |
|
||||||
const Provider = require('react-redux').Provider |
|
||||||
const h = require('react-hyperscript') |
|
||||||
const App = require('./app') |
|
||||||
|
|
||||||
module.exports = Root |
|
||||||
|
|
||||||
inherits(Root, Component) |
|
||||||
function Root () { Component.call(this) } |
|
||||||
|
|
||||||
Root.prototype.render = function () { |
|
||||||
console.log(123454) |
|
||||||
return ( |
|
||||||
|
|
||||||
h(Provider, { |
|
||||||
store: this.props.store, |
|
||||||
}, [ |
|
||||||
h(App), |
|
||||||
]) |
|
||||||
|
|
||||||
) |
|
||||||
} |
|
@ -1,21 +0,0 @@ |
|||||||
const createStore = require('redux').createStore |
|
||||||
const applyMiddleware = require('redux').applyMiddleware |
|
||||||
const thunkMiddleware = require('redux-thunk').default |
|
||||||
const rootReducer = require('./reducers') |
|
||||||
const createLogger = require('redux-logger').createLogger |
|
||||||
|
|
||||||
global.METAMASK_DEBUG = 'GULP_METAMASK_DEBUG' |
|
||||||
|
|
||||||
module.exports = configureStore |
|
||||||
|
|
||||||
const loggerMiddleware = createLogger({ |
|
||||||
predicate: () => global.METAMASK_DEBUG, |
|
||||||
}) |
|
||||||
|
|
||||||
const middlewares = [thunkMiddleware, loggerMiddleware] |
|
||||||
|
|
||||||
const createStoreWithMiddleware = applyMiddleware(...middlewares)(createStore) |
|
||||||
|
|
||||||
function configureStore (initialState) { |
|
||||||
return createStoreWithMiddleware(rootReducer, initialState) |
|
||||||
} |
|
@ -1,20 +0,0 @@ |
|||||||
<!doctype html> |
|
||||||
<html> |
|
||||||
<head> |
|
||||||
<meta charset="utf-8"> |
|
||||||
<title>MetaMask</title> |
|
||||||
</head> |
|
||||||
<body> |
|
||||||
|
|
||||||
<!-- app content --> |
|
||||||
<div id="app-content"></div> |
|
||||||
<script src="./bundle.js" type="text/javascript" charset="utf-8"></script> |
|
||||||
|
|
||||||
<!-- design reference --> |
|
||||||
<link rel="stylesheet" type="text/css" href="./app/css/debug.css"> |
|
||||||
<div id="design-container"> |
|
||||||
<img id="design-img" src="./design/metamask_wfs_jan_13.png"> |
|
||||||
</div> |
|
||||||
|
|
||||||
</body> |
|
||||||
</html> |
|
@ -1,58 +0,0 @@ |
|||||||
const render = require('react-dom').render |
|
||||||
const h = require('react-hyperscript') |
|
||||||
const Root = require('./app/root') |
|
||||||
const actions = require('./app/actions') |
|
||||||
const configureStore = require('./app/store') |
|
||||||
const txHelper = require('./lib/tx-helper') |
|
||||||
global.log = require('loglevel') |
|
||||||
|
|
||||||
module.exports = launchMetamaskUi |
|
||||||
|
|
||||||
|
|
||||||
log.setLevel(global.METAMASK_DEBUG ? 'debug' : 'warn') |
|
||||||
|
|
||||||
function launchMetamaskUi (opts, cb) { |
|
||||||
var accountManager = opts.accountManager |
|
||||||
actions._setBackgroundConnection(accountManager) |
|
||||||
// check if we are unlocked first
|
|
||||||
accountManager.getState(function (err, metamaskState) { |
|
||||||
if (err) return cb(err) |
|
||||||
const store = startApp(metamaskState, accountManager, opts) |
|
||||||
cb(null, store) |
|
||||||
}) |
|
||||||
} |
|
||||||
|
|
||||||
function startApp (metamaskState, accountManager, opts) { |
|
||||||
// parse opts
|
|
||||||
const store = configureStore({ |
|
||||||
|
|
||||||
// metamaskState represents the cross-tab state
|
|
||||||
metamask: metamaskState, |
|
||||||
|
|
||||||
// appState represents the current tab's popup state
|
|
||||||
appState: {}, |
|
||||||
|
|
||||||
// Which blockchain we are using:
|
|
||||||
networkVersion: opts.networkVersion, |
|
||||||
}) |
|
||||||
|
|
||||||
// if unconfirmed txs, start on txConf page
|
|
||||||
const unapprovedTxsAll = txHelper(metamaskState.unapprovedTxs, metamaskState.unapprovedMsgs, metamaskState.unapprovedPersonalMsgs, metamaskState.unapprovedTypedMessages, metamaskState.network) |
|
||||||
if (unapprovedTxsAll.length > 0) { |
|
||||||
store.dispatch(actions.showConfTxPage()) |
|
||||||
} |
|
||||||
|
|
||||||
accountManager.on('update', function (metamaskState) { |
|
||||||
store.dispatch(actions.updateMetamaskState(metamaskState)) |
|
||||||
}) |
|
||||||
|
|
||||||
// start app
|
|
||||||
render( |
|
||||||
h(Root, { |
|
||||||
// inject initial state
|
|
||||||
store: store, |
|
||||||
} |
|
||||||
), opts.container) |
|
||||||
|
|
||||||
return store |
|
||||||
} |
|
Loading…
Reference in new issue