1
0
mirror of https://github.com/kremalicious/metamask-extension.git synced 2024-12-23 09:52:26 +01:00
metamask-extension/ui/app/actions.js
Dan Finlay d8bee4f599 Make default providers more easiliy configurable for metamask devs
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.
2016-05-10 15:37:13 -07:00

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,
}
}