mirror of
https://github.com/kremalicious/metamask-extension.git
synced 2024-12-23 09:52:26 +01:00
d8bee4f599
No longer do our `mainnet` and `testnet` buttons set specific RPC urls. Now they set `provider.type`, which gets interpreted with code. Currently the provider types of `mainnet` and `testnet` point to our new scalable backends, but these could be re-interpreted to use any other provider, be it etherscan, peer to peer, or otherwise. Makes it easier for us to upgrade our infrastructure without incorporating migration logic into the program.
451 lines
9.4 KiB
JavaScript
451 lines
9.4 KiB
JavaScript
var actions = {
|
|
GO_HOME: 'GO_HOME',
|
|
goHome: goHome,
|
|
// remote state
|
|
UPDATE_METAMASK_STATE: 'UPDATE_METAMASK_STATE',
|
|
updateMetamaskState: updateMetamaskState,
|
|
// intialize screen
|
|
CREATE_NEW_VAULT_IN_PROGRESS: 'CREATE_NEW_VAULT_IN_PROGRESS',
|
|
SHOW_CREATE_VAULT: 'SHOW_CREATE_VAULT',
|
|
SHOW_RESTORE_VAULT: 'SHOW_RESTORE_VAULT',
|
|
SHOW_INIT_MENU: 'SHOW_INIT_MENU',
|
|
SHOW_NEW_VAULT_SEED: 'SHOW_NEW_VAULT_SEED',
|
|
SHOW_INFO_PAGE: 'SHOW_INFO_PAGE',
|
|
RECOVER_FROM_SEED: 'RECOVER_FROM_SEED',
|
|
CLEAR_SEED_WORD_CACHE: 'CLEAR_SEED_WORD_CACHE',
|
|
clearSeedWordCache: clearSeedWordCache,
|
|
recoverFromSeed: recoverFromSeed,
|
|
unlockMetamask: unlockMetamask,
|
|
unlockFailed: unlockFailed,
|
|
showCreateVault: showCreateVault,
|
|
showRestoreVault: showRestoreVault,
|
|
showInitializeMenu: showInitializeMenu,
|
|
createNewVault: createNewVault,
|
|
createNewVaultInProgress: createNewVaultInProgress,
|
|
showNewVaultSeed: showNewVaultSeed,
|
|
showInfoPage: showInfoPage,
|
|
// unlock screen
|
|
UNLOCK_IN_PROGRESS: 'UNLOCK_IN_PROGRESS',
|
|
UNLOCK_FAILED: 'UNLOCK_FAILED',
|
|
UNLOCK_METAMASK: 'UNLOCK_METAMASK',
|
|
LOCK_METAMASK: 'LOCK_METAMASK',
|
|
tryUnlockMetamask: tryUnlockMetamask,
|
|
lockMetamask: lockMetamask,
|
|
unlockInProgress: unlockInProgress,
|
|
// error handling
|
|
displayWarning: displayWarning,
|
|
DISPLAY_WARNING: 'DISPLAY_WARNING',
|
|
HIDE_WARNING: 'HIDE_WARNING',
|
|
hideWarning: hideWarning,
|
|
// accounts screen
|
|
SET_SELECTED_ACCOUNT: 'SET_SELECTED_ACCOUNT',
|
|
SHOW_ACCOUNT_DETAIL: 'SHOW_ACCOUNT_DETAIL',
|
|
SHOW_ACCOUNTS_PAGE: 'SHOW_ACCOUNTS_PAGE',
|
|
SHOW_CONF_TX_PAGE: 'SHOW_CONF_TX_PAGE',
|
|
SHOW_CONF_MSG_PAGE: 'SHOW_CONF_MSG_PAGE',
|
|
// account detail screen
|
|
SHOW_SEND_PAGE: 'SHOW_SEND_PAGE',
|
|
showSendPage: showSendPage,
|
|
REQUEST_ACCOUNT_EXPORT: 'REQUEST_ACCOUNT_EXPORT',
|
|
requestExportAccount: requestExportAccount,
|
|
EXPORT_ACCOUNT: 'EXPORT_ACCOUNT',
|
|
exportAccount: exportAccount,
|
|
SHOW_PRIVATE_KEY: 'SHOW_PRIVATE_KEY',
|
|
showPrivateKey: showPrivateKey,
|
|
// tx conf screen
|
|
COMPLETED_TX: 'COMPLETED_TX',
|
|
TRANSACTION_ERROR: 'TRANSACTION_ERROR',
|
|
NEXT_TX: 'NEXT_TX',
|
|
PREVIOUS_TX: 'PREV_TX',
|
|
setSelectedAddress: setSelectedAddress,
|
|
signMsg: signMsg,
|
|
cancelMsg: cancelMsg,
|
|
sendTx: sendTx,
|
|
signTx: signTx,
|
|
cancelTx: cancelTx,
|
|
completedTx: completedTx,
|
|
txError: txError,
|
|
nextTx: nextTx,
|
|
previousTx: previousTx,
|
|
// app messages
|
|
showAccountDetail: showAccountDetail,
|
|
BACK_TO_ACCOUNT_DETAIL: 'BACK_TO_ACCOUNT_DETAIL',
|
|
backToAccountDetail: backToAccountDetail,
|
|
showAccountsPage: showAccountsPage,
|
|
showConfTxPage: showConfTxPage,
|
|
confirmSeedWords: confirmSeedWords,
|
|
// config screen
|
|
SHOW_CONFIG_PAGE: 'SHOW_CONFIG_PAGE',
|
|
SET_RPC_TARGET: 'SET_RPC_TARGET',
|
|
SET_PROVIDER_TYPE: 'SET_PROVIDER_TYPE',
|
|
USE_ETHERSCAN_PROVIDER: 'USE_ETHERSCAN_PROVIDER',
|
|
useEtherscanProvider: useEtherscanProvider,
|
|
showConfigPage: showConfigPage,
|
|
setRpcTarget: setRpcTarget,
|
|
setProviderType: setProviderType,
|
|
// hacky - need a way to get a reference to account manager
|
|
_setAccountManager: _setAccountManager,
|
|
// loading overlay
|
|
SHOW_LOADING: 'SHOW_LOADING_INDICATION',
|
|
HIDE_LOADING: 'HIDE_LOADING_INDICATION',
|
|
showLoadingIndication: showLoadingIndication,
|
|
hideLoadingIndication: hideLoadingIndication,
|
|
}
|
|
|
|
module.exports = actions
|
|
|
|
var _accountManager = null
|
|
function _setAccountManager(accountManager){
|
|
_accountManager = accountManager
|
|
}
|
|
|
|
function goHome() {
|
|
return {
|
|
type: this.GO_HOME,
|
|
}
|
|
}
|
|
|
|
// async actions
|
|
|
|
function tryUnlockMetamask(password) {
|
|
return (dispatch) => {
|
|
dispatch(this.unlockInProgress())
|
|
_accountManager.submitPassword(password, (err, selectedAccount) => {
|
|
if (err) {
|
|
dispatch(this.unlockFailed())
|
|
} else {
|
|
dispatch(this.unlockMetamask())
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
function createNewVault(password, entropy) {
|
|
return (dispatch) => {
|
|
dispatch(this.createNewVaultInProgress())
|
|
_accountManager.createNewVault(password, entropy, (err, result) => {
|
|
dispatch(this.showNewVaultSeed(result))
|
|
})
|
|
}
|
|
}
|
|
|
|
function recoverFromSeed(password, seed) {
|
|
return (dispatch) => {
|
|
// dispatch(this.createNewVaultInProgress())
|
|
dispatch(this.showLoadingIndication())
|
|
_accountManager.recoverFromSeed(password, seed, (err, selectedAccount) => {
|
|
dispatch(this.hideLoadingIndication())
|
|
if (err) return dispatch(this.displayWarning(err.message))
|
|
|
|
dispatch(this.goHome())
|
|
dispatch(this.unlockMetamask())
|
|
})
|
|
}
|
|
}
|
|
|
|
function showInfoPage() {
|
|
return {
|
|
type: this.SHOW_INFO_PAGE,
|
|
}
|
|
}
|
|
|
|
function setSelectedAddress(address) {
|
|
return (dispatch) => {
|
|
_accountManager.setSelectedAddress(address)
|
|
}
|
|
}
|
|
|
|
function signMsg(msgData) {
|
|
return (dispatch) => {
|
|
dispatch(this.showLoadingIndication())
|
|
|
|
_accountManager.signMessage(msgData, (err) => {
|
|
dispatch(this.hideLoadingIndication())
|
|
|
|
if (err) return dispatch(this.displayWarning(err.message))
|
|
dispatch(this.completedTx(msgData.metamaskId))
|
|
})
|
|
}
|
|
}
|
|
|
|
function signTx(txData) {
|
|
return (dispatch) => {
|
|
dispatch(this.showLoadingIndication())
|
|
|
|
web3.eth.sendTransaction(txData, (err, data) => {
|
|
dispatch(this.hideLoadingIndication())
|
|
|
|
if (err) return dispatch(this.displayWarning(err.message))
|
|
dispatch(this.hideWarning())
|
|
dispatch(this.goHome())
|
|
})
|
|
}
|
|
}
|
|
|
|
function sendTx(txData) {
|
|
return (dispatch) => {
|
|
_accountManager.approveTransaction(txData.id, (err) => {
|
|
if (err) {
|
|
alert(err.message)
|
|
dispatch(this.txError(err))
|
|
return console.error(err.message)
|
|
}
|
|
dispatch(this.completedTx(txData.id))
|
|
})
|
|
}
|
|
}
|
|
|
|
function completedTx(id) {
|
|
return {
|
|
type: this.COMPLETED_TX,
|
|
id,
|
|
}
|
|
}
|
|
|
|
function txError(err) {
|
|
return {
|
|
type: this.TRANSACTION_ERROR,
|
|
message: err.message,
|
|
}
|
|
}
|
|
|
|
function cancelMsg(msgData){
|
|
_accountManager.cancelMessage(msgData.id)
|
|
return this.completedTx(msgData.id)
|
|
}
|
|
|
|
function cancelTx(txData){
|
|
_accountManager.cancelTransaction(txData.id)
|
|
return this.completedTx(txData.id)
|
|
}
|
|
|
|
//
|
|
// initialize screen
|
|
//
|
|
|
|
|
|
function showCreateVault() {
|
|
return {
|
|
type: this.SHOW_CREATE_VAULT,
|
|
}
|
|
}
|
|
|
|
function showRestoreVault() {
|
|
return {
|
|
type: this.SHOW_RESTORE_VAULT,
|
|
}
|
|
}
|
|
|
|
function showInitializeMenu() {
|
|
return {
|
|
type: this.SHOW_INIT_MENU,
|
|
}
|
|
}
|
|
|
|
function createNewVaultInProgress() {
|
|
return {
|
|
type: this.CREATE_NEW_VAULT_IN_PROGRESS,
|
|
}
|
|
}
|
|
|
|
function showNewVaultSeed(seed) {
|
|
return {
|
|
type: this.SHOW_NEW_VAULT_SEED,
|
|
value: seed,
|
|
}
|
|
}
|
|
|
|
//
|
|
// unlock screen
|
|
//
|
|
|
|
function unlockInProgress() {
|
|
return {
|
|
type: this.UNLOCK_IN_PROGRESS,
|
|
}
|
|
}
|
|
|
|
function unlockFailed() {
|
|
return {
|
|
type: this.UNLOCK_FAILED,
|
|
}
|
|
}
|
|
|
|
function unlockMetamask() {
|
|
return {
|
|
type: this.UNLOCK_METAMASK,
|
|
}
|
|
}
|
|
|
|
function updateMetamaskState(newState) {
|
|
return {
|
|
type: this.UPDATE_METAMASK_STATE,
|
|
value: newState,
|
|
}
|
|
}
|
|
|
|
function lockMetamask() {
|
|
return (dispatch) => {
|
|
_accountManager.setLocked((err) => {
|
|
dispatch({
|
|
type: this.LOCK_METAMASK,
|
|
})
|
|
dispatch(this.hideLoadingIndication())
|
|
})
|
|
}
|
|
}
|
|
|
|
function showAccountDetail(address) {
|
|
return (dispatch) => {
|
|
_accountManager.setSelectedAddress(address)
|
|
|
|
dispatch({
|
|
type: this.SHOW_ACCOUNT_DETAIL,
|
|
value: address,
|
|
})
|
|
}
|
|
}
|
|
|
|
function backToAccountDetail(address) {
|
|
return {
|
|
type: this.BACK_TO_ACCOUNT_DETAIL,
|
|
value: address,
|
|
}
|
|
}
|
|
function clearSeedWordCache() {
|
|
return {
|
|
type: this.CLEAR_SEED_WORD_CACHE
|
|
}
|
|
}
|
|
|
|
function confirmSeedWords() {
|
|
return (dispatch) => {
|
|
dispatch(this.showLoadingIndication())
|
|
_accountManager.clearSeedWordCache((err, accounts) => {
|
|
dispatch(this.clearSeedWordCache())
|
|
console.log('Seed word cache cleared.')
|
|
dispatch(this.showAccountDetail(accounts[0].address))
|
|
})
|
|
}
|
|
}
|
|
|
|
function showAccountsPage() {
|
|
return {
|
|
type: this.SHOW_ACCOUNTS_PAGE,
|
|
}
|
|
}
|
|
|
|
function showConfTxPage() {
|
|
return {
|
|
type: this.SHOW_CONF_TX_PAGE,
|
|
}
|
|
}
|
|
|
|
function nextTx() {
|
|
return {
|
|
type: this.NEXT_TX,
|
|
}
|
|
}
|
|
|
|
function previousTx() {
|
|
return {
|
|
type: this.PREVIOUS_TX,
|
|
}
|
|
}
|
|
|
|
function showConfigPage() {
|
|
return {
|
|
type: this.SHOW_CONFIG_PAGE,
|
|
}
|
|
}
|
|
|
|
//
|
|
// config
|
|
//
|
|
|
|
function setRpcTarget(newRpc) {
|
|
_accountManager.setRpcTarget(newRpc)
|
|
return {
|
|
type: this.SET_RPC_TARGET,
|
|
value: newRpc,
|
|
}
|
|
}
|
|
|
|
function setProviderType(type) {
|
|
_accountManager.setProviderType(type)
|
|
return {
|
|
type: this.SET_PROVIDER_TYPE,
|
|
value: type,
|
|
}
|
|
}
|
|
|
|
function useEtherscanProvider() {
|
|
_accountManager.useEtherscanProvider()
|
|
return {
|
|
type: this.USE_ETHERSCAN_PROVIDER,
|
|
}
|
|
}
|
|
|
|
function showLoadingIndication() {
|
|
return {
|
|
type: this.SHOW_LOADING,
|
|
}
|
|
}
|
|
|
|
function hideLoadingIndication() {
|
|
return {
|
|
type: this.HIDE_LOADING,
|
|
}
|
|
}
|
|
|
|
function displayWarning(text) {
|
|
return {
|
|
type: this.DISPLAY_WARNING,
|
|
value: text,
|
|
}
|
|
}
|
|
|
|
function hideWarning() {
|
|
return {
|
|
type: this.HIDE_WARNING,
|
|
}
|
|
}
|
|
|
|
function requestExportAccount() {
|
|
return {
|
|
type: this.REQUEST_ACCOUNT_EXPORT,
|
|
}
|
|
}
|
|
|
|
function exportAccount(address) {
|
|
var self = this
|
|
|
|
return function(dispatch) {
|
|
dispatch(self.showLoadingIndication())
|
|
|
|
_accountManager.exportAccount(address, function(err, result) {
|
|
dispatch(self.hideLoadingIndication())
|
|
|
|
if (err) {
|
|
console.error(err)
|
|
return dispatch(self.displayWarning('Had a problem exporting the account.'))
|
|
}
|
|
|
|
dispatch(self.showPrivateKey(result))
|
|
})
|
|
}
|
|
}
|
|
|
|
function showPrivateKey(key) {
|
|
return {
|
|
type: this.SHOW_PRIVATE_KEY,
|
|
value: key,
|
|
}
|
|
}
|
|
|
|
function showSendPage() {
|
|
return {
|
|
type: this.SHOW_SEND_PAGE,
|
|
}
|
|
}
|