aboutsummaryrefslogblamecommitdiffstats
path: root/ui/app/selectors.js
blob: 1b01002974d5f19df603da2e91925722ee8752dc (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
                                               




                                         
 



                                



                      
                   
                               
                       

                         

                                     
                  
                 
                 
              
                     

                             
                           
                  
                      
                        
                          



                          
                                     
                                                                                                   



                        
                                      





                                                   
                                     



                                                   

 



                                                                                           
                                             
 
                                           

 
                                               
                                                                    
                                                     

                                            

 


                                                                    

 
                                         


                                      



                                   



















                                                                                      










































                                                                                               
 



                                    



                                        


                                 
 



                                   



                                      


                                       












                                                                       






                                                        













                                                                                     
 
                                               



                                             
                            
 











                                                                                              
const abi = require('human-standard-token-abi')
import { createSelector } from 'reselect'

import {
  transactionsSelector,
} from './selectors/transactions'

const {
  multiplyCurrencies,
} = require('./conversion-util')

const selectors = {
  getSelectedAddress,
  getSelectedIdentity,
  getSelectedAccount,
  getSelectedToken,
  getSelectedTokenExchangeRate,
  getTokenExchangeRate,
  conversionRateSelector,
  transactionsSelector,
  accountsWithSendEtherInfoSelector,
  getCurrentAccountWithSendEtherInfo,
  getGasIsLoading,
  getForceGasMin,
  getAddressBook,
  getSendFrom,
  getCurrentCurrency,
  getSendAmount,
  getSelectedTokenToFiatRate,
  getSelectedTokenContract,
  autoAddToBetaUI,
  getSendMaxModeState,
  getCurrentViewContext,
  getTotalUnapprovedCount,
}

module.exports = selectors

function getSelectedAddress (state) {
  const selectedAddress = state.metamask.selectedAddress || Object.keys(state.metamask.accounts)[0]

  return selectedAddress
}

function getSelectedIdentity (state) {
  const selectedAddress = getSelectedAddress(state)
  const identities = state.metamask.identities

  return identities[selectedAddress]
}

function getSelectedAccount (state) {
  const accounts = state.metamask.accounts
  const selectedAddress = getSelectedAddress(state)

  return accounts[selectedAddress]
}

function getSelectedToken (state) {
  const tokens = state.metamask.tokens || []
  const selectedTokenAddress = state.metamask.selectedTokenAddress
  const selectedToken = tokens.filter(({ address }) => address === selectedTokenAddress)[0]
  const sendToken = state.metamask.send.token

  return selectedToken || sendToken || null
}

function getSelectedTokenExchangeRate (state) {
  const contractExchangeRates = state.metamask.contractExchangeRates
  const selectedToken = getSelectedToken(state) || {}
  const { address } = selectedToken
  return contractExchangeRates[address] || 0
}

function getTokenExchangeRate (state, address) {
  const contractExchangeRates = state.metamask.contractExchangeRates
  return contractExchangeRates[address] || 0
}

function conversionRateSelector (state) {
  return state.metamask.conversionRate
}

function getAddressBook (state) {
  return state.metamask.addressBook
}

function accountsWithSendEtherInfoSelector (state) {
  const {
    accounts,
    identities,
  } = state.metamask

  const accountsWithSendEtherInfo = Object.entries(accounts).map(([key, account]) => {
    return Object.assign({}, account, identities[key])
  })

  return accountsWithSendEtherInfo
}

function getCurrentAccountWithSendEtherInfo (state) {
  const currentAddress = getSelectedAddress(state)
  const accounts = accountsWithSendEtherInfoSelector(state)

  return accounts.find(({ address }) => address === currentAddress)
}

// // function shapeShiftTxListSelector (state) {
// //   return state.metamask.shapeShiftTxList || []
// // }

// const transactionsSelector = createSelector(
//   selectedTokenAddressSelector,
//   unapprovedMsgsSelector,
//   shapeShiftTxListSelector,
//   selectedAddressTxListSelector,
//   (selectedTokenAddress, unapprovedMsgs = {}, shapeShiftTxList = [], transactions = []) => {
//     const unapprovedMsgsList = valuesFor(unapprovedMsgs)
//     const txsToRender = transactions.concat(unapprovedMsgsList, shapeShiftTxList)

//     return selectedTokenAddress
//       ? txsToRender
//         .filter(({ txParams }) => txParams && txParams.to === selectedTokenAddress)
//         .sort((a, b) => b.time - a.time)
//       : txsToRender
//         .sort((a, b) => b.time - a.time)
//   }
// )

// // function transactionsSelector (state) {
// //   const { selectedTokenAddress } = state.metamask
// //   const unapprovedMsgs = valuesFor(state.metamask.unapprovedMsgs)
// //   const shapeShiftTxList = shapeShiftTxListSelector(state)
// //   const transactions = state.metamask.selectedAddressTxList || []
// //   const txsToRender = transactions.concat(unapprovedMsgs, shapeShiftTxList)

// //   return selectedTokenAddress
// //     ? txsToRender
// //       .filter(({ txParams }) => txParams && txParams.to === selectedTokenAddress)
// //       .sort((a, b) => b.time - a.time)
// //     : txsToRender
// //       .sort((a, b) => b.time - a.time)
// // }

export const pendingTransactionsSelector = createSelector(
  transactionsSelector,
  transactions => {

  }
)

function getGasIsLoading (state) {
  return state.appState.gasIsLoading
}

function getForceGasMin (state) {
  return state.metamask.send.forceGasMin
}

function getSendFrom (state) {
  return state.metamask.send.from
}

function getSendAmount (state) {
  return state.metamask.send.amount
}

function getSendMaxModeState (state) {
  return state.metamask.send.maxModeOn
}

function getCurrentCurrency (state) {
  return state.metamask.currentCurrency
}

function getSelectedTokenToFiatRate (state) {
  const selectedTokenExchangeRate = getSelectedTokenExchangeRate(state)
  const conversionRate = conversionRateSelector(state)

  const tokenToFiatRate = multiplyCurrencies(
    conversionRate,
    selectedTokenExchangeRate,
    { toNumericBase: 'dec' }
  )

  return tokenToFiatRate
}

function getSelectedTokenContract (state) {
  const selectedToken = getSelectedToken(state)
  return selectedToken
    ? global.eth.contract(abi).at(selectedToken.address)
    : null
}

function autoAddToBetaUI (state) {
  const autoAddTransactionThreshold = 12
  const autoAddAccountsThreshold = 2
  const autoAddTokensThreshold = 1

  const numberOfTransactions = state.metamask.selectedAddressTxList.length
  const numberOfAccounts = Object.keys(state.metamask.accounts).length
  const numberOfTokensAdded = state.metamask.tokens.length

  const userPassesThreshold = (numberOfTransactions > autoAddTransactionThreshold) &&
    (numberOfAccounts > autoAddAccountsThreshold) &&
    (numberOfTokensAdded > autoAddTokensThreshold)
  const userIsNotInBeta = !state.metamask.featureFlags.betaUI

  return userIsNotInBeta && userPassesThreshold
}

function getCurrentViewContext (state) {
  const { currentView = {} } = state.appState
  return currentView.context
}

function getTotalUnapprovedCount ({ metamask }) {
  const {
    unapprovedTxs = {},
    unapprovedMsgCount,
    unapprovedPersonalMsgCount,
    unapprovedTypedMessagesCount,
  } = metamask

  return Object.keys(unapprovedTxs).length + unapprovedMsgCount + unapprovedPersonalMsgCount +
    unapprovedTypedMessagesCount
}